국제화(역자주: Internationalization, I와 n 사이에 18개의 글자가 있어서 흔히 I18N으로 약칭한다)를 가리킨다. 큰 엔지니어링 변경 없이 다양한 언어와 지역의 요구에 적응할 수 있는 응용 프로그램 소프트웨어를 설계하는 프로세스입니다. 잠재적인 사용자가 세계 각지에서 올 수 있기 때문에 국제화는 웹 애플리케이션에 특히 중요합니다.
Yii는 여러 측면에서 I18N을 지원합니다.
가능한 모든 언어와 변형에 대해 현지화된 데이터를 제공합니다.
정보 및 문서에 대한 번역 서비스를 제공합니다.
현지화 기반의 날짜 및 시간 형식을 제공합니다.
토착어 기반의 디지털 형식을 제공합니다.
다음 섹션에서는 위의 내용에 대해 자세히 설명하겠습니다.
지역은 사용자의 언어, 사용자의 국가 및 사용자가 인터페이스에서 보고 싶어하는 모든 특수 매개변수를 정의하는 일련의 매개변수입니다. 일반적으로 언어 ID와 로케일 ID를 결합한 ID로 식별됩니다. 예를 들어 ID en_US
는 영어 지역과 미국을 나타냅니다. 일관성을 위해 Yii의 모든 지역 ID는 소문자 语言 ID
또는 语言 ID_地区 ID
(예: en
, en_us
)로 정규화됩니다.
지역 데이터는 CLocale 인스턴스로 표현됩니다. 통화 기호, 숫자 기호, 날짜 및 시간 형식, 날짜 관련 이름을 포함한 로케일 기반 정보를 제공합니다. 언어 정보는 이미 로캘 ID로 구현되어 있으므로 CLocale은 더 이상 제공되지 않습니다. 같은 이유로 우리는 종종 "지역"과 "언어"라는 단어를 같은 의미로 사용합니다.
지역 ID를 사용하면 CLocale::getInstance($localeID)
또는 CApplication::getLocale($localeID)
을 통해 해당 CLocale 인스턴스를 얻을 수 있습니다.
정보: Yii에는 거의 모든 언어와 지역에 대한 지역화된 데이터가 포함되어 있습니다. 이 데이터는 CLDR(Common Locale Data Repository)에서 제공됩니다. 원본 CLDR 데이터에는 일반적으로 사용되지 않는 정보가 많이 포함되어 있으므로 각 지역 내에서는 CLDR의 일부 데이터만 제공됩니다. 버전 1.1.0부터 사용자는 자신의 사용자 정의 영역 데이터를 사용할 수도 있습니다. 사용자 정의 로케일 데이터가 포함된 디렉터리에 CApplication::localeDataPath 특성을 구성하기만 하면 됩니다. 사용자 정의 영역 데이터 파일을 생성하려면
framework/i18n/data
디렉터리에 있는 파일을 참조하세요.
Yii 애플리케이션에서는 타겟 언어와 소스 언어를 구분합니다. 대상 언어는 애플리케이션이 의도한 사용자의 언어(로케일)이고, 소스 언어는 애플리케이션의 소스 코드에 작성된 언어(로케일)입니다. 국제화는 두 언어가 다른 경우에만 발생합니다.
애플리케이션 구성에서 대상 언어를 설정하거나 국제화가 발생하기 전에 이 매개변수를 동적으로 설정할 수 있습니다.
팁: 때로는 사용자가 사용하는 언어(사용자의 브라우저 옵션에 지정된 언어)로 대상 언어를 설정하고 싶을 때가 있습니다. 사용자가 설정한 언어를 가져오려면 CHttpRequest::preferredLanguage를 사용하세요.
아마도 I18N에서 가장 많이 사용되는 것은 정보 번역과 보기 번역을 포함한 번역일 것입니다. 전자는 문자 메시지를 원하는 언어로 번역하고, 후자는 통합 문서를 원하는 언어로 번역합니다.
번역 요청에는 번역할 개체, 개체의 소스 언어, 개체를 번역해야 하는 대상 언어가 포함됩니다. Yii에서 소스 언어는 기본적으로 애플리케이션 소스 언어로 설정되고 대상 언어는 기본적으로 애플리케이션 언어로 설정됩니다. 둘 다 동일한 언어로 되어 있으면 번역이 이루어지지 않습니다.
정보 번역은 Yii::t()를 호출하여 이루어집니다. 이 방법은 소스 언어의 정보를 타겟 언어로 번역합니다.
메시지를 번역할 때는 카테고리를 지정해야 합니다. 메시지는 카테고리나 상황에 따라 번역이 다를 수 있기 때문입니다. 분류 yii
는 Yii 프레임워크 코어에서만 사용하도록 예약되어 있습니다.
메시지에는 Yii::t()를 호출할 때 실제 매개변수 값으로 대체되는 매개변수 자리 표시자가 포함될 수 있습니다. 예를 들어 다음 메시지 번역 요청은 원본 메시지의 {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
。
总体来说,要实现信息翻译,需要执行如下几步:
在合适的位置调用 Yii::t() ;
以 protected/messages/LocaleID/CategoryName.php
的格式创建 PHP 翻译文件。 每个文件简单的返回一个信息翻译数组。 注意,这是假设你使用默认的 CPhpMessageSource 存储翻译信息。
配置 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::t()를 사용하여 Yii 프레임워크에서 텍스트 정보 번역 및 파일 번역을 구현하는 방법
날짜와 시간은 일반적으로 국가와 지역에 따라 형식이 다릅니다. 날짜 및 시간 형식 합계 작업은 지정된 로케일 형식을 준수하는 날짜 또는 시간 문자열을 생성하는 것입니다. 이러한 목적을 달성하기 위해 Yii는 CDateFormatter를 제공합니다.
각 CDateFormatter 인스턴스는 대상 영역과 연결되어 있습니다. 전체 애플리케이션의 대상 지역과 관련된 포맷터를 얻으려면 애플리케이션의 dateFormatter 속성에 액세스하면 됩니다.
CDateFormatter 클래스는 주로 UNIX 타임스탬프 형식을 지정하는 두 가지 방법을 제공합니다.
형식: 이 방법은 지정된 UNIX 타임스탬프를 사용자 정의 패턴(예: $dateFormatter->format('yyyy-MM-dd',$timestamp)
)이 있는 문자열로 형식화합니다.
formatDateTime: 이 방법은 대상 영역 데이터에 사전 정의된 패턴을 사용하여 지정된 UNIX 타임스탬프를 문자열로 형식화합니다(예: 날짜의 경우 short
형식, 시간의 경우 long
형식
$numberFormatter->format('#,##0.00',$number)
형식: 이 메서드는 사용자 지정 패턴 문자열을 통해 주어진 숫자를 형식으로 지정합니다. (예:
위 내용은 Yii Framework 공식 가이드 시리즈 부록 48 - 특별 주제: 국제화(I18N)의 내용입니다. 더 많은 관련 내용은 PHP 중국어 웹사이트(www. php.cn) !