2012-07-03 1 views
2

У меня есть проект symfony, в котором я прошел через мои шаблоны ветви и добавил {% trans %}...{% endtrans %} или добавил переводы, например {{ title|trans }}. Я также добавил файл messages.de.xliff и отлично работает для нескольких переводов, которые я пробовал.Возможно ли, что в файле symfony2 log отсутствуют строки перевода, чтобы я знал, что нужно добавить в мои файлы xilff?

Есть ли способ получить список строк, отсутствующих в моем файле xliff? Очень сложно отслеживать каждый перевод, когда я его добавляю. Кажется, что он должен регистрировать неудачу, чтобы получить перевод в файле журнала где-то, но я уже давно искал и не могу найти ничего.

ответ

1

Это очень дрянной патч для применения в vendor/symfony, который делает то, что мне нужно. Вероятно, не нужно запускаться на производственном сервере!

diff --git a/src/Symfony/Component/Translation/MessageCatalogue.php b/src/Symfony/Component/Translation/MessageCatalogue.php 
index b55676f..98a5cba 100644 
--- a/src/Symfony/Component/Translation/MessageCatalogue.php 
+++ b/src/Symfony/Component/Translation/MessageCatalogue.php 
@@ -128,6 +128,8 @@ class MessageCatalogue implements MessageCatalogueInterface 
      return $this->fallbackCatalogue->get($id, $domain); 
     } 

+  error_log('Translation not found: "' . $id . '"'); 
+ 
     return $id; 
    } 
0

Мое решение было перезаписать Translator и MessageCatalogue классы.

Переводчик:

class RegisteringTranslator extends \Symfony\Component\Translation\Translator 
{ 
    protected function loadCatalogue($locale) 
    { 
     parent::loadCatalogue($locale); 

     if (! $this->catalogues[$locale] instanceof RegisteringMessageCatalogue) { 
      $registeringCatalogue = new RegisteringMessageCatalogue($locale); 
      $registeringCatalogue->addCatalogue($this->catalogues[$locale]); 
      $this->catalogues[$locale] = $registeringCatalogue; 
     } 
    } 
} 

Каталог:

class RegisteringMessageCatalogue extends \Symfony\Component\Translation\MessageCatalogue 
{ 
    public function get($id, $domain = 'messages') 
    { 
     if (! $this->has($id, $domain)) { 
      error_log('Translation not found: "' . $id . '"'); 
     } 

     return parent::get($id, $domain); 
    } 

} 

Конечно, вы должны использовать новый класс переводчика.

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

0

Я знаю, что это старый вопрос, но я публикую здесь на всякий случай, когда у кого-то все еще есть такая же проблема.

Начиная с Symfony 2.6 вы найдете очень приятное дополнение к панели инструментов веб-отладки, которая показывает, сколько переводов вам не хватает.

enter image description here

Щелкнув его, профайлер покажет подробный список пропавших без перевода.

Выполняется из коробки без какой-либо конфигурации.

0

Обычно вы должны использовать команду Symfony debug:translation через app/console.

Что-то вроде этого:

$ php app/console debug:translation --only-missing <locale> <Bundle Name> 

Конкретным примером может быть:

$ php app/console debug:translation --only-missing nl AppBundle 

Это выведет:

----------- ---------- ------------------------------------------------------------------------------------------------------- ------------------------------------------ 
    State  Domain  Id                          Message Preview (nl) 
----------- ---------- ------------------------------------------------------------------------------------------------------- ------------------------------------------ 
    missing messages Create a clean selection                    Create a clean selection 
    missing messages New Selection                       New Selection 
    missing messages login.labels.geoserver_url                    login.labels.geoserver_url 
Смежные вопросы