目录
1. 区域和语言
2. 翻译
信息翻译
文件翻译
3. 日期和时间格式化
4. 数字格式化
首页 后端开发 php教程 Yii框架官方指南系列增补版48——专题:国际化 (I18N)

Yii框架官方指南系列增补版48——专题:国际化 (I18N)

Feb 16, 2017 am 09:42 AM



国际化 (译者注:即 Internationalization,因为这个单词 I 和 n 之间有18个字母,因此常缩写为I18N) 是指设计一种应用软件的过程,这种软件无需做大的工程改变就能适应不同的语言和地区的需要。 对 Web 应用来说,国际化尤为重要,因为潜在的用户可能来自世界的各个角落。

Yii 在若干方面提供了对 I18N 的支持

  • 它为每种可能的语言和变量提供了本地化数据。

  • 它提了供信息和文件的翻译服务。

  • 它提供了基于本地化的日期和时间格式。

  • 它提供了基于本地话的数字格式。

在下面的小节中,我们将对以上几方面进行详细说明。

1. 区域和语言

区域是一系列参数,它定义了用户的语言、用户所在国家以及用户所有想要在他们的界面中看到的特殊参数。 它通常由一个包含了语言 ID 和区域 ID 的 ID 来识别。例如, ID en_US 表示英语区域和美国。 为保持一致性,Yii 中所有的区域 ID 被规范为小写的 语言 ID 或 语言 ID_地区 ID(例如 enen_us)。

区域数据由一个 CLocale 实例表示。它提供了基于区域的信息,包括货币符号,数字符号, 日期和时间格式以及日期相关的名称。由于语言信息已经由区域 ID 实现,因此 CLocale 不再提供。 同理,我们通常会变换地使用词语“区域”和“语言”。

通过一个区域 ID,就可以通过 CLocale::getInstance($localeID) 或者CApplication::getLocale($localeID) 获取相应的 CLocale 实例。

信息: Yii 包含几乎所有语言和区域的区域化数据。 这些数据来自于 Common Locale Data Repository(CLDR)。在每个区域中, 只提供了 CLDR 中的部分数据,因为原始的 CLDR 数据中包含了大量不太常用的信息。从版本 1.1.0 起, 用户也可以使用他们自定义的区域数据。只需要配置CApplication::localeDataPath 属性为包含了自定义区域数据的目录即可。 请参考位于framework/i18n/data 目录中的文件创建自定义的区域数据文件。

在一个 Yii 应用程序中,我们区分了它的 目标语言(target language) 和 源语言(source language)。目标语言是应用程序的目标用户的语言(区域), 而源语言是指写在应用程序源代码中的语言(区域)。国际化仅会在这两种语言不同的情况下发生。

你可以设定 应用配置 中的 目标语言 ,或者在发生国际化之前动态设定此参数。

提示: 有时候,我们想要设置目标语言为用户所使用的语言(就是在用户的浏览器选项中指定的那个)。 只需使用 CHttpRequest::preferredLanguage 就可以获取到用户设定的语言。

2. 翻译

在 I18N 中用到的最多的可能就是翻译了,包括 信息翻译 和 视图翻译。 前者将一条文本信息翻译为期望的语言,后者将整合文件翻译为期望的语言。

一个翻译请求包含要被翻译的对象,对象所用的源语言,和对象所需要翻译到的目标语言。 在 Yii 中,源语言默认为 应用程序源语言 而目标语言默认为 应用程序语言。 如果两者语言相同,翻译将不会发生。

信息翻译

信息翻译是通过调用 Yii::t() 实现的。此方法会将信息从 源语言 翻译为 目标语言。

当翻译一条信息时,必须指定它的分类(category),因为一条信息在不同的分类或上下文中可能会有 不同的翻译。分类 yii 被保留为仅限 Yii 框架核心使用。

信息可以包含参数占位符,它们将会在调用 Yii::t() 时被实际的参数值取代。 例如,下面的信息翻译请求将会替换原始信息中的 {alias} 占位符为实际的别名(alias) 值。


