diff --git a/bash-5.1/builtins_rust/common/Cargo.toml b/bash-5.1/builtins_rust/common/Cargo.toml index a180848df16c907213f174d8b8b639b659d44cc3..374f067fa7a3dbe1753af1cb1e9385a325fa611b 100644 --- a/bash-5.1/builtins_rust/common/Cargo.toml +++ b/bash-5.1/builtins_rust/common/Cargo.toml @@ -8,8 +8,7 @@ edition = "2021" [dependencies] libc = "0.2" nix = "0.24" - - +unic-langid = "0.9.0" [lib] crate-type = ["staticlib","rlib"] name = "rcommon" diff --git a/bash-5.1/builtins_rust/common/src/lib.rs b/bash-5.1/builtins_rust/common/src/lib.rs index e01b6705d7f32b1349e8c6457e1130d6bddffe63..1e48063864edccc01012cb39dad7d68d6d0b07e6 100644 --- a/bash-5.1/builtins_rust/common/src/lib.rs +++ b/bash-5.1/builtins_rust/common/src/lib.rs @@ -6,7 +6,8 @@ use std::ffi::{CStr, CString}; use std::mem::size_of; use std::ptr::read_volatile; use nix::errno::errno; - +use std::env::var; +use unic_langid::LanguageIdentifier; include!(concat!("lib_readline_keymaps.rs")); include!(concat!("command.rs")); @@ -662,6 +663,7 @@ extern "C"{ fn builtin_help(); fn builtin_error(format:*const c_char,...); + } unsafe fn ISOPTION(s:* const c_char, c:c_char)->bool @@ -1730,7 +1732,7 @@ pub extern "C" fn r_builtin_bind_variable(name:*mut c_char,value:*mut c_char,fla /* Like check_unbind_variable, but for use by builtins (only matters for error messages). */ -pub extern "C" fn r_builtin_unbind_variable(vname:*const c_char)->i32{ + pub extern "C" fn r_builtin_unbind_variable(vname:*const c_char)->i32{ let v:*mut SHELL_VAR; unsafe{ @@ -1753,3 +1755,20 @@ pub extern "C" fn r_builtin_unbind_variable(vname:*const c_char)->i32{ } } +pub extern "C" fn get_local_str()-> Vec{ + + let lang : String; + match var("LANGUAGE") { + Ok(v) => lang = v , + Err(e) => + { + lang = String::from("en-US"); + println!("err is {e:?}") + }, + } + println!("now language is {:?}",lang); + //parse() 用于类型转换 + let langid : LanguageIdentifier = lang.parse().expect("wrong language"); + let locales = vec![langid.into()]; + return locales; + } \ No newline at end of file diff --git a/bash-5.1/builtins_rust/help/Cargo.toml b/bash-5.1/builtins_rust/help/Cargo.toml index 993d13e0d1533cd1e18757cb8589fb5f3952316e..1228246909ca100596ed04a5dc39014978b8690a 100644 --- a/bash-5.1/builtins_rust/help/Cargo.toml +++ b/bash-5.1/builtins_rust/help/Cargo.toml @@ -9,6 +9,9 @@ edition = "2018" libc = "0.2" nix = "0.24.1" rcommon = {path ="../common"} +fluent = "0.16.0" +fluent-bundle = "0.15.2" +fluent-resmgr = "0.0.5" [lib] crate-type = ["staticlib","rlib"] diff --git a/bash-5.1/builtins_rust/help/src/lib.rs b/bash-5.1/builtins_rust/help/src/lib.rs index 37ce387c6d3b529b16fb160e8fbc9f0056bfa39d..281fe0bc3d227cabebc447030810306bb9c810d9 100644 --- a/bash-5.1/builtins_rust/help/src/lib.rs +++ b/bash-5.1/builtins_rust/help/src/lib.rs @@ -3,8 +3,12 @@ extern crate nix; extern crate std; use libc::{c_char, c_void ,putchar, free}; use std::{ffi::{CString,CStr}, i32, io::{Read, stdout, Write}, mem, string, u32}; -use rcommon::{WordList, WordDesc, EX_USAGE, EXECUTION_SUCCESS, EXECUTION_FAILURE, EX_NOTFOUND, EX_NOEXEC, SUBSHELL_PAREN,r_builtin_usage}; +use rcommon::{WordList, WordDesc, EX_USAGE, EXECUTION_SUCCESS, + EXECUTION_FAILURE, EX_NOTFOUND, EX_NOEXEC, SUBSHELL_PAREN, + r_builtin_usage,get_local_str}; +use fluent_bundle::{FluentBundle, FluentResource, FluentValue, FluentArgs}; +use fluent_resmgr::resource_manager::ResourceManager; pub enum Option { None, Some(T), @@ -421,10 +425,12 @@ fn show_manpage (name : *mut c_char, i : i32){ let mut j :i32; let mut doc :*mut *mut libc::c_char; - let mut line :*mut libc::c_char = 0 as *mut libc::c_char;; + let mut line :*mut libc::c_char = 0 as *mut libc::c_char; let mut fd: i32; let mut usefile : bool; let builtin1 = unsafe{&(*((shell_builtins as usize + (i*BUILTIN_SIZEOF!()) as usize) as *mut builtin))}; + let mgr = ResourceManager::new("./resources/{locale}/{res_id}".into()); + let resources = vec![ "message.ftl".into()]; unsafe { doc = builtin1.long_doc; @@ -484,13 +490,16 @@ fn show_manpage (name : *mut c_char, i : i32){ /* DESCRIPTION */ println! ("DESCRIPTION\n"); if !usefile{ - let mut j = 0 ; - unsafe { - while (*((doc as usize + (8*j))as *mut *mut c_char)as *mut c_char) != std::ptr::null_mut() { - println! (" {:?}\n", unsafe{CStr::from_ptr(*((doc as usize + (8*j))as *mut *mut c_char)as *mut c_char)}); - j += 1; - } - } + let mut args = FluentArgs::new(); + let c_str: &CStr = unsafe { CStr::from_ptr(builtin1.name) }; + let msg: &str = c_str.to_str().unwrap(); + args.set("cmdName",msg); + let bundle = mgr.get_bundle(get_local_str(), resources); + let value = bundle.get_message("helplongdoc").unwrap(); + let pattern = value.value().expect("partern err"); + let mut errors = vec![]; + let msg1 = bundle.format_pattern(&pattern, Some(&args), &mut errors); + println!("{}", msg1); } else{ while doc != std::ptr::null_mut() && (((doc as usize + (8*j)))as * mut c_char) != std::ptr::null_mut() { @@ -665,3 +674,4 @@ unsafe { // } // len // } + diff --git a/record.txt b/record.txt index a7094e3da8f680ce4382ac38905d3ef0b65a4ac0..083df0cfdb3dfffbd04b7c1f95836c2bb90088eb 100644 --- a/record.txt +++ b/record.txt @@ -63,3 +63,4 @@ 62 63 64 +65