Yii2. Тіл қосу. 2-бөлім

  • avatar
  • PHP / 23 қаңтар 2017, 11:58
  • 1083
Бұл мына мақаланың жалғасы

Бүгін сайттағы сөздер мен сөйлемдерді басқа тілге қалай аударуға болатынын айтып өтпекшімін. Әнгімені көбейтпей іске кірісейік.
Мақала мазмұны
  1. сөздер, сөйлемдерді Yii::t() функциясымен қоршау
  2. i18n компонентің қосу
  3. i18n.php файлын қосу
  4. php yii message config/i18n.php командасын қолдану
  5. жиналған мәтіндерді аударып шығу

Мәтіндерді Yii::t() функциясымен қоршау

Барлық сөздер мен сөйлемедерді Yii::t() функциясымен қоршап шығу керек.
Yii::t() туралы қысқаша.
Yii::t($category, $string [, $values]) 3 параметр қабылдайды.
$category — сөздер категориясын (немесе тобын) білдіреді.
$string — аударылуға тиісті сөз, сөйлем.
$values — аударылуға тиісті сөйлемнің арасында қосылатын мәтіндер. Бұл параметр міндетті емес, көрсетпеуге болады.
Аударылған мәтін бөлек топ болып сақталып түрады. $string мәтін аудармасын қай топтан іздеу керек екенін $cattegory параметрінен біледі.
Мысалы
echo Yii::t('app', 'Мекеме'); 
/* 
'Мекеме' - сөзін таңдалған тілге аударады.
ол 'app' категориясында
*/

$values параметрінін қолданатын мысал.
echo Yii::t('app', 'Мақала {team} ұжымымен жасалған', ['team' => 'codeo']);
/*
$values - массив турде көрсетіледі. {team} орнына 'codeo' жазылады.
ru = 'Статья создана командой {team}'
en = 'Article is powered by {team} team'
*/

әзірше сайт қай сөздерді аудару керек екенін біледі.

i18n компонентің қосу

Yii2-де аудармаларға i18n компоненті жауапты. Сондықтан негізгі конфигурацияға оны көрсетуіміз керек. Анығырақ айтқанда аудармалар сақтауына i18n компонентің $translations қасиеті (свойство) жауапты.
Ол аудармаларды 3 түрде сақтайды.
  1. php файлда. PhpMessageSource компоненті жауапты
  2. базада. yii\i18n\DbMessageSource компоненті жауапты
  3. .mo, .po форматты файлда. GettextMessageSource компоненты жауапты
Мен аудармаларды .php файлда сақтаймын. Сондықтан PhpMessageSource компонентімен жұмыс жүреді. Осы әдіс маған ыңғайлы көрінеді. Ақпарат статиқалық куйде сақталып тұрады және php форматын жақсы білем.
yii\i18n\DbMessageSource компонентімен жұмыс істеп көрген емеспін, қалай қолданатынын да қазір айтып шыға алмайм. Өз ойым: аудармалар базада тұрса, онда динамиқалық күйде өңдеуге болады, алайда сайт әр ашылған сайын базадан сөздерді тартып тұрады. Меніңше бұл сайтқа артық салмақ болады.

GettextMessageSource колданған емеспін. Ол туралы ештеңе айта алмаймын.

Конфигурацияға енгізілетін код.
'i18n' => [
            'translations' => [
                'app*' => [
                    'class' => 'yii\i18n\PhpMessageSource',
                    'basePath' => '@app/messages',
                    //'sourceLanguage' => 'en-US',
                    'fileMap' => [
                        'app' => 'app.php',
                        'app/error' => 'error.php',
                    ],
                ],
            ],
        ],

Бұл кодта 'app' категориясындағы аудармаларға PhpMessageSource компонентін көрсеттім. Аудармалар messages папкасында орналасады.

Енді сайт аудармаларды қай жерден іздеу керек екенін біледі

i18n.php файлын қосу

i18n компоненті проектте Yii::t() функциясымен қоршалған барлық сөздерді, сөйлемдерді бір жерге топқа сай жинап береді. Жинау үшін конфигурация папкасына (config) i18n.php файлын қосу керек. Оның коды:
<?php
return [
    'sourcePath' => __DIR__. DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR,
    // 'languages' => ['ru', 'kz', 'en'], // аударылу керек тілдерді массив түрінде қосыңыз
    'languages' => array_keys(Yii::$app->params['langs']), // аударылу керек тілдерді массив түрінде қосыңыз
    'translator' => 'Yii::t',
    'sort' => false,
    'removeUnused' => false,
    'only' => ['*.php'],
    // мында көрсетілген папкаларға кірмейді (соның ішіндегі сөздерді аудармайды)
    'except' => [
        '.svn',
        '.git',
        '.gitignore',
        '.gitkeep',
        '.hgignore',
        '.hgkeep',
        '/messages',
        '/vendor',
    ],
    'format' => 'php',
    'messagePath' => __DIR__ . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . 'messages',
    'overwrite' => true,
];?>