Yii::t('app', 'Path alias "{alias}" is redefined.',
    array('{alias}'=>$alias))
登录后复制

注意: 要翻译的信息必须是常量字符串。它们不能包含可能会改变信息内容的变量 (例如"Invalid {$message} content.")。如果一条信息需要通过一些参数改变,请使用 参数占位符。

翻译过的信息会存储在一个叫做 信息源(message source) 的库中。 信息源是一个 CMessageSource 或其子类的实例。当 Yii::t() 被调用时, 它将从信息源中查找相应的信息,如果找到了,就会返回翻译后的版本。

Yii 含有如下几种信息源。你也可以扩展 CMessageSource 创建自己的信息源类型。

  • CPhpMessageSource: 信息的翻译存储在一个 PHP 的 键值对 数组中。 原始信息为键,翻译后的信息为值。每个数组表示一个特定信息分类的翻译,分别存储在不同的 PHP 脚本文件中,文件名即分类名。 针对同一种语言的 PHP 翻译文件存储在同一个以区域 ID 命名的目录中。而所有的这些目录位于 basePath 指定的目录中。

  • CGettextMessageSource: 信息的翻译存储在 GNU Gettext 文件中。

  • CDbMessageSource: 信息的翻译存储在数据库的表中。

信息源是作为一个 应用程序组件 载入的。 Yii 预定义了一个名为 messages 的应用程序组件以存储用户程序中用到的信息。 默认情况下,此信息源的类型是 CPhpMessageSource ,而存储这些 PHP 翻译文件的目录是protected/messages

总体来说,要实现信息翻译,需要执行如下几步:

  1. 在合适的位置调用 Yii::t() ;

  2. 以 protected/messages/LocaleID/CategoryName.php 的格式创建 PHP 翻译文件。 每个文件简单的返回一个信息翻译数组。 注意,这是假设你使用默认的 CPhpMessageSource 存储翻译信息。

  3. 配置 CApplication::sourceLanguage 和 CApplication::language。

提示: 使用 CPhpMessageSource 作为信息源时,Yii 中的 yiic 工具可用于管理信息翻译。 它的message 命令可以自动从所选的源文件中提取要翻译的信息,并在需要时将其合并为现存的翻译。 关于使用 message 命令的更多信息,请执行 yiic help message

从版本 1.0.10 起,当使用 CPhpMessageSource 管理信息源时, 扩展类(例如一个 widget 小物件,一个模块)中的信息可以以一种特殊的方式管理并使用。 具体来说,如果一条信息属于一个类名为 Xyz 的扩展,那么分类的名字可以以 Xyz.categoryName 的格式指定。 相应的信息文件就是BasePath/messages/LanguageID/categoryName.php ,其中 BasePath 是指包含此扩展类文件的那个目录。 当使用 Yii::t() 翻译一条扩展信息时,需要使用如下格式:


Yii::t('Xyz.categoryName', '要翻译的信息');
登录后复制

从 1.0.2 起,Yi 添加了对 choice format 的支持。Choice format 是指选择按照一个给定数字的值选择一条翻译。例如,在英语中,视不同的数量,单词 'book' 可以有一个单数形式或者一个复数形式。而在其他语言中, 这个词可能就没有不同的形式(例如汉语)或者有更复杂的复数规则(例如俄语)。 Choice format 以一种简单而又高效的方式解决了这个问题。

要使用 choice format,翻译的信息必须包含一个由 | 分割的 “表达式-信息” 对序列。如下所示:


'expr1#message1|expr2#message2|expr3#message3'
登录后复制

其中 exprN 表示一个有效的 PHP 表达式,它会计算出一个布尔型的值,以确定相应的信息是否应该被返回。 只有第一个返回值为 true 的表达式对应的信息会被返回。 一个表达式可以包含一个特殊的变量 n (注意,它不是$n),它带有通过第一个信息参数传递的数字的值。 例如,假设有如下一条翻译信息:


'n==1#one book|n>1#many books'
登录后复制

而我们在调用 Yii::t() 时在参数数组中传递了数字值 2 , 我们就会得到 many books 作为最终的翻译信息。

