Maison > Article > développement back-end > Supplément 48 de la série de guides officiels du Yii Framework - Thème spécial : Internationalisation (I18N)
Internationalisation (Note du traducteur : Internationalisation, car il y a 18 lettres entre I et n, il est donc souvent abrégé en I18N) Il fait référence au processus de conception d'un logiciel d'application capable de s'adapter aux besoins de différentes langues et régions sans apporter de modifications techniques majeures. L'internationalisation est particulièrement importante pour les applications Web, car les utilisateurs potentiels peuvent provenir des quatre coins du monde.
Yii prend en charge I18N sous plusieurs aspects
Il fournit des données localisées pour chaque langue et variante possibles.
Il fournit des services de traduction d'informations et de documents.
Il fournit un format de date et d'heure basé sur la localisation.
Il fournit un format numérique basé sur la langue vernaculaire.
Dans les sections suivantes, nous expliquerons les aspects ci-dessus en détail.
Une région est une série de paramètres qui définissent la langue de l'utilisateur, le pays de l'utilisateur et tous les paramètres spéciaux que l'utilisateur souhaite voir dans son interface. Il est généralement identifié par un ID qui combine l'ID de langue et l'ID de paramètres régionaux. Par exemple, l'ID en_US
représente la région anglaise et les États-Unis. Par souci de cohérence, tous les identifiants de région dans Yii sont normalisés en minuscules 语言 ID
ou 语言 ID_地区 ID
(par exemple en
, en_us
).
Les données régionales sont représentées par une instance CLocale. Il fournit des informations basées sur les paramètres régionaux, notamment des symboles monétaires, des symboles numériques, des formats de date et d'heure et des noms liés à la date. Étant donné que les informations sur la langue sont déjà implémentées par les ID de paramètres régionaux, CLocale n'est plus fourni. Pour la même raison, nous utilisons souvent les mots « région » et « langue » de manière interchangeable.
Avec un identifiant de région, vous pouvez obtenir l'instance CLocale correspondante via CLocale::getInstance($localeID)
ou CApplication::getLocale($localeID)
.
Informations : Yii contient des données régionalisées pour presque toutes les langues et régions. Ces données proviennent du Common Locale Data Repository (CLDR). Au sein de chaque région, seules des données partielles du CLDR sont fournies car les données originales du CLDR contiennent une grande quantité d’informations moins couramment utilisées. À partir de la version 1.1.0, les utilisateurs peuvent également utiliser leurs propres données de zone personnalisées. Il vous suffit de configurer l'attribut CApplication::localeDataPath sur le répertoire contenant les données de paramètres régionaux personnalisés. Veuillez vous référer aux fichiers situés dans le répertoire
framework/i18n/data
pour créer des fichiers de données de zone personnalisés.
Dans une application Yii, on distingue sa langue cible et sa langue source. La langue cible est la langue (région) des utilisateurs prévus de l'application, tandis que la langue source fait référence à la langue (région) écrite dans le code source de l'application. L'internationalisation n'a lieu que si les deux langues sont différentes.
Vous pouvez définir la langue cible dans la configuration de l'application, ou définir ce paramètre de manière dynamique avant l'internationalisation.
Astuce : Parfois, nous souhaitons définir la langue cible sur la langue utilisée par l'utilisateur (celle spécifiée dans les options du navigateur de l'utilisateur). Utilisez simplement CHttpRequest::preferredLanguage pour obtenir la langue définie par l'utilisateur.
La traduction la plus utilisée dans I18N est probablement la traduction, y compris la traduction d'informations et la traduction de vues. Le premier traduit un message texte dans la langue souhaitée, et le second traduit un document intégré dans la langue souhaitée.
Une demande de traduction contient l'objet à traduire, la langue source de l'objet et la langue cible dans laquelle l'objet doit être traduit. Dans Yii, la langue source est par défaut la langue source de l'application et la langue cible est la langue de l'application par défaut. Si les deux sont dans la même langue, la traduction n’aura pas lieu.
La traduction des informations est réalisée en appelant Yii::t(). Cette méthode traduit les informations de la langue source vers la langue cible.
Lors de la traduction d'un message, sa catégorie doit être précisée, car un message peut avoir différentes traductions selon différentes catégories ou contextes. La classification yii
est réservée à l'usage du noyau du framework Yii uniquement. Le message
peut contenir des espaces réservés de paramètres, qui seront remplacés par les valeurs réelles des paramètres lors de l'appel de Yii::t(). Par exemple, la demande de traduction de message suivante remplacera les espaces réservés {alias}
dans le message d'origine par les valeurs d'alias réelles.
Yii::t('app', 'Path alias "{alias}" is redefined.', array('{alias}'=>$alias))
Remarque : Les informations à traduire doivent être une constante chaîne . Ils ne peuvent pas contenir de variables susceptibles de modifier le contenu du message (par exemple
"Invalid {$message} content."
). Si un message doit être modifié via certains paramètres, veuillez utiliser des espaces réservés pour les paramètres.
翻译过的信息会存储在一个叫做 信息源(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'
La traduction de fichiers est terminée en appelant CApplication::findLocalizedFile(). Étant donné un chemin d'accès à un fichier à traduire, cette méthode recherchera un fichier portant le même nom de fichier dans le sous-répertoire 区域 ID
. S'il est trouvé, le chemin d'accès à ce fichier est renvoyé ; sinon, le chemin d'accès au fichier d'origine est renvoyé.
La traduction de fichiers est principalement utilisée pour restituer une vue. Lorsqu'une méthode de rendu est appelée dans un contrôleur ou un widget, le fichier de vue sera automatiquement traduit. Par exemple, si la langue cible est zh_cn
et la langue source est en_us
, lors du rendu d'une vue nommée edit
, le programme recherchera le fichier de vue protected/views/ControllerID/zh_cn/edit.php
. Si ce fichier est trouvé, il sera rendu via cette version traduite. Sinon, le fichier protected/views/ControllerID/edit.php
sera utilisé pour le rendu.
La traduction de fichiers peut également être utilisée à d'autres fins, telles que l'affichage d'une image traduite ou le chargement d'un fichier de données basé sur une région.
Pour des exemples pratiques de traduction d'informations et de traduction de fichiers, veuillez vous référer à cet article : Comment utiliser Yii::t() pour implémenter la traduction d'informations textuelles et la traduction de fichiers dans le framework Yii
La date et l'heure ont généralement des formats différents selon les pays et les régions. La tâche de la somme des formats de date et d'heure est de générer une chaîne de date ou d'heure conforme au format de paramètres régionaux spécifié. Pour atteindre cet objectif, Yii fournit CDateFormatter.
Chaque instance de CDateFormatter est associée à une zone cible. Pour obtenir le formateur associé à la région cible de l'ensemble de l'application, accédez simplement à la propriété dateFormatter de l'application.
La classe CDateFormatter fournit principalement deux méthodes pour formater les horodatages UNIX.
format : Cette méthode formate l'horodatage UNIX donné en une chaîne avec un modèle personnalisé (par exemple $dateFormatter->format('yyyy-MM-dd',$timestamp)
).
formatDateTime : Cette méthode formate l'horodatage UNIX donné en une chaîne en utilisant un modèle prédéfini dans les données de la zone cible (par exemple short
format pour la date, long
format pour l'heure
$numberFormatter->format('#,##0.00',$number)
format : Cette méthode formate le nombre donné en a via un modèle personnalisé String (par exemple
Ce qui précède est le contenu du supplément 48 de la série de guides officiels du Yii Framework - Thème spécial : Internationalisation (I18N). Pour plus de contenu connexe, veuillez prêter attention au site Web PHP chinois (www. php.cn) !