Como obtenho cadeias traduzidas em Drupal.locale.strings?

9

Então, eu estou tentando usar a função Drupal.t () em alguns dos meus códigos Javascript personalizados (no meu tema).

Como obtenho as strings necessárias no objeto Drupal.locale.strings? Eu vejo algumas strings lá, mas é claro que todo o banco de dados não pode ser carregado. Qual é a melhor maneira de adicionar a isso? Gostaria de usar a função PHP t () para que as seqüências adicionadas possam ser editadas na interface do Translate.

JonMcL
fonte

Respostas:

8

O Drupal manipula o preenchimento das seqüências necessárias no objeto javascript. Assim como toda a coleção de strings não é carregada em todas as páginas, apenas as strings necessárias são adicionadas ao JavaScript.

Acredito que isso seja feito percorrendo os arquivos de script antes que eles sejam realmente adicionados à página.

Portanto, se você adicionar Drupal.t('Some string');ao seu código JavaScript, poderá traduzi-lo na interface de tradução.

googletorp
fonte
Bem, então isso não está acontecendo. (a passagem do script para encontrar as chamadas Drupal.t ()). Estou adicionando o script por meio do arquivo .info do tema (scripts [] = scripts / script.js). Talvez eu tenha que adicionar via drupal_add_js ()?
JonMcL 02/02
Você está certo. Eu tive que rastrear para obter um entendimento completo, mas isso realmente acontece automaticamente. No Drupal 7, a função é locale_js_alter () (em locale.module). Ele usa a lista completa de arquivos Javascript e analisa cada um em _locale_parse_js_file (). Tenha cuidado para garantir que file_get_contents () possa carregar seu arquivo JS com o caminho fornecido (ou seja, não inicie seu caminho com um / se estiver na sua pasta de temas). Você pode usar drupal_add_js ou a configuração de scripts [] no arquivo .info do seu tema. Obviamente, certifique-se de limpar os caches e traduzir a string! :)
JonMcL 3/12/12
6

Acabei de encontrar o mesmo problema hoje e o pesquisei um pouco mais. Chris acima tem um bom comentário, mas está incorreto. Você não precisa usar o Drupal.behaviors para que ele funcione.

Conforme observado pelo próprio JonMcL em seu último comentário, a função _locale_parse_js_file em locale.inc é responsável pela análise dos padrões Drupal.t ("somestring") a partir da linha 1493 (no Drupal 7.22):

preg_match_all('~
[^\w]Drupal\s*\.\s*t\s*                       # match "Drupal.t" with whitespace
\(\s*                                         # match "(" argument list start
(' . LOCALE_JS_STRING . ')\s*                 # capture string argument
(?:,\s*' . LOCALE_JS_OBJECT . '\s*            # optionally capture str args
  (?:,\s*' . LOCALE_JS_OBJECT_CONTEXT . '\s*) # optionally capture context
?)?                                           # close optional args
[,\)]                                         # match ")" or "," to finish
~sx', $file, $t_matches);

É apenas uma função de análise "burra" que não se preocupa com a semântica e simplesmente encontra todas as instâncias do Drupal.t ("alguma coisa") em qualquer arquivo que recebe.

O que poderia ser uma pegadinha comum é que você precisa ter toda a string no seu código-fonte no formato Drupal.t ("translateme"), porque (obviamente) nenhum javascript é executado quando o arquivo é aberto através de file_get_contents no php. Isso significa que você nunca pode executar o Drupal.t (algo variável) e torcer para que o Drupal pegue todas as variáveis ​​javascript contendo strings que você lança no Drupal.t.

Se você deseja traduzir "mulheres" para um gráfico e fornecer um contexto à string, a sintaxe seria:

Drupal.t("women", {}, {context: "charts"}

Além disso, se você tiver o drush instalado, verifique se o arquivo js foi analisado com o comando;

drush vget javascript_parsed

Então você pode limpar seu cache com

drush cc all

... e repita o comando vget acima para verificar se a lista de arquivos já analisados ​​está vazia. Dessa forma, seu arquivo será reparado na próxima execução (verifique isso também).

user19814
fonte
11
Obrigado por drush vget javascript_parsed! Uma maneira mais rápida de forçar a reconstrução dos arquivos de script de traduções é removendo os arquivos CSS e JS usando drush @sitealias cc css-js.
Lmeurs
0

Algumas dicas que encontrei ao implementar JS multilíngue no Drupal 7:

  1. Primeiro, verifique se o seu arquivo JS não está sendo incluído inline . A partir do Drupal 7.22, Drupal.locale.stringsnão parece se atualizar automaticamente se você estiver incorporando arquivos JavaScript no Drupal . A interface de tradução ainda pegou a string de qualquer maneira, aumentando a minha confusão.

  2. Segundo, verifique se você está usando o Drupal.behaviors para anexar seu JS à página. O fechamento regular de JS não acionará a análise "mágica" de Drupal de Drupal.t()invocações. Tecnicamente, isso é algo que você deve fazer;)

A partir daí, é realmente muito indolor. Use apenas o Drupal.t()texto que você deseja traduzir, limpe seu cache sempre que atualizar o arquivo e seus tradutores deverão ver a nova string na interface em /admin/config/regional/translate/translate. É muito bom quando você faz isso funcionar.

Chris Ruppel
fonte