作为一种简便写法,如果一个表达式是一个数字,它将被视为等同于 n==Number。因此,上面的翻译信息也可以写为如下格式:


'1#one book|n>1#many books'
登录后复制

文件翻译

文件翻译是通过调用 CApplication::findLocalizedFile() 完成的。 给定一个所要翻译的文件的路径,此方法就会在区域 ID 子目录中查找相同文件名的文件。 如果找到了,就会返回此文件的路径;否则,将返回原始文件的路径。

文件翻译主要用于渲染一个视图。 当在控制器或小物件中调用任一渲染方法时,视图文件将会被自动翻译。例如,如果 目标语言 是 zh_cn 而 源语言 是 en_us,渲染一个名为 edit 的视图时,程序将会查找protected/views/ControllerID/zh_cn/edit.php 视图文件。 如果此文件找到,就会通过此翻译版本渲染。否则,就会使用文件 protected/views/ControllerID/edit.php 渲染。

文件翻译也可以用于其他目的,例如,显示一个翻译过的图片,或者加载一个基于区域的数据文件。

关于信息翻译和文件翻译的实战示例可参考这篇文章:Yii框架中如何使用Yii::t()实现文本信息翻译和文件翻译

3. 日期和时间格式化

日期和时间在不同的国家和地区通常会有不同的格式。 日期和时间格式和的任务就是生成一个符合指定区域格式的日期或时间字符串。 为实现此目的,Yii 提供了CDateFormatter。

每个 CDateFormatter 实例关联到一个目标区域。要获取关联到整个应用程序的目标区域的格式器(formatter), 只需简单的访问 应用程序的 dateFormatter 属性。

CDateFormatter 类主要提供了两个方法以格式化 UNIX 时间戳。

  • format: 此方法可通过一个自定义的模式格式化给定的 UNIX 时间戳为一个字符串 (例如 $dateFormatter->format('yyyy-MM-dd',$timestamp))。

  • formatDateTime: 此方法通过一个在目标区域数据中预定义的模式格式化给定的 UNIX 时间戳为一个字符串 (例如日期的 short 格式,时间的 long 格式)。

4. 数字格式化

与日期和时间类似,数字在不同的国家或地区之间也可能有不同的格式。 数字格式化包括十进制格式化,货币格式化和百分比格式化。Yii 提供了 CNumberFormatter 以完成这些任务。

要获取关联到整个应用程序的目标区域的格式器(formatter), 只需简单的访问 应用程序的 numberFormatter属性。

CNumberFormatter 提供的如下方法可以用于格式化 integer 或 double 值

  • format: 此方法通过一个自定义的模式格式化给定的数字为一个字符串 (例如 $numberFormatter->format('#,##0.00',$number))。

  • formatDecimal: 此方法通过在目标区域数据中预定义的十进制模式格式化给定的数字。

  • formatCurrency: 此方法使用目标区域数据中预定义的货币模式格式化给定的数字。

  • formatPercentage: 此方法使用目标区域数据中预定义的百分比模式格式化给定的数字。

 以上就是Yii框架官方指南系列增补版48——专题:国际化 (I18N)的内容,更多相关内容请关注PHP中文网(www.php.cn)!


本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

使用FastAPI框架构建国际化的Web应用 使用FastAPI框架构建国际化的Web应用 Sep 29, 2023 pm 03:53 PM

使用FastAPI框架构建国际化的Web应用FastAPI是一个高性能的PythonWeb框架,它结合了Python类型注解和性能较好的异步支持,使得开发Web应用变得更加简单、快速和可靠。在构建一个国际化的Web应用时,FastAPI提供了方便的工具和理念,可以使得应用能够轻松支持多种语言。下面我将给出一个具体的代码示例,介绍如何使用FastAPI框架构

如何使用Webman框架实现国际化和多语言支持? 如何使用Webman框架实现国际化和多语言支持? Jul 09, 2023 pm 03:51 PM

