当前位置:K88软件开发文章中心网站服务器框架Yii 2.0 → 文章内容

国际化(Internationalization)

减小字体 增大字体 作者:佚名  来源:网上搜集  发布时间:2019-1-26 15:29:58

由  创建, 最后一次修改 2016-02-24 国际化国际化(I18N)是指在设计软件时,使它可以无需做大的改变就能够适应不同的语言和地区的需要。对于 Web 应用程序, 这有着特别重要的意义,因为潜在的用户可能会在全球范围内。 Yii 提供的国际化功能支持全方位信息翻译,视图翻译,日期和数字格式化。区域和语言区域设置是一组参数以定义用户希望能在他们的用户界面所看到用户的语言,国家和任何特殊的偏好。 它通常是由语言 ID 和区域 ID 组成。例如,ID “en-US” 代表英语和美国的语言环境。为了保持一致性, 在 Yii 应用程序中使用的所有区域 ID 应该规范化为?ll-CC,其中?ll?是根据两个或三个字母的小写字母语言代码?ISO-639?和?CC?是两个字母的国别代码?ISO-3166。 有关区域设置的更多细节可以看?ICU 项目文档。在 Yii中,我们经常用 “language” 来代表一个区域。一个 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';消息翻译消息翻译服务用于将一条文本信息从一种语言(通常是 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?应用组件?来实现翻译工作。这个组件可以在应用程序中按下面的代码来配置,'components' => [ // ... 'i18n' => [ 'translations' => [ 'app*' => [ 'class' => 'yii\i18n\PhpMessageSource', //'basePath' => '@app/messages', //'sourceLanguage' => 'en-US', 'fileMap' => [ 'app' => 'app.php', 'app/error' => 'error.php', ], ], ], ],],在上面的代码中,配置了由 yii\i18n\PhpMessageSource 所支持的消息来源。模式?app*?表示所有以?app?开头的消息类别名称都使用这个翻译的消息来源。该 yii\i18n\PhpMessageSource 类使用 PHP 文件来存储消息翻译。 每 PHP 文件对应单一类别的消息。默认情况下,文件名应该与类别名称相同。但是,你可以配置 yii\i18n\PhpMessageSource::fileMap 来映射一个类别到不同名称的 PHP 文件。在上面的例子中, 类别?app/error?被映射到PHP文件?@app/messages/ru-RU/error.php(假设?ru-RU?为目标语言)。如果没有此配置, 该类别将被映射到?@app/messages/ru-RU/app/error.php?。除了在PHP文件中存储消息来源,也可以使用下面的消息来源在不同的存储来存储翻译的消息:yii\i18n\GettextMessageSource 使用 GNU Gettext 的 MO 或 PO 文件保存翻译的消息。yii\i18n\DbMessageSource 使用一个数据库表来存储翻译的消息。消息格式化在要翻译的消息里,你可以嵌入一些占位符,并让它们通过动态的参数值来代替。你甚至可以根据目标语言格式的参数值来使用特殊的占位符。 在本节中,我们将介绍如何用不同的方式来格式化消息。消息参数在待翻译的消息,可以嵌入一个或多个占位符,以便它们可以由给定的参数值取代。通过给不同的参数值,可以动态地改变翻译内容的消息。 在下面的例子中,占位符?{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,]);当翻译的消息包含占位符时,应该让占位符保留原样。这是因为调用?Yii::t()?时,占位符将被实际参数值代替。你可以使用?名称占位符?或者?位置占位符,但不能两者都用在同一个消息里。前面的例子说明了如何使用名称占位符。即每个占位符的格式为?{参数名称}?,你所提供的参数作为关联数组, 其中数组的键是参数名称(没有大括号),数组的值是对应的参数值。位置占位符是使用基于零的整数序列,在调用?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);提示:大多数情况下你应该使用名称占位符。这是因为参数名称可以让翻译者更好的理解要被翻译的消息。格式化参数你可以在消息的占位符指定附加格式的规则,这样的参数值可在替换占位符之前格式化它们。在下面的例子中, 价格参数值将视为一个数并格式化为货币值:$price = 100;echo \Yii::t('app'

[1] [2] [3] [4]  下一页


国际化(Internationalization)