ride/lib-i18n

Ride 框架的国际化库

1.1.0 2024-06-26 08:54 UTC

This package is auto-updated.

Last update: 2024-08-26 09:27:16 UTC


README

PHP Ride 框架的国际化库。

库中包含的内容

区域设置

一个 Locale 是区域设置的接口。这是一个简单的表示,包括名称、代码和额外属性。

这些区域设置包含在一个 LocaleManager 实例中。此管理器控制当前和默认区域设置。

LocaleIOLocaleManager 提供区域设置。区域设置应按系统重要性顺序排序。第一个区域设置被视为默认区域设置。

协商者

Negotiator 用于检测当前区域设置。当当前区域设置未设置时,会调用它。

您可以使用 ChainedNegotiator 在链中实现多个检测机制。

翻译器

Translator 是将密钥翻译为本地化字符串的接口。该接口支持翻译密钥的单数和复数形式之间的差异。

翻译器由 TranslatorManager 管理。可以使用 Locale 实例请求 Translator 实例。

I18n

I18n 类将不同的部分粘合在一起,形成一个简单的外观。

代码示例

查看此代码示例,了解此库的可能性。

<?php

use ride\library\i18n\locale\io\LocaleIO;
use ride\library\i18n\locale\negotiator\DefaultNegotiator;
use ride\library\i18n\locale\GenericLocaleManager;
use ride\library\i18n\translator\io\AbstractTranslationIO;
use ride\library\i18n\translator\GenericTranslatorManager;
use ride\library\i18n\I18n;

/**
 * Dummy implementation of a locale data source
 */
class FooLocaleIO implements LocaleIO {
    
    public function getLocales() {
        return array(
            new GenericLocale('en', 'English', array(
                'full' => 'en_GB.utf8',
                'translator.script.plural': '$n != 1',
            )),
            new GenericLocale('nl', 'Nederlands', array(
                'full' => 'nl_BE.utf8',
                'translator.script.plural': '$n != 1',
            )),
        );
    }
    
}

/**
 * Dummy implementation of a translation data source
 */
class FooTranslationIO extends AbstractTranslationIO {
    
    protected function readTranslations($localeCode) {
        switch ($localeCode) {
            case 'en':
                return array(
                    'label.name' => 'Name',
                    'label.email' => 'E-mail address',
                    'label.hello' => 'Hello %name%!',
                    'label.item.0' => 'We got 1 item.',
                    'label.item.1' => 'We got %n% items.',
                );
            default:
                return array();
        } 
    }
}

// first we need to initialize our I18n instance
$localeIO = new FooLocaleIO(); 
$negotiator = new DefaultNegotiator();
$translationIO = new FooTranslationIO();

$localeManager = new GenericLocaleManager($localeIO, $negotiator);
$translatorManager = new GenericTranslatorManager($translationIO);

$i18n = new I18n($localeManager, $translatorManager);

// play with the locales
$en = $i18n->getLocale(); // default language is English since it's provided first by the locale IO
$nl = $i18n->getLocale('nl');

$i18n->setCurrentLocale($nl);
$i18n->setCurrentLocale('nl');

$nl = $i18n->getLocale();

$i18n->hasLocale('fr'); // false

// fetch some lists of the available locales
$locales = $i18n->getLocales();
$localeList = $i18n->getLocaleList(); // array('en' => 'English', 'nl' => 'Nederlands')
$localeCodeList = $i18n->getLocaleCodeList(); // array('en' => 'en', 'nl' => 'nl')

// play with translations
$translator = $i18n->getTranslator($en);

// translate some keys
$value = $translator->translate('label.name'); // Name
$value = $translator->translate('label.hello', array('name' => 'world'); // Hello world!
$value = $translator->translate('label.unexistant'); // [label.unexistant]
$value = $translator->translatePlural(1, 'label.item'); // We got 1 item. 
$value = $translator->translatePlural(3, 'label.item'); // We got 3 items. 

// translation management
$translations = $translator->getTranslations(); // array('label.name' => 'Name', 'label.email' => 'E-mail address', ...)
$translation = $translator->getTranslation('label.hello'); // Hello %name%!
$translator->setTranslation('label.foo', 'bar');

实现

对于更多示例,您可以查看以下库的实现:

安装

您可以使用 Composer 来安装此库。

composer require ride/lib-i18n