如今,随着互联网技术的不断发展,越来越多的网站和应用程序需要支持多语言和国际化。在Web开发中,使用框架可以极大地简化开发过程。本文将介绍如何使用Webman框架实现国际化和多语言支持,同时提供了一些代码示例。一、什么是Webman框架?Webman是一个基于PHP的轻量级框架,提供了丰富的功能和易于使用的工具,用于开发Web应用程序。其中之一就是国际化和多

Yii框架中间件:为应用程序提供多重数据存储支持 Yii框架中间件:为应用程序提供多重数据存储支持 Jul 28, 2023 pm 12:43 PM

Yii框架中间件:为应用程序提供多重数据存储支持介绍中间件(middleware)是Yii框架中的一个重要概念,它为应用程序提供了多重数据存储支持。中间件的作用类似于一个过滤器,它能够在应用程序的请求和响应之间插入自定义代码。通过中间件,我们可以对请求进行处理、验证、过滤,然后将处理后的结果传递给下一个中间件或最终的处理程序。Yii框架中的中间件使用起来非常

用 PHP 构建多语言网站:消除语言障碍 用 PHP 构建多语言网站:消除语言障碍 Feb 19, 2024 pm 07:10 PM

1.准备数据库为多语言数据创建一个新表,包括以下字段:CREATETABLEtranslations(idINTNOTNULLAUTO_INCREMENT,localeVARCHAR(255)NOTNULL,keyVARCHAR(255)NOTNULL,valueTEXTNOTNULL,PRIMARYKEY(id));2.设置语言切换机制在网站的顶部或侧边栏添加一个语言切换器,允许用户选择首选语言。//获取当前语言$current_locale=isset($_GET["locale"])?$_

使用Yii框架实现网页缓存和页面分块的步骤 使用Yii框架实现网页缓存和页面分块的步骤 Jul 30, 2023 am 09:22 AM

使用Yii框架实现网页缓存和页面分块的步骤引言:在Web开发过程中,为了提高网站的性能和用户体验,常常需要对页面进行缓存和分块处理。Yii框架提供了强大的缓存和布局功能,可以帮助开发者快速实现网页缓存和页面分块,本文将介绍如何使用Yii框架进行网页缓存和页面分块的实现。一、网页缓存开启网页缓存在Yii框架中,可以通过配置文件来开启网页缓存。打开主配置文件co

PHP开发中如何处理多语言和国际化问题 PHP开发中如何处理多语言和国际化问题 Oct 09, 2023 pm 04:24 PM

PHP开发中如何处理多语言和国际化问题,需要具体代码示例随着互联网的发展,人们对于多语言和国际化的需求越来越高。在PHP开发中,如何有效地处理多语言和国际化问题成为了开发者们需要解决的重要任务。字符编码的处理在PHP开发中,我们首先要确保正确处理字符编码。在多语言环境中,使用UTF-8编码是最常见的选择。可以在PHP文件的头部添加如下代码:header('C

Vue中如何使用路由实现国际化的多语言切换? Vue中如何使用路由实现国际化的多语言切换? Jul 22, 2023 pm 12:17 PM

Vue中如何使用路由实现国际化的多语言切换?在开发多语言网站时,我们的一个重要需求是能够根据用户选择的语言,实现网站内容的切换。Vue.js是一款流行的JavaScript框架,通过使用VueRouter插件,我们可以很方便地实现路由功能。在本文中,我将介绍如何使用路由实现Vue中的国际化多语言切换。首先,我们需要安装VueRouter插件。可以通过np

如何使用Hyperf框架进行国际化支持 如何使用Hyperf框架进行国际化支持 Oct 22, 2023 am 08:14 AM

如何使用Hyperf框架进行国际化支持随着全球化的快速发展,很多应用都需要具备多语言支持的功能,以满足不同国家和地区用户的需求。Hyperf框架作为一款轻量级的高性能框架,提供了国际化支持的功能,能够帮助开发者快速实现多语言应用的开发。本文将介绍如何在Hyperf框架中使用国际化功能,并提供相应的代码示例。一、配置多语言支持首先,需要在Hyperf的配置文件

See all articles