2015-08-04 6 views
1

Я использую PHP Gettext с .mo-файлами (используя PoEdit) для перевода с французского (fr_FR.UTF-8) на английский (en_US.UTF-8), и он отлично работает , но не все строки переведены! Я не говорю о том, что акценты не переведены правильно с UTF-8, некоторые целые строки просто не переведены.Gettext не переводит каждую строку

Я извлек французские строки для перевода из всех моих 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 protected]>, 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 ...?

ответ

0

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

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

Решение заключается в создании.мо-файл с опцией «--no-хэш»:

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

Я хотел PoEdit сделать это сам по себе, но я не нашел каких-либо параметр, как это ...

Смежные вопросы