Кішкене түсініктеме:
    'sourcePath' => __DIR__. DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR,

Қай жерден бастап файлдарды қарау керек. Олардың ішінде Yii::t() функциясымен қоршалған сөздер бар ма жоқ па. Бұл жерде basic папкасынан бастайды. (корневая папка)
'languages' => array_keys(Yii::$app->params['langs'])

Қай тілдерге аударылу керек екенін көрсетеді.
'messagePath' => __DIR__ . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . 'messages',

Аудармаларды қай жерге сақтау керек екенін қөрсетіміз. Әріне messages папкасы.

Әзірше сөздерді жинап беретін скрипт (код) дайын. Бірақ оны қолданатын команда әлі жоқ.

php yii message config/i18n.php командасын қолдану

basic папкасындада messages папкасын ашу керек. config/i18n.php өздігімен оны аша алмайды. Аудармалар сол жерге жиналады.
Келесі әрекеттер консольда іске асырылады. Серверде консоль болмаса, локалкада істеуге болады. Мен барлық жұмыстарды локалда атқарып, кейін серверге құямын.

сонымен
php yii message config/i18n.php командасы. Толығырақ мына суретте.

php yii message config/i18n.php командасы

Алдымен консольга проект қайда жатқанын көрсету керек. Кейін команданы қолданамыз.


Мына жоғарыдағы сүретте айтқандай i18n компоненті барлық папкаларды, файлдарды жүгіріп зертеп шығады.

Ал мына төмендегі сүретте скриптың аяқталуы.
php yii message config/i18n.php командасы: аяқталуы

i18n компоненті аудармаларды тілге, категорияға сай бөлек жинап қойған.
Қазақ тіліндегі аудармалар messages/kz/app.php файлында
Ағылшын тіліндегі аудармалар messages/en/app.php файылында
Орыс тіліндегі аудармалар messages/ru/app.php файылында

Әріне i18n өзі аудармайды. Бізге ыңғайлы форматқа жинап қояды.

Әзірше аудармаларды жинап беретін қоманда дайын. Проект өзгерген сайын, жаңа сөздер қосылған сайын осы команда арқылы бір жерге жинауға болады.

Жиналған мәтіндерді аударып шығу

app.php файлдың ішкі құрылысы осындай
return [
    'Байланыс' => '',
    'Бастапқы' => '',
    'Біз туралы' => '',
    'Кіру' => '',
    'Мекеме' => '',
    ...

Әр файлды өз тіліне сай аударып шығу керек.

Мысалы:
messages/en/app.php
return [
    'Байланыс' => 'Contact',
    'Бастапқы' => 'Home',
    'Біз туралы' => 'About',
    ...

messages/ru/app.php
return [
    'Байланыс' => 'Контакты',
    'Бастапқы' => 'Главная',
    'Біз туралы' => 'О нас',
    ...


Yii-дың өзінде Yii::t('yii', 'text') секілді, 'yii' категориясымен аударылылған сөздер бар. Ол vendor\yiisoft\yii2\messages папкасында орналасқан. Ол енді ядро. Орыс, ағылшын тілінде ешқандай проблема жоқ. Ал қазақшаға келгенде ол жоқ, себебі казақ тілі kk папкасында орналасқан. Сондықтан менде 2 шешім бар.

Біріншісі: қазақ тілін kk деп ауыстыру, сайт казақ тілінде www.site.kz/kk түрінде ашылатын болады.

Екіншісі: vendor\yiisoft\yii2\messages\kk папкасын vendor\yiisoft\yii2\messages\kz өзгерту. Ядроны өзгерткен дұрыс емес, бірақ ең оңай жолы осы.

Өзім екінші жолын таңдаймын.

Тағы айтып өтейін бұл мен қолданатын әдіс. Локализацияға Yii2 ұсынған мүмкіндіктердің 50% ғана қолданған сияқтымын. Барлығын зертеуге уақыт болмай жүр. Қалған 50%-ды меңгеріп жатсам қол тисе, 3-ші бөлім деп жалғасын жазармын мақаланы :) Тілдер туралы осы 2 мақала болады. Әрі қарай мақалалар Yii2 басқа мүмкіндіктері туралы болады.

Осымен болды. Енді сайтымыз көптілді.

Проектке енгізілген өзгерістерді мына коммитте көре аласыз

  • +3
1 пікір
Center
Тамаша мақала, анық жазылған. Көп рахымет
Тек тіркелген қолданушылар ғана пікір қалдыра алады.