fisharebest/localization

一个轻量级的本地化数据库和翻译工具,包含CLDR、IANA、ISO等数据。

1.17.0 2022-10-24 15:23 UTC

README

phpunit phpstan phpcs codecov StyleCI Code Climate

本地化标准和数据

此软件包结合了来自许多标准的本地化数据,包括Unicode CLDRRFC5646 / IANA子标签注册表ISO-3166ISO-639ISO-15924等,以帮助您制作适用于世界各地访问者的应用程序。

包含超过800个区域的定义。

区域、语言、脚本和领土

一个区域由三部分组成:一种语言、一种脚本和一个领土。脚本和领土通常可以从语言中隐含得出。

通常您只需要处理区域,可以忽略语言和脚本。

$locale = new LocaleJa;         // Create a locale for Japanese.
$locale = Locale::create('ja'); // Create a locale for Japanese, from its code.

$locale->code();                // "ja_JP" (territories are always included in locale codes)
$locale->languageTag();         // "ja" (redundant territories are omitted in tags)
$locale->endonym();             // "日本語" (Japanese name for Japanese)

// Languages - extract from the locale, or create with "new LanguageXx"
$locale->language();            // LanguageJa
$locale->language()->code();    // "ja" (ISO-639 code)

// Scripts - extract from the locale, or create with "new ScriptXxxx"
$locale->script();              // ScriptJpan
$locale->script()->code();      // "Jpan" (ISO-15924 code)
$locale->script()->direction(); // "ltr" (left to right)

// Territories - extract from the locale, or create with "new TerritoryXx"
$locale->territory();           // TerritoryJp
$locale->territory()->code();   // "JP" (ISO-3166 code)

// A few locales can also specify variants.
$locale = new LocaleCaValencia; // The Valencian dialect of Catalan
$locale->variant();             // VariantValencia
$locale->variant()->code();     // "valencia"

本地化

创建一个区域并使用它来本地化您应用程序中的数据。

// Many ways to create locales
$locale = new LocaleEnGb;
$locale = Locale::create('en-GB'); // Use upper/lower case, hyphens/underscores/@
$locale = Locale::httpAcceptLanguage($_SERVER, $available_locales, $default_locale);

// Markup for HTML elements containing this locale
$locale->htmlAttributes();      // lang="ar" dir="rtl"

// Is text written left-to-right or right-to-left
$locale->direction();           // "ltr" or "rtl"

// Days of the week.
$locale->firstDay();            // 0=Sunday, 1=Monday, etc.
$locale->weekendStart();        // 0=Sunday, 1=Monday, etc.
$locale->weekendEnd();          // 0=Sunday, 1=Monday, etc.

// Measurement systems and paper sizes.
$locale->measurementSystem();   // "metric", "UK" or "US"
$locale->paperSize();           // "A4" or "US-Letter"

// Formatting numbers
$locale = new LocaleGr;         // Gujarati
$locale->digits('2014');        // "૨૦૧૪"
$locale = new LocaleItCh;       // Swiss Italian
$locale->number('12345678.9');  // "12'345'678.9"
$locale->percent(0.123);        // "12.3%"

// To sort data properly in MySQL, you need to specify a collation sequence.
// See https://dev.mysqlserver.cn/doc/refman/8.0/en/charset-unicode-sets.html
$locale->collation();           // "unicode_ci", "swedish_ci", etc.

翻译

为每个区域定义了复数规则。以下示例显示,尽管英语和法语都有两种复数形式,但英语认为零是复数,而法语认为它是单数。

$locale = new LocaleEn;
$locale->pluralRule()->plurals(); // 2 (English has two plural forms)
$locale->pluralRule()->plural(0); // 1 (zero is plural in English "zero apples")
$locale = new LocaleFr;
$locale->pluralRule()->plurals(); // 2 (French also has two plural forms)
$locale->pluralRule()->plural(0); // 0 (zero is singular in French "zero apple")

注意,CLDR中的一些复数定义与传统的gettext用法不同。我们使用gettext版本为br、fa、fil、he、lv、mk、pt和se。

翻译函数与gettext相同。

// We need to translate into French
$locale = new LocaleFr;
// Create the translation
$translation = new Translation('/path/to/fr.mo');  // Can use .CSV, .PHP, .PO and .MO files
// Create the translator
$translator = new Translator($translation->asArray(), $locale->pluralRule());
// Use the translator
$translator->translate('the fish');                // "le poisson"
$translator->translateContext('noun', 'fish');     // "poisson"
$translator->translateContext('verb', 'fish');     // "pêcher"
$translator->plural('%d fish', '%d fishes', 4);    // "%d poissons"

提示:如果您的翻译存储在多个文件中,您可以轻松地将它们合并。

// Create the translation
$translation1 = new Translation('/path/to/core/fr.mo');
$translation2 = new Translation('/path/to/extra/fr.mo');
// Create the translator
$translator = new Translator(array_merge($translation1->asArray(), $translation2->asArray()), $locale->pluralRule());

提示:从.PHP文件加载翻译比从.MO文件加载要快一些。您可以使用这种方法进行转换和/或缓存。

$translation = new Translation('/path/to/fr.mo');
file_put_contents('/path/to/fr.php', '<?php return ' . var_export($translations->asArray(), true) . ';');

欢迎更新

请提供来源的引用,例如