Heim > Artikel > Backend-Entwicklung > Yii Framework Official Guide Series Supplement 48 – Spezialthema: Internationalisierung (I18N)
Internationalisierung (Anmerkung des Übersetzers: Internationalisierung, da zwischen I und n 18 Buchstaben stehen, daher wird es oft als I18N abgekürzt) Es bezieht sich auf die Prozess des Entwurfs einer Anwendungssoftware, die sich an die Bedürfnisse verschiedener Sprachen und Regionen anpassen lässt, ohne dass größere technische Änderungen erforderlich sind. Bei Webanwendungen ist die Internationalisierung besonders wichtig, da potenzielle Nutzer aus allen Teilen der Welt kommen können.
Yii bietet Unterstützung für I18N in mehreren Aspekten
Es stellt lokalisierte Daten für jede mögliche Sprache und Variante bereit.
Es bietet Übersetzungsdienste für Informationen und Dokumente.
Es bietet ein auf der Lokalisierung basierendes Datums- und Zeitformat.
Es bietet ein digitales Format, das auf der Landessprache basiert.
In den folgenden Abschnitten werden wir die oben genannten Aspekte im Detail erläutern.
Region ist eine Reihe von Parametern, die die Sprache des Benutzers, das Land des Benutzers und alle speziellen Parameter definieren, die der Benutzer in seiner Benutzeroberfläche sehen möchte. Es wird normalerweise durch eine ID identifiziert, die die Sprach-ID und die Gebietsschema-ID kombiniert. Die ID en_US
steht beispielsweise für die englische Region und die Vereinigten Staaten. Aus Konsistenzgründen werden alle Regions-IDs in Yii auf Kleinbuchstaben 语言 ID
oder 语言 ID_地区 ID
normalisiert (z. B. en
, en_us
).
Regionale Daten werden durch eine CLocale-Instanz dargestellt. Es stellt länderspezifische Informationen bereit, einschließlich Währungssymbolen, numerischen Symbolen, Datums- und Zeitformaten sowie datumsbezogenen Namen. Da Sprachinformationen bereits durch Gebietsschema-IDs implementiert sind, wird CLocale nicht mehr bereitgestellt. Aus dem gleichen Grund verwenden wir die Wörter „Region“ und „Sprache“ oft synonym.
Mit einer Regions-ID können Sie die entsprechende CLocale-Instanz über CLocale::getInstance($localeID)
oder CApplication::getLocale($localeID)
abrufen.
Informationen: Yii enthält regionalisierte Daten für fast alle Sprachen und Regionen. Diese Daten stammen aus dem Common Locale Data Repository (CLDR). Innerhalb jeder Region werden nur Teildaten des CLDR bereitgestellt, da die ursprünglichen CLDR-Daten eine große Menge weniger häufig verwendeter Informationen enthalten. Ab Version 1.1.0 können Benutzer auch ihre eigenen benutzerdefinierten Zonendaten verwenden. Sie müssen nur das CApplication::localeDataPath-Attribut für das Verzeichnis konfigurieren, das benutzerdefinierte Gebietsschemadaten enthält. Bitte beziehen Sie sich auf die Dateien im Verzeichnis
framework/i18n/data
, um eine benutzerdefinierte Zonendatendatei zu erstellen.
In einer Yii-Anwendung unterscheiden wir zwischen Zielsprache und Quellsprache. Die Zielsprache ist die Sprache (Region) der beabsichtigten Benutzer der Anwendung, während sich die Quellsprache auf die Sprache (Region) bezieht, die im Quellcode der Anwendung geschrieben ist. Eine Internationalisierung erfolgt nur, wenn die beiden Sprachen unterschiedlich sind.
Sie können die Zielsprache in der Anwendungskonfiguration festlegen oder diesen Parameter dynamisch festlegen, bevor die Internationalisierung erfolgt.
Tipp: Manchmal möchten wir die Zielsprache auf die vom Benutzer verwendete Sprache einstellen (diejenige, die in den Browseroptionen des Benutzers angegeben ist). Verwenden Sie einfach CHttpRequest::preferredLanguage, um die vom Benutzer festgelegte Sprache abzurufen.
Die wahrscheinlich am häufigsten verwendete Methode in I18N ist die Übersetzung, einschließlich Informationsübersetzung und Ansichtsübersetzung. Ersteres übersetzt eine Textnachricht in die gewünschte Sprache und letzteres übersetzt ein integriertes Dokument in die gewünschte Sprache.
Eine Übersetzungsanfrage enthält das zu übersetzende Objekt, die Quellsprache des Objekts und die Zielsprache, in die das Objekt übersetzt werden muss. In Yii ist die Quellsprache standardmäßig die Anwendungsquellsprache und die Zielsprache standardmäßig die Anwendungssprache. Wenn beide in derselben Sprache vorliegen, findet keine Übersetzung statt.
Die Informationsübersetzung erfolgt durch Aufruf von Yii::t(). Diese Methode übersetzt Informationen von der Ausgangssprache in die Zielsprache.
Beim Übersetzen einer Nachricht muss ihre Kategorie angegeben werden, da eine Nachricht in verschiedenen Kategorien oder Kontexten unterschiedliche Übersetzungen haben kann. Die Klassifizierung yii
ist nur für die Verwendung durch den Yii-Framework-Kern reserviert. Die
-Nachricht kann Parameterplatzhalter enthalten, die beim Aufruf von Yii::t() durch die tatsächlichen Parameterwerte ersetzt werden. Beispielsweise ersetzt die folgende Nachrichtenübersetzungsanforderung die {alias}
-Platzhalter in der Originalnachricht durch tatsächliche Aliaswerte.
Yii::t('app', 'Path alias "{alias}" is redefined.', array('{alias}'=>$alias))
Hinweis: Die zu übersetzenden Informationen müssen eine Konstante sein Zeichenfolge. Sie dürfen keine Variablen enthalten, die den Inhalt der Nachricht verändern könnten (z. B.
"Invalid {$message} content."
). Wenn eine Nachricht durch einige Parameter geändert werden muss, verwenden Sie bitte Parameterplatzhalter.
翻译过的信息会存储在一个叫做 信息源(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'
Die Dateiübersetzung wird durch den Aufruf von CApplication::findLocalizedFile() abgeschlossen. Wenn ein Pfad zu einer zu übersetzenden Datei angegeben ist, sucht diese Methode im Unterverzeichnis 区域 ID
nach einer Datei mit demselben Dateinamen. Wenn gefunden, wird der Pfad zu dieser Datei zurückgegeben; andernfalls wird der Pfad zur Originaldatei zurückgegeben.
Die Dateiübersetzung wird hauptsächlich zum Rendern einer Ansicht verwendet. Wenn eine Rendering-Methode in einem Controller oder Widget aufgerufen wird, wird die Ansichtsdatei automatisch übersetzt. Wenn beispielsweise die Zielsprache zh_cn
und die Quellsprache en_us
ist, sucht das Programm beim Rendern einer Ansicht mit dem Namen edit
nach der Ansichtsdatei protected/views/ControllerID/zh_cn/edit.php
. Wenn diese Datei gefunden wird, wird sie über diese übersetzte Version gerendert. Andernfalls wird die Datei protected/views/ControllerID/edit.php
zum Rendern verwendet.
Die Dateiübersetzung kann auch für andere Zwecke verwendet werden, z. B. zum Anzeigen eines übersetzten Bildes oder zum Laden einer bereichsbasierten Datendatei.
Praktische Beispiele für die Übersetzung von Informationen und Dateien finden Sie in diesem Artikel: So verwenden Sie Yii::t(), um die Übersetzung von Textinformationen und Dateien im Yii-Framework zu implementieren
Datum und Uhrzeit haben in verschiedenen Ländern und Regionen normalerweise unterschiedliche Formate. Die Aufgabe der Datums- und Zeitformatsumme besteht darin, eine Datums- oder Zeitzeichenfolge zu generieren, die dem angegebenen Gebietsschemaformat entspricht. Um diesen Zweck zu erreichen, stellt Yii CDateFormatter bereit.
Jede CDateFormatter-Instanz ist einem Zielbereich zugeordnet. Um den Formatierer zu erhalten, der der Zielregion der gesamten Anwendung zugeordnet ist, greifen Sie einfach auf die dateFormatter-Eigenschaft der Anwendung zu.
Die CDateFormatter-Klasse stellt hauptsächlich zwei Methoden zum Formatieren von UNIX-Zeitstempeln bereit.
Format: Diese Methode formatiert den angegebenen UNIX-Zeitstempel in eine Zeichenfolge mit einem benutzerdefinierten Muster (z. B. $dateFormatter->format('yyyy-MM-dd',$timestamp)
).
formatDateTime: Diese Methode formatiert den angegebenen UNIX-Zeitstempel in eine Zeichenfolge unter Verwendung eines in den Zielzonendaten vordefinierten Musters (z. B. short
Format für Datum, long
Format für Zeit formatieren).
Ähnlich wie Datums- und Uhrzeitangaben können auch Zahlen in verschiedenen Ländern oder Regionen unterschiedliche Formate haben. Die Zahlenformatierung umfasst Dezimalformatierung, Währungsformatierung und Prozentformatierung. Yii stellt CNumberFormatter zur Verfügung, um diese Aufgaben zu erfüllen.
Um den Formatierer zu erhalten, der der Zielregion der gesamten Anwendung zugeordnet ist, greifen Sie einfach auf die Eigenschaft „numberFormatter“ der Anwendung zu.
CNumberFormatter stellt die folgenden Methoden bereit, die zum Formatieren von Ganzzahl- oder Doppelwerten verwendet werden können
Format: Diese Methode formatiert die angegebene Zahl über ein benutzerdefiniertes Muster in einen String (z. B. $numberFormatter->format('#,##0.00',$number)
).
formatDecimal: Diese Methode formatiert die angegebene Zahl mithilfe des vordefinierten Dezimalmusters in den Zielbereichsdaten.
formatCurrency: Diese Methode formatiert die angegebene Zahl mithilfe des vordefinierten Währungsmusters in den Daten der Zielregion.
formatPercentage: Diese Methode formatiert die angegebene Zahl mithilfe des vordefinierten Prozentmusters in den Zielbereichsdaten.
Das Obige ist der Inhalt der offiziellen Yii Framework Guide Series-Ergänzung 48 – Spezialthema: Internationalisierung (I18N). Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website (www.php.org). php.cn) !