您的位置:首页 > 编程语言 > PHP开发

yii2框架-i18n国际化(十二)

2016-06-15 14:58 609 查看
这一节主要是聊聊关于yii2框架的自带的国际化的i18n组件。根据不同的地区和语言,软件产品可以支持全方位信息翻译,视图翻译,日期和数字格式化,方便不同用户的使用。

一个 Yii 应用使用两种语言:yii\base\Application::$sourceLanguage 和 yii\base\Application::$language 。前者指的是写在代码中的语言,后者是向最终用户显示内容的语言。 而信息翻译服务主要是将文本消息从原语言翻译到目标语言。

简单的说,就是源语言作为键,值可以对应不同的目标语言。

可以用类似下面的应用程序配置来配置应用程序语言:

return [

    // 设置目标语言为俄语

    'language' => 'ru-RU',

    

    // 设置源语言为英语

    'sourceLanguage' => 'en-US',

       ......

];

默认的 yii\base\Application::$sourceLanguage 值是 en-US,即美国英语。 建议你保留此默认值不变,因为通常让人将英语翻译成其它语言要比将其它语言翻译成其它语言容易得多。

你经常需要根据不同的因素来动态地设置 yii\base\Application::$language ,如最终用户的语言首选项。 要在应用程序配置中配置它,你可以使用下面的语句来更改目标语言:

// 改变目标语言为中文

\Yii::$app->language = 'zh-CN';

(1)消息翻译

消息翻译服务用于将一条文本信息从一种语言(通常是 yii\base\Application::$sourceLanguage ) 翻译成另一种语言(通常是 yii\base\Application::$language)。 它的翻译原理是通过在语言文件中查找要翻译的信息以及翻译的结果。如果要翻译的信息可以在语言文件中找到,会返回相应的翻译结果; 否则会返回原始未翻译的信息。

为了使用消息翻译服务,需要做如下工作:

调用 Yii::t() 方法且在其中包含每一条要翻译的消息;

配置一个或多个消息来源,能在其中找得到要翻译的消息和翻译结果;

让译者翻译信息并将它们存储在消息来源。

这个 Yii::t() 方法的用法如下,

echo \Yii::t('app', 'This is a string to translate!');

通俗简单的说,Yii::t()的这个方法,通过调用i18n这个component,i18这个组件可以设置定义语言文件存放的basePath,fileMapl类映射文件等等

下面看一个例子

'components' => [

    // ...

    'i18n' => [

        'translations' => [

            'app*' => [

                'class' => 'yii\i18n\PhpMessageSource',

                //'basePath' => '@app/messages',

                //'sourceLanguage' => 'en-US',

                'fileMap' => [

                    'app' => 'app.php',

                    'app/error' => 'error.php',

                ],

            ],

        ],

    ],

],

app*是一个模式,Yii::t()的第一个参数,凡是以app开头的都将定义到该模式下,在该模式定义好的语言文件寻找对应的语言文件,同时这个路径位置由Yii::$app->language和'basePath' => '@app/messages',共同决定,所以一般需要在@app/messages下建立一个和language同名的文件夹,例如变成@app/messages/zh_CN。在zh_CN下可以建立语言文件。例如app_video.php,那么Yii::t('app_video','this name')时,就会直接找到@app/messages/zh_CN/app_video.php这个文件,'this
name' 对应的中文名称了。

同时对于fileMap这个映射文件数组,就是将Yii::t()对应的第一个参数的需要找的语言文件,映射至一个文件,例如Yii::t('app/error','hello'),如果配置好

'fileMap' => [

    'app/error' => 'error.php',

],

那么就会映射至@app/messages/zh_CN/error.php,如果没有配置的话,那么就会直接寻找

@app/messages/zh_CN/app/error.php,就需要在建立一个app文件夹了,这个在对于模块化设计时是非常有帮助的,比如app/video/info.php,不配置fileMap,那么在@app/messages/zh_CN建立一个app文件夹作为应用的语言文件夹,再在app下建立video文件夹,video就是在应用中的模块,这样子可以将各个模块的语言文件有序分离,方便开发和维护。

(2)消息格式化

在要翻译的消息里,你可以嵌入一些占位符,并让它们通过动态的参数值来代替。你甚至可以根据目标语言格式的参数值来使用特殊的占位符

在待翻译的消息,可以嵌入一个或多个占位符,以便它们可以由给定的参数值取代。通过给不同的参数值,可以动态地改变翻译内容的消息。 在下面的例子中,占位符 {username} 在 “Hello, {username}!” 中将分别被 'Alexander'和'Qiang' 所替换。

$username = 'Alexander';

// 输出:“Hello, Alexander”

echo \Yii::t('app', 'Hello, {username}!', [

    'username' => $username,

]);

$username = 'Qiang';

// 输出:“Hello, Qiang”

echo \Yii::t('app', 'Hello, {username}!', [

    'username' => $username,

]);

下面举个例子:

语言文件app.php:

return [
'id for {name} is {id}'=>'{name}的id是{id}',
];

那么在调用时:

$varlue = Yii::t('app','id for {name} is {id}',[
'name' =>'bingcool',
'id' =>11
]);

echo $varlue;

输出的结果:bingcool的id是11。所以name和id是动态的变量赋值。

上面这个例子叫做名称占位符。即每个占位符的格式为 {参数名称} ,你所提供的参数作为关联数组, 其中数组的键是参数名称(没有大括号),数组的值是对应的参数值。

下面说一下位置占位符

位置占位符是使用基于零的整数序列,在调用 Yii::t() 时会参数值根据它们出现位置的顺序分别进行替换。 在下面的例子中,位置占位符 {0},{1} 和 {2} 将分别被 $price,$count 和 $subtotal 所替换。

$price = 100;

$count = 2;

$subtotal = 200;

echo \Yii::t('app', 'Price: {0}, Count: {1}, Subtotal: {2}', $price, $count, $subtotal);

提示:大多数情况下你应该使用名称占位符。这是因为参数名称可以让翻译者更好的理解要被翻译的消息。

(3)格式化参数

你可以在消息的占位符指定附加格式的规则,这样的参数值可在替换占位符之前格式化它们。在下面的例子中, 价格参数值将视为一个数并格式化为货币值:

要求安装php_intl扩展

$price = 100;

echo \Yii::t('app', 'Price: {0, number, currency}', $price);

这一章节参考:
http://www.yiichina.com/doc/guide/2.0/tutorial-i18n
里面有具体说到关于数值和日期时间的各种格式化表示。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: