Я использую PHP Gettext с файлами .mo (используя PoEdit) для перевода с французского (fr_FR.UTF-8) на английский (en_US.UTF-8), и он отлично работает, но не все строки переводятся< /сильный> ! Я не говорю о неправильном переводе акцентов с помощью UTF-8, некоторые целые строки просто не переводятся.
Я извлек французские строки для перевода из всех моих файлов PHP - _("stringtotranslate") - благодаря скрипту оболочки:
find . -iname "*.php" | xargs xgettext -j --from-code=UTF-8 -o locale/default.pot
default.pot был сгенерирован со всеми правильными строками, ни одна из них не пропущена. Из этого файла .pot я создал файл default.po для английской версии. Этот .po находится в UTF-8, и файлы PHP, где они мне нужны, тоже в UTF-8 (без спецификации).
С кешем проблем нет: я называю файл .mo по-разному для каждой модификации ('default_' + filemtime).
Что я могу заметить:
- Короткие строки без символа utf-8 переводятся.
- Длинные строки или содержащие символы utf-8 (французские акценты) не переводятся... но я нашел пример короткой строки без акцента, тоже не переведенной... (другого примера не нашел).
Я установил локаль в соответствии с моим сервером (Apache 1.3.37, PHP 4.4.4, --with-gettext). Локаль является динамической в зависимости от флага, нажатого на веб-сайте, вот английская версия:
putenv('LANGUAGE=eng');
setlocale(LC_ALL, 'en_US.UTF-8');
bindtextdomain('default', './locale');
bind_textdomain_codeset('default', 'UTF-8');
textdomain('default');
Как я уже сказал, некоторые строки правильно переведены на английский язык, но не все строки.
Вот сайт на английском языке: http://librairiedescarres.com/2015/en/
Вот часть файла .po:
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
msgid ""
msgstr ""
"Project-Id-Version: Librairie des Carrés\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-08-03 14:57+0200\n"
"PO-Revision-Date: 2015-08-04 10:08+0200\n"
"Last-Translator: \n"
"Language-Team: \n"
"Language: en\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: Poedit 1.8.2\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Poedit-SourceCharset: UTF-8\n"
#: about-us.php:10 about-us.php:31
#, php-format
msgid ""
"Initialement spécialisé dans l'histoire des sciences et des voyages, notre stock est aujourd'hui largement diversifié : "
"%slivres illustrés%s, %shistoire%s, %sagriculture%s, %sjardinage et architecture%s, %smédecine%s, %sbibliophilie%s, "
"%slivres rares et curieux du XVème au XXème siècle%s."
msgstr ""
"Initially specialised in Travel and Science, our stock is now largely diversified and includes literature and "
"%sillustrated books%s, %shistory%s, %sagriculture%s, %sgardens and architecture%s, %smedicine%s, %sbibliophile%s and "
"%srare books from the XVth to the XXth century%s."
(...)
Я пробовал много решений, но никто не работает:
- Попробуйте другие локали, такие как: "en_US", "en_US.utf8", "en_US.utf-8"...
- putenv('LANG=fra'), putenv('LC_ALL=fra')...
- Принудительно используйте кодировку UTF-8 для созданного файла .mo с помощью Notepad++.
Есть ли решение? Есть ли проблемы с Apache, PHP или Gettext...?