diff --git a/bash-5.1/builtins_rust/bind/src/lib.rs b/bash-5.1/builtins_rust/bind/src/lib.rs index 7dab6829b57959d4b70db6543fae08c3871deb2e..31ee26c5fd55ffad6938611bfc7d5a9f906c0f81 100644 --- a/bash-5.1/builtins_rust/bind/src/lib.rs +++ b/bash-5.1/builtins_rust/bind/src/lib.rs @@ -6,7 +6,7 @@ use libc::{c_char,c_int,strerror,free, c_void, strlen, size_t,}; use std::{ffi::{CString,CStr}}; use std::fs::File; use nix::errno::errno; -use rcommon::{r_builtin_usage,r_sh_chkwrite}; +use rcommon::{r_builtin_usage,r_sh_chkwrite,err_translate_fn,translate_fn}; use rcommon::{WordList, WordDesc, EX_USAGE, EXECUTION_SUCCESS, EXECUTION_FAILURE}; use rhelp::r_builtin_help; @@ -273,9 +273,9 @@ pub extern "C" fn r_bind_builtin(mut list:*mut WordList)->i32{ if (flags & MFLAG!()) != 0 && !map_name.is_null(){ kmap = rl_get_keymap_by_name(map_name); if kmap.is_null(){ - let c_str = CString::new("%s:invalid keymap name").unwrap(); //%s在c中为`%s': - let c_ptr = c_str.as_ptr(); - builtin_error(c_ptr,map_name); + let names = String::from("invaildmap"); + err_translate_fn(&names,map_name); + println!(); return_code = EXECUTION_FAILURE!(); if !saved_keymap.is_null(){ rl_set_keymap(saved_keymap); @@ -323,6 +323,7 @@ pub extern "C" fn r_bind_builtin(mut list:*mut WordList)->i32{ t = printable_filename(initfile,0); let c_str = CString::new("%s: cannot read: %s").unwrap(); let c_ptr = c_str.as_ptr(); + builtin_error(c_ptr,t,strerror(errno())); if t != initfile{ free(t as *mut c_void); @@ -437,23 +438,24 @@ extern "C" fn r_query_bindings(name:*mut c_char)->i32{ // let mut name_str:String; unsafe{ - let name_str = CStr::from_ptr(name).to_str().unwrap().to_owned(); - function = rl_named_function(name); if function.is_null(){ - let c_str = CString::new("%s: unknow function name").unwrap(); - builtin_error(c_str.as_ptr(),name); + let names = String::from("unknowdfunction"); + err_translate_fn(&names,name); + println!(); return EXECUTION_FAILURE!(); } keyseqs = rl_invoking_keyseqs(function); if keyseqs.is_null(){ - println!("{} is not bound to any keys.",name_str); + let names = String::from("bindnokeys"); + err_translate_fn(&names,name); + println!(); return EXECUTION_FAILURE!(); } - - print!("{} can be invoked via ",name_str); + let names = String::from("bindvia"); + translate_fn(&names,name); j = 0; let mut t:*mut c_char; t = *keyseqs; @@ -486,9 +488,9 @@ extern "C" fn r_unbind_command(name:*mut c_char)->i32{ unsafe{ function = rl_named_function(name); if function.is_null(){ - let c_str = CString::new("`%s':unknown function name").unwrap(); - - builtin_error(c_str.as_ptr(),name); + let names = String::from("unknowdfunction"); + err_translate_fn(&names,name); + println!(); return EXECUTION_FAILURE!(); } @@ -506,10 +508,11 @@ extern "C" fn r_unbind_keyseq(seq:*mut c_char)->i32{ unsafe{ kseq = xmalloc((2 * strlen(seq)) + 1) as *mut c_char; if rl_translate_keyseq(seq,kseq,&mut kslen) != 0{ + free(kseq as *mut c_void); - let c_str = CString::new("`%s': cannot unbind").unwrap(); - - builtin_error(c_str.as_ptr(), seq); + let names = String::from("unbindfaild"); + err_translate_fn(&names,seq); + println!(); return EXECUTION_FAILURE!(); } //可能存在错误 @@ -529,9 +532,9 @@ extern "C" fn r_unbind_keyseq(seq:*mut c_char)->i32{ an argument. */ if rl_bind_keyseq(seq,std::ptr::null_mut() as *mut rl_command_func_t) != 0{ free(kseq as *mut c_void); - let c_str = CString::new("`%s': cannot unbind").unwrap(); - let c_ptr = c_str.as_ptr(); - builtin_error(c_ptr, seq); + let names = String::from("unbindfaild"); + err_translate_fn(&names,seq); + println!(); return EXECUTION_FAILURE!(); } diff --git a/bash-5.1/builtins_rust/common/Cargo.toml b/bash-5.1/builtins_rust/common/Cargo.toml index 23d172e129d37bc56032f5da238e8aaaf155d543..ba8c751f878ff7fbdf6c2cb124694151cf31b0b0 100644 --- a/bash-5.1/builtins_rust/common/Cargo.toml +++ b/bash-5.1/builtins_rust/common/Cargo.toml @@ -9,6 +9,9 @@ edition = "2018" libc = "*" nix = "*" unic-langid = "*" +fluent = "*" +fluent-bundle = "*" +fluent-resmgr = "*" [lib] crate-type = ["staticlib","rlib"] diff --git a/bash-5.1/builtins_rust/common/src/lib.rs b/bash-5.1/builtins_rust/common/src/lib.rs index 00df53dce14d9a50924f13e919d51f9632f712c5..b6ad3c98df16b571415dbdebdf66cefe16ba5aee 100644 --- a/bash-5.1/builtins_rust/common/src/lib.rs +++ b/bash-5.1/builtins_rust/common/src/lib.rs @@ -12,6 +12,9 @@ include!(concat!("lib_readline_keymaps.rs")); include!(concat!("command.rs")); +use fluent_bundle::{FluentBundle, FluentResource, FluentValue, FluentArgs}; +use fluent_resmgr::resource_manager::ResourceManager; + //struct #[repr(C)] #[derive(Copy, Clone)] @@ -1773,3 +1776,48 @@ pub unsafe fn r_savestring(x:* const c_char)->* mut c_char libc::memset(str1 as *mut libc::c_void, 0, len); return libc::strcpy(str1 as *mut c_char ,x); } + + +pub unsafe fn err_translate_fn (command:&String , args1 : *mut libc::c_char) { + let mgr = ResourceManager::new("/usr/share/utshell/resources/{locale}/{res_id}".into()); + let resources = vec![ "message.ftl".into() ]; + let mut args = FluentArgs::new(); + if args1 != std::ptr::null_mut(){ + args.set("str1",format!("{:?}",CStr::from_ptr(args1).to_str().unwrap())); + } + + let bundle = mgr.get_bundle(get_local_str(), resources); + let mut value = bundle.get_message(command).unwrap(); + let mut pattern = value.value().expect("partern err"); + let mut errors = vec![]; + if args1 != std::ptr::null_mut(){ + let mut msg1 = bundle.format_pattern(&pattern, Some(&args), &mut errors); + eprint!("{msg1}"); + } + else { + let mut msg1 = bundle.format_pattern(&pattern, None, &mut errors); + eprint!("{msg1}"); + } +} + +pub unsafe fn translate_fn (command:&String , args1 : *mut libc::c_char) { + let mgr = ResourceManager::new("/usr/share/utshell/resources/{locale}/{res_id}".into()); + let resources = vec![ "message.ftl".into() ]; + let mut args = FluentArgs::new(); + if args1 != std::ptr::null_mut(){ + args.set("str1",format!("{:?}",CStr::from_ptr(args1).to_str().unwrap())); + } + + let bundle = mgr.get_bundle(get_local_str(), resources); + let mut value = bundle.get_message(command).unwrap(); + let mut pattern = value.value().expect("partern err"); + let mut errors = vec![]; + if args1 != std::ptr::null_mut(){ + let mut msg1 = bundle.format_pattern(&pattern, Some(&args), &mut errors); + print!("{msg1}"); + } + else { + let mut msg1 = bundle.format_pattern(&pattern, None, &mut errors); + print!("{msg1}"); + } +} \ No newline at end of file diff --git a/bash-5.1/builtins_rust/exit/src/lib.rs b/bash-5.1/builtins_rust/exit/src/lib.rs index 3734e5d395ee7ab45661b53f2c5997b42b67304e..dea448f484785ec1d1817ff5f728b9fb156f492f 100644 --- a/bash-5.1/builtins_rust/exit/src/lib.rs +++ b/bash-5.1/builtins_rust/exit/src/lib.rs @@ -5,9 +5,9 @@ extern crate nix; use libc::c_char; use std::ffi::CString; -use rjobs::{PROCESS, COMMAND, r_jobs_builtin, JLIST_STANDARD }; +use rjobs::{PROCESS, COMMAND, r_jobs_builtin, JLIST_STANDARD}; -use rcommon::{WordList, WordDesc, EX_USAGE, EXECUTION_SUCCESS, EXECUTION_FAILURE}; +use rcommon::{WordList, WordDesc, EX_USAGE, EXECUTION_SUCCESS, EXECUTION_FAILURE,err_translate_fn}; use rhelp::r_builtin_help; #[repr(C)] @@ -146,7 +146,10 @@ pub extern "C" fn r_exit_builtin(list:*mut WordList) -> i32{ if login_shell != 0 { // let str:*mut c_char = CString::new("logout\n").unwrap().into_raw(); // printToStderr(str); - eprintln!("logout"); + //eprintln!("logout"); + let names = String::from("logout"); + err_translate_fn(&names,std::ptr::null_mut()); + println!(); }else{ // let str:*mut c_char = CString::new("exit\n").unwrap().into_raw(); // printToStderr(str); @@ -172,9 +175,13 @@ pub extern "C" fn r_logout_builtin(list:*mut WordList)->i32{ } if login_shell == 0{ + let names = String::from("logout"); + err_translate_fn(&names,std::ptr::null_mut()); + println!(); let c_str = CString::new("not login shell: use `exit'").unwrap(); let c_ptr = c_str.as_ptr(); builtin_error(c_ptr); + return EXECUTION_FAILURE!(); }else{ return r_exit_or_logout(list) @@ -209,11 +216,16 @@ pub fn r_exit_or_logout(list:*mut WordList)->i32{ } if stopmsg == JOB_STATE::JSTOPPED as i32 { - eprintln!("There are stopped jobs. "); + let names = String::from("stoppedjobs"); + err_translate_fn(&names,std::ptr::null_mut()); + eprintln!(); } else if stopmsg == JOB_STATE::JRUNNING as i32{ // libc::fprintf(stream,CString::new("There are runing jobs.\n").unwrap().as_ptr()); - eprintln!("There are runing jobs."); + //eprintln!("There are runing jobs."); + let names = String::from("runjobs"); + err_translate_fn(&names,std::ptr::null_mut()); + eprintln!(); } if stopmsg == check_jobs_at_exit{ diff --git a/bash-5.1/builtins_rust/kill/src/intercdep.rs b/bash-5.1/builtins_rust/kill/src/intercdep.rs index 4b037c56c77be95c0025ed61526d5598ac545f7e..3e4b4e2894614b3b790796bb97eaae910b037736 100644 --- a/bash-5.1/builtins_rust/kill/src/intercdep.rs +++ b/bash-5.1/builtins_rust/kill/src/intercdep.rs @@ -1,4 +1,4 @@ -use rcommon::{r_builtin_usage,r_sh_invalidsig,r_sh_badpid,r_sh_badjob,r_get_job_spec,r_display_signal_list,WordList,WordDesc}; +use rcommon::{r_builtin_usage,r_sh_invalidsig,r_sh_badpid,r_sh_badjob,r_get_job_spec,r_display_signal_list,WordList,WordDesc,err_translate_fn}; use rhelp::r_builtin_help; // #[repr(C)] // #[derive(Copy, Clone)] diff --git a/bash-5.1/builtins_rust/kill/src/lib.rs b/bash-5.1/builtins_rust/kill/src/lib.rs index c6e8bf2f5137cf9d7955e870306fe13cbccf98ce..55ccb21ce1c0d414da2066c10747d8f0b55ba0e5 100644 --- a/bash-5.1/builtins_rust/kill/src/lib.rs +++ b/bash-5.1/builtins_rust/kill/src/lib.rs @@ -131,8 +131,10 @@ unsafe { } } else if *((*((*list).word)).word) != 0 && *((*((*list).word)).word) != b'%' as c_char { - let c_err = CString::new("%s: arguments must be process or job IDs").unwrap(); - builtin_error(c_err.as_ptr(), (*((*list).word)).word); + eprint!("utshell : kill :"); + let names = String::from("killargerr"); + err_translate_fn(&names,(*((*list).word)).word); + println!(); list = (*list).next; continue; } else if *word != 0 { diff --git a/bash-5.1/builtins_rust/rlet/src/intercdep.rs b/bash-5.1/builtins_rust/rlet/src/intercdep.rs index 221190e1312888efee40947691bc3b458f589faa..f56273d89339b83c453dea5bc355a6a082c0e5fb 100644 --- a/bash-5.1/builtins_rust/rlet/src/intercdep.rs +++ b/bash-5.1/builtins_rust/rlet/src/intercdep.rs @@ -1,4 +1,4 @@ -use rcommon::{WordList}; +use rcommon::{WordList,err_translate_fn}; use rhelp::r_builtin_help; pub const EXECUTION_SUCCESS : c_int = 0; pub const EXECUTION_FAILURE : c_int = 1; diff --git a/bash-5.1/builtins_rust/rlet/src/lib.rs b/bash-5.1/builtins_rust/rlet/src/lib.rs index 5c126131c97936a6b73aa31a8d82029194c41875..588db67634f4eef32eed4ea7ffab4f3f8513a3ab 100644 --- a/bash-5.1/builtins_rust/rlet/src/lib.rs +++ b/bash-5.1/builtins_rust/rlet/src/lib.rs @@ -21,7 +21,9 @@ unsafe { } if list.is_null() { - builtin_error("expression expected\0".as_ptr() as *mut c_char); + let names = String::from("letwarn"); + err_translate_fn(&names,std::ptr::null_mut()); + println!(); return EXECUTION_FAILURE; } @@ -44,7 +46,9 @@ unsafe { let mut expok: c_int = 0; if list.is_null() { - builtin_error("expression expected\0".as_ptr() as *const c_char); + let names = String::from("letwarn"); + err_translate_fn(&names,std::ptr::null_mut()); + println!(); return EXECUTION_FAILURE; } diff --git a/bash-5.1/resources/en-US/message.ftl b/bash-5.1/resources/en-US/message.ftl index c7b1504a71afc59db6bce5567fd164db106d6244..6f1a201a98b0d3ea2f460ef928b84b779caefe45 100644 --- a/bash-5.1/resources/en-US/message.ftl +++ b/bash-5.1/resources/en-US/message.ftl @@ -1794,4 +1794,15 @@ hashd = {$str1} is hashed {$str2} isfunction = {$str1} is a function iskeyword = {$str1} is a shell keyword isalias = {$str1} is aliased to {$str2} -isbuiltin = {$str1} is a shell builtin \ No newline at end of file +isbuiltin = {$str1} is a shell builtin +killargerr = {$str1} : arguments must be process or job IDs +letwarn = utshell : let : expression expected +bindvia = {$str1} can be invoked via +bindnokeys = {$str1} is not bound to any keys. +unknowdfunction = {$str1} : unknown function name +unbindfaild = {$str1} : cannot unbind +invaildmap = {$str1} : invalid keymap name +logout = logout +nologinsh = not login shell: use 'exit' +stoppedjobs = There are stopped jobs. +runjobs = There are running jobs. \ No newline at end of file diff --git a/bash-5.1/resources/zh-CN/message.ftl b/bash-5.1/resources/zh-CN/message.ftl index d237b3e3c105342e9920d8da840c4f6ff5f5ff17..90668d4e0bd462d495552ba1208b07639bbe1c80 100644 --- a/bash-5.1/resources/zh-CN/message.ftl +++ b/bash-5.1/resources/zh-CN/message.ftl @@ -1623,4 +1623,15 @@ hashd = {$str1} 已被录入哈希表 isfunction = {$str1}是函数 iskeyword = {$str1} 是 shell 关键字 isalias = {$str1} 是 {$str2} 的别名 -isbuiltin = {$str1} 是 shell 内建 \ No newline at end of file +isbuiltin = {$str1} 是 shell 内建 +killargerr = {$str1} : 参数必须是进程或任务 ID +letwarn = utshell : let : 需要表达式 +bindvia = {$str1} 可以被调用, 通过 +bindnokeys = {$str1}未与任何键绑定。 +unknowdfunction = {$str1} : 未知函数名 +unbindfaild = {$str1} : 无法解除绑定 +invaildmap = {$str1} : 无效的键映射名 +logout = 注销 +nologinsh = 不是登录 shell: 使用 'exit' +stoppedjobs = 有停止的任务 +runjobs = 有运行中的任务 diff --git a/bash-5.1/resources/zh-HK/message.ftl b/bash-5.1/resources/zh-HK/message.ftl index 08d62f6aa06844c6ed69be91121ba78399e4926b..15b71de31a7335b3631c539e2fb270943f7c96d1 100644 --- a/bash-5.1/resources/zh-HK/message.ftl +++ b/bash-5.1/resources/zh-HK/message.ftl @@ -1617,10 +1617,20 @@ information = 这些 shell 命令是内部定义的。请输入 `help' 以 helperr = 没有与{$name}匹配的帮助主题。尝试使用"help help"、"man -k {$name} 或 "info {$name}"。 -is = "{$str1} 是 {$str2}" -special = "{$str1} 是特殊 shell 内建" -hashd = "{$str1} 已被录入哈希表 " -isfunction = "{$str1}是函数 " -iskeyword = "{$str1} 是 shell 关键字" -isalias = "{$str1} 是 {$str2} 的别名" -isbuiltin = "{$str1} 是 shell 内建" \ No newline at end of file +is = {$str1} 是 {$str2} +special = {$str1} 是特殊 shell 内建 +hashd = {$str1} 已被录入哈希表 +isfunction = {$str1}是函数 +iskeyword = {$str1} 是 shell 关键字 +isalias = {$str1} 是 {$str2} 的别名 +isbuiltin = {$str1} 是 shell 内建 +killargerr = {$str1} : 参数必须是进程或任务 ID +letwarn = utshell : let : 需要表达式 +bindvia = 可以被调用, 通过 {$str1} +bindnokeys = {$str1}未与任何键绑定。 +unknowdfunction = {$str1} : 未知函数名 +unbindfaild = {$str1} : 无法解除绑定 +invaildmap = {$str1} : 无效的键映射名 +logout = 注销 +stoppedjobs = 有停止的任务 +runjobs = 有运行中的任务 \ No newline at end of file diff --git a/record.txt b/record.txt index 40ca3bc7378956eddcd433916e77330c33c14f84..a7fa9ff595bd543165cd55994fde2c6df24de01f 100644 --- a/record.txt +++ b/record.txt @@ -113,3 +113,4 @@ 112 113 114 +115