本地化(多语言)

浏览数 99790
YiluPHP支持多语言,实现不同国家的用户本地化访问,默认为简体中文。框架所需的语言包存放在项目下的sysytem/lang目录中,有cn.php和en.php两个语言包文件,不可修改。开发者的语言包存放在项目下的lang目录里,默认也有cn.php和en.php两个语言包文件,这是示例,你可以把里面的内容清空。
你可以增加自己的语言种类,语言包文件名全部使用小写字母,语言包文件是一个PHP文件,需要返回一个一维数组,数组的键名也就是语言的键名,键值是语言文本。例如:
//中文语言包内容
return [
    'yiluphp_name' => '一路PHP',
    'welcome_to_the_yiluphp' => '欢迎使用YiluPHP框架!',
];

//英文语言包内容
return [
    'yiluphp_name' => 'YiluPHP',
    'welcome_to_the_yiluphp' => 'Welcome to the yiluphp framework!',
];

默认语言的配置
在config中设置lang的值为语言包的文件名即可,当用户没有主动选择语言时使用的就是默认语言。
语言翻译中的参数占位符
使用一对花括号包含住字段名,并且前半个花括号后面有一个$符号,不要有空格,建议字段名只使用字母、数字和下划线,如果 {$field}、{$name}、{$place}。
语言翻译中的单数和复数
单数就是一个,复数就是两个或者两个以上,在英语中有些单词的单数和复数是不一样的,例如minute表示一分钟,minutes表示多分钟,child表示一个小孩,children显示多个小孩。YiluPHP的语言包中支持单复数的区分显示。你只需要使用   <--singular单数显示的内容-->   把单数时显示的文本包含越来,使用   <--plural复数显示的内容-->   把复数时显示的文本包含越来,注意不管是单数显示的内容还是复数显示的内容,其中一定要包含字段名的占位符,这样才能知道是哪一个字段的单数和复数。

//中文语言包
return [
    'xxx_minutes_ago' => '{$number}分钟前',
];

//英语语言包
return [
    'xxx_minutes_ago' => '<--singular{$number} minute--><--plural{$number} minutes--> ago',
];
单数和复数的显示见以下『自动显示为用户的语言』。
切换语言
如果系统需要使用多语言的切换,需要在页面的UI中提供可选择的按钮,用户选择一个语言后,需要以POST或GET的方法传递一个名为lang的参数给服务器端,参数的值为语言类型,即语言包的文件名,服务器会把用户选择的语言写在cookie中,同时会设置全局配置$config['lang']的值为当前语言的值,这样切换语言就完成。以后的请求不再需要传lang参数给服务器端,服务器端会根据cookie中的lang值设置$config['lang']的值,显示文本时就会根据$config['lang']的值来判断需要使用哪一种语言。
自动显示为用户的语言
调用   echo $app->lang('语言键名', [替换字段]);   方法输出文本时就能自动显示为用户的语言,第一个参数是语言键名,必选参数,字符串类型,第二个参数是需要替换的占位符及其值,可选参数,数组类型。

echo $app->lang('welcome_to_the_yiluphp');
带参数的显示,一条翻译中可以设置多个参数占位符。
echo $app->lang('xxx_user_blog_title', ['name'=>'Jim']);
单数和复数的显示,第二个参数为多维数组,需要显示单复数的字段的值必须是一个数组,并且把数值设置给键名为value的值。
//单数
echo $app->lang('xxx_minutes_ago', ['number'=>['value'=>1]]);
//复数
echo $app->lang('xxx_minutes_ago', ['number'=>['value'=>2]]);

JavaScript中显示多语言
JS的语言包存放在项目下的 static/js/language/ 目录下,以全小写语言名称为文件的JS文件,框架自带了两个示例文件:static/js/language/cn.js 和 static/js/language/en.js,语言包中申明了一个名为 language 的全局变量,它的值是一个JSON,包含了语言键名及其翻译文本。
//static/js/language/cn.js
var language = {
    cancel: "取消",
    close: "关闭",
    notice: "提示",
    please_input_xxx: "请填写{$field}",
    sure: "确定",
    title: "标题",
    wrong_xxx_inputted: "{$field}填写不正确",
    xxx_length_limit: "{$field}的长度应该是{$length}个字",
    xxx_minutes_ago: "{$number}分钟前"
};

//static/js/language/en.js
var language = {
    cancel: "Cancel",
    close: "Close",
    notice: "Notice",
    please_input_xxx: "Please input the {$field}",
    sure: "Sure",
    title: "Title",
    wrong_xxx_inputted: "Wrong {$field} inputted",
    xxx_length_limit: "The length of the {$field} should be {$length} characters",
    xxx_minutes_ago: "<--singular{$number} minute--><--plural{$number} minutes--> ago",
};

语言包的使用
1、前端根据当前的语言在页面中引入相应的JS文件;
2、框架提供了一个输出语言的全局函数 getLang(key, param),在static/js/base.js文件中,它有两个参数,第一个参数是语言键名,必选,字符串类型,第二个参数为变量名及其替换值,可选,JSON类型。我们可以看到,和PHP中输出语言的翻译一样,支持设置变量和单复数的区分,当需求区分单复数时,其值为JSON,包含键名为value,键值为变量的值。

//假设当前语言为中文
//输出:取消
getLang("cancel");

//输出:标题输入不正确
getLang("please_input_xxx", {field:"标题"});
//可以在参数中嵌套翻译函数,下面的输出和上面的效果一样,但彻底不用写死文本
getLang(
      "please_input_xxx", 
      {
            field:getLang("title")
      }
);

//输出:1分钟前
getLang("xxx_minutes_ago", {number:{value:1}});
//输出:2分钟前
getLang("xxx_minutes_ago", {number:{value:2}});

//假设当前语言为英语
//输出:Cancel
getLang("cancel");

//输出:Please input the Title
getLang("please_input_xxx", {field:"Title"});
//可以在参数中嵌套翻译函数,下面的输出和上面的效果一样,但彻底不用写死文本
getLang(
      "please_input_xxx", 
      {
            field:getLang("title")
      }
);

//输出:1 minute ago
getLang("xxx_minutes_ago", {number:{value:1}});
//输出:2 minutes ago
getLang("xxx_minutes_ago", {number:{value:2}});


我来说说