solução alternativa poedit para gettext dinâmica
-
22-08-2019 - |
Pergunta
Eu comecei usando gettext para traduzir mensagens de texto e eu enviar para o usuário. Eu estou usando poedit como editor, mas eu estou lutando com mensagens dinâmicas.
Por exemplo eu tenho coisas como o login onde eu tenho uma variável que indica o tipo de erro.
$this->translate('page-error-' . $error);
Quando a atualização automática i de poedit este é lido como "page-de erros". O que eu faço é ter um arquivo onde eu fazer chamadas falsas para o método de traduzir com todas as chaves possíveis para tê-los adicionado na minha poedit quando atualização automática.
Eu particularmente não gosto desta situação. Como vocês fazê-lo.
Obrigado por suas idéias
Solução
Não - isso não é possível, porque o editor (e as ferramentas gettext
) está lendo suas fontes, não executar o seu programa. Você terá que manter as chamadas falsas ou adicionar as chaves para a tradução arquiva-se.
Outras dicas
Você está tentando algo como
$this->translate(sprintf('page-error-%s', $error));
me deparei com o mesmo problema.
Por exemplo, eu tenho
em php
//Gives FORM_HEADER_ADD or FORM_HEADER_EDIT
echo $this->translate('FORM_HEADER_' . strtoupper($this->data));
Quando eu sincronizar com poedit ele vai pegar 'FORM_HEADER_', que não é um identificador que eu tenho (gerado) no código.
Então, eu tive que corrigir o problema minhas dando PoEdit identificadores completos i resolvido que, ao fazer o seguinte em php
echo ($this->data === 'add') ? $this->translate('FORM_HEADER_ADD') : $this->translate('FORM_HEADER_EDIT');
ATUALIZAÇÃO!
Eu ficava olhando para esse problema. E eu atualmente desistiu de importação a partir da fonte. Isto é como eu continuar até eu encontrar uma solução melhor
- Aplicação de construir e usar o maior número de identificadores estáticos quanto possível.
-
Ativar registro de identificadores não traduzidas (dinâmicas)
protected function _initMyTranslate(){ $date = new Zend_Date(); $fileName = sprintf('/../logs/translation_%1$s.log', $date->toString('dd-MM')); $writer = new Zend_Log_Writer_Stream(APPLICATION_PATH . $fileName); $log = new Zend_Log($writer); // get the translate resource from the ini file and fire it up $resource = $this->getPluginResource('translate'); $translate = $resource->getTranslate(); // add the log to the translate $translate->setOptions( array( 'log' => $log, 'logUntranslated' => true ) ); // return the translate to get it in the registry and so on return $translate; }
-
Use Poedit a sincronia com fonte e traduzir as cordas que são encontrados.
- Durante os testes / depuração fase verificar o log para strings não traduzidas.
-
Adicione as strings não traduzidas para o arquivo .po.
msgid "IDENTIFIER" msgstr "TRANSLATION STRING"
-
po abrir e salvar-lo para criar o arquivo mo (Não sincronizar com a fonte OU tudo está perdido).
UPDATE 2.
Agora eu usar um arquivo separado para os meus identificadores manuais, usando um editor de texto (gedit / bloco de notas). Agora eu tenho dois arquivos:
- Auto gerada por poedit chamado
.po - arquivo editted manualmente chamado
_manual.po
Eu configurei meu traduzir em application.ini para procurar todos os arquivos no diretório do idioma
resources.translate.adapter = gettext
resources.translate.content = APPLICATION_PATH "/../library/languages/"
resources.translate.locale = auto ;use en to force english or nl for dutch..etc
resources.translate.scan = directory
resources.translate.options.disableNotices = false
Se você quiser traduzir para outro idioma em poedit fazer o arquivo -.> Novo catálogo de arquivo POT, e começar a traduzir suas cordas adicionados manualmente
Se você tem um número finito de erros, você pode adicionar algum código fictício dentro de uma condição if (false)
, cujo único propósito é ter PoEdit pegar as traduções.
Por exemplo:
if (false) {
_('role_visitor');
_('role_hiker_reader');
_('role_hiker');
_('role_translator');
_('role_proofreader');
_('role_moderator');
_('role_moderator_2');
_('role_moderator_3');
_('role_admin');
}
Você pode então traduzir com:
$translated_role = _('role_' . $role);
Créditos para: http://eng.marksw.com/2012/12/05/how-to-expose-dynamic-translatable-text-to-translation-tools-like-poedit/