Превод на уебсайт с помощта на gettext
Доста често уеб разработчиците са изправени пред необходимостта да преведат сайта на няколко езика, за да направят сайта многоезичен. Много уеб чираци използват база данни за съхраняване на преводи, като по този начин създават допълнително и ненужно натоварване върху нея. Достъпът до файловата система има по-висока скорост, но създава необходимост от правилно организиране на съхранението и четенето на преводите. За щастие, PHP вече има най-оптималния механизъм за получаване на текст за такива цели, който не само работи с файловата система, но и с вече компилирани файлове, осигурявайки най-добра производителност.
Функциите Gettext изпълняват API на NLS (Поддръжка на родния език). Официалната документация е на gnu.org. Модулът изисква пакетът gettext да работи. Може да се инсталира от хранилищата, например в дистрибуциите на Debian ще бъде така:
sudo apt-get инсталирате gettext
Можете да проверите версията на инсталирания пакет с командата:
Приложение
Най-простият пример за използване на gettext в PHP:
ехо _ ("съобщение");
Думата „съобщение“ се търси в библиотеката за преводи и, ако е налична, се показва намереният превод, в противен случай се показва оригиналната дума „съобщение“.
Самите преводи се съхраняват без значение къде, най-важното е, че те са достъпни за кода. За удобство ще ги поставим в корена на сайта в папката langs. Нека има 3 езика: немски, английски и руски. Структурата на папките на окончателните езици ще бъде следната:
.
├── de_DE
│ └── LC_СЪОБЩЕНИЯ
│ ├── de_DE.mo
│ └── de_DE.po
├── en_US
└── ru_RU
└── LC_СЪОБЩЕНИЯ
├── ru_RU.mo
└── ru_RU.po
* .Po файловете съдържат преводи в текстова форма, * .mo - техните компилирани версии. Удобно е да използвате техния локал в името на файла. Тези файлове не са необходими за английския език, тъй като ние ще напишем всички ключове в кода в него. За ключове можете да използвате всеки друг език, стига кодирането да позволява, но ако сайтът е международен, е много желателно да използвате английски.
Структурата на po файловете е проста:
msgstr "съобщение"
msgstr "съобщение"
Информацията за услугата е написана в началото на файла, например за руския език можете да напишете това:
"Дата на създаване на POT: 2016-04-10 17: 15 + 0500 \ n"
"Дата на ревизия на PO: 2016-04-29 02: 14 + 0500 \ n"
"Последен преводач: Сергей \ n"
"Език: ru_RU \ n"
"MIME-версия: 1.0 \ n"
"Content-Type: text/plain; charset = UTF-8 \ n"
"Content-Transfer-Encoding: 8bit \ n"
"Форми за множествено число: nплурали = 3; множествено число ((n% 10 == 1 && n% 100! = 11? 0: n% 10> = 2 && n% 10 = 20)? 1: 2); \ n"
Низът "Форми за множествено число" определя правилата за форми за множествено число. По-долу в примера ще бъде анализиран по-подробно.
Свързване на файлове с преводи към проекта:
дефинирайте ('BASE_PATH', реална пътека (име на име (__FILE__)));
дефинирайте ('LANGUAGES_PATH', BASE_PATH. '/ langs');
putenv ("LC_ALL =". $ локал);
setlocale (LC_ALL, $ locale, $ locale. '.utf8');
bind_textdomain_codeset ($ locale, 'UTF-8');
bindtextdomain ($ locale, LANGUAGES_PATH);
textdomain ($ locale);
Тук руският език е свързан, за да се свърже друг език, той също трябва да бъде записан в променливата $ locale. Вземете го от настройките, зададени от потребителя, или от URL адреса на сайта - този избор зависи от характеристиките на вашия сайт.
Пример за използване в код:
echo mb_ucfirst (_ ('съобщение')). ". ". _ ('Съобщение'). ". ". _ ('Второ съобщение'). ". ". sprintf (_ ('Съобщение #% d'), 3). ". 4 '. ngettext ('съобщение', 'съобщения', 4). ". пет '. ngettext ('съобщение', 'съобщения', 5). „.“;
Ето шест повиквания за gettext:
- _ ('съобщение')
- _ ('Съобщение')
- _ ('Второ съобщение')
- _ ('Съобщение #% d')
- ngettext ('съобщение', 'съобщения', 4)
- ngettext ('съобщение', 'съобщения', 5)
Обаждания 1, 2 и 3 са възможно най-прости: има ключ, търси се превод. Позоваването 4 от тази позиция не се различава от предишните, единствената разлика е в последващото използване:% d се вмъква, за да замести числата там, например, използвайки sprintf. Можете също така да използвате всякакви други ключови думи за тяхното последващо заместване, например "% username%", и да ги замените по-късно с помощта на str_replace, най-важното е да не ги превеждате. 5 и 6 използва форми за множествено число.
Функцията mb_ucfirst е написана самостоятелно, тъй като ucfirst не работи добре с unicode. С надеждата, че някой ден ще има естествена функция mb_ucfirst преди да дефинира функцията, се прави проверка за нейното съществуване. Понякога трябва да използвате една и съща дума в различни регистри, в такива случаи подобни функции помагат.
ако (! function_exists ('mb_ucfirst')) функция mb_ucfirst ($ string) връща mb_strtoupper (mb_substr ($ string, 0, 1, 'UTF-8'), 'UTF-8'). mb_substr ($ низ, 1, mb_strlen ($ низ), 'UTF-8');
>
>
В резултат на това нека файлът langs/ru_RU/LC_MESSAGES/ru_RU.po бъде такъв (датите ще се променят автоматично от софтуера, описан по-долу):
msgstr "
msgstr "
"Дата на създаване на POT: 2016-04-10 17: 15 + 0500 \ n"
"Дата на ревизия на PO: 2016-04-29 02: 14 + 0500 \ n"
"Последен преводач: потребителско име \ n"
"Език: ru_RU \ n"
"MIME-версия: 1.0 \ n"
"Content-Type: text/plain; charset = UTF-8 \ n"
"Content-Transfer-Encoding: 8bit \ n"
"Форми за множествено число: nплурали = 3; множествено число ((n% 10 == 1 && n% 100! = 11? 0: n% 10> = 2 && n% 10 = 20)? 1: 2); \ n"
msgstr "Второ съобщение"
msgstr "Второ съобщение"
msgstr "Съобщение #% d"
msgstr "Съобщение #% d"
msgstr "съобщение"
msgstr [1] "съобщения"
msgstr [0] "съобщение"
msgstr [1] "съобщения"
msgstr [2] "съобщения"
Третият запис („съобщение“) обхваща повиквания 1, 5 и 6, първият и вторият обхващат 3 и 4. Няма да бъде намерен превод за обаждане 2, тъй като чувствителност към регистъра.
Третият запис е най-интересният тук, защото описва форми за множествено число. Правилата са описани в началото на файла под "Plural-Forms".