Как я могу отлаживать php gettext?

Некоторые ключи gettext у меня не работают - вместо перевода показывает ключ, хотя он есть. Я делаю файл .mo с библиотекой PHP File_Gettext Pear, и, похоже, он работает нормально, поэтому я сделал следующий скрипт, чтобы попробовать, какие клавиши не работают нормально:

$locale = 'en_GB';
$domain = 'messages';

setlocale(LC_ALL, $locale);
putenv("LC_ALL=".$locale);
bindtextdomain($domain, "D:/_gt");
bind_textdomain_codeset($domain, 'UTF-8');
textdomain($domain);

$mocreator = new File_Gettext_MO();
$mocreator->load('D:/_gt/en_GB/LC_MESSAGES/messages.mo');

foreach ($mocreator->strings as $key => $value) {
    if ($value == gettext($key)) {
        var_dump("ok");
    } else {
        var_dump($key, $value, gettext($key));
    }
}

Из вывода выше я вижу, что некоторые ключи работают — я вижу много ok — а некоторые нет, что приводит к следующему:

string 'Cancelled' (length=9)
string 'Storniert' (length=9)
string 'Cancelled' (length=9)

Итак, в файле есть перевод, но gettext почему-то не может его использовать.


person Fluffy    schedule 17.06.2011    source источник
comment
Проверьте файл перевода. Я думаю, что gettext более точен, чем File_Gettext_MO. Найдите там строку Cacnelled, возможно, вы ее видите. Возможно, вы также захотите добавить часть из вашего MO-файла в вопрос.   -  person hakre    schedule 17.06.2011
comment
@hakre, я вижу там и Cancelled, и Storniert. Какую часть файла добавить?   -  person Fluffy    schedule 17.06.2011
comment
Что это за библиотека? File_Gettext Груша? Я нигде не могу найти File_Gettext_MO.   -  person Gazzer    schedule 26.08.2011


Ответы (1)


Теперь это довольно старый вопрос, и я должен указать, что я не очень хорошо разбираюсь в конкретных вопросах gettext. Но у меня были некоторые проблемы с ключами массива в виде строк и кодировок.

D:/_gt создается впечатление, что вы используете какую-то Windows, и, если я не ошибаюсь, все версии Windows по умолчанию используют latin-1-"with-special-locale". Я считаю, что проблема может быть связана с кодировкой, поскольку вы указываете файл как utf8, но я не могу вам помочь без файла .mo. Но попробуйте поменять местами операторы putenv и setlocale.

Или пробелов не хватает? Может ли правильный ключ быть " Cancelled"?

Но, как кто-то сказал в комментариях, без файла .mo это всего лишь догадки.

Если вы уже нашли свой собственный ответ, пожалуйста, добавьте его, чтобы помочь остальным пользователям Интернета! :D

person flindeberg    schedule 27.06.2011
comment
Похоже, это не проблема Windows, поскольку на сервере есть тот же скрипт с таким же поведением. Как вы можете видеть в выводе, пробелы в порядке. На самом деле, я не нашел решения для этого - я просто сейчас использую DB + memcached, который, кажется, работает довольно хорошо. - person Fluffy; 29.06.2011
comment
Также я пытался найти какую-то закономерность, при которой ключи не работают - типа появляется многобайтный символ и все последующие ключи ломаются. Но в то время как ключи упорядочены в файле по алфавиту, те, которые не работают, находятся в случайных местах. - person Fluffy; 29.06.2011