Gettext не переводит каждую строку

Я использую 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...?


person Ecorce    schedule 04.08.2015    source источник


Ответы (1)


Я нашел ответ, наконец! Благодаря этому сообщению (французское сообщение): решение

Gettext, похоже, не поддерживает правильные акценты или символы UTF-8 в msgid (или что-то в этом роде).

Решение состоит в том, чтобы сгенерировать файл .mo с опцией «--no-hash»:

msgfmt --no-hash default.po -o default.mo

Я бы хотел, чтобы PoEdit делал это сам, но я не нашел такой настройки...

person Ecorce    schedule 04.08.2015
comment
Более простое решение — добавить параметр --no-hash в расширенные настройки xgettext в PoEdit, чтобы он делал это сам при компиляции. - person Ecorce; 07.06.2019