如何将字符串转换为Drupal.locale.strings?


9

因此,我尝试在某些自定义Javascript代码中使用Drupal.t()函数(以我的主题为准)。

如何获取需要在Drupal.locale.strings对象中填充的字符串?我在其中看到了一些字符串,但是当然无法加载整个数据库。最佳添加方式是什么?我想使用PHP t()函数,以便可以在Translate界面中编辑添加的字符串。

Answers:


8

Drupal处理将需要的字符串填充到javascript对象中。就像不是在每个页面上都加载了整个字符串集合一样,仅将所需的字符串添加到JavaScript中。

我相信这是通过在将脚本文件实际添加到页面之前遍历脚本文件来完成的。

因此,如果您添加Drupal.t('Some string');到JavaScript代码中,则应该能够在翻译界面中对其进行翻译。


好吧,那不会发生。(遍历脚本以查找Drupal.t()调用)。我通过主题的.info文件添加脚本(scripts [] = scripts / script.js)。也许我必须通过drupal_add_js()添加?
JonMcL '02

你是对的。我必须进行跟踪以完全理解,但这确实是自动发生的。在Drupal 7中,该函数是locale_js_alter()(在locale.module中)。它使用Javascript文件的完整列表,并在_locale_parse_js_file()中解析每个文件。请注意确保file_get_contents()可以使用提供的路径加载JS文件(即,如果位于主题文件夹中,则不要以/开头)。您可以在主题的.info文件中使用drupal_add_js或scripts []设置。当然,请确保清除缓存并转换字符串!:)
JonMcL '02

6

今天就遇到了同样的问题,并对其进行了更多研究。上面的克里斯(Chris)给出了很好的评论,但这最终是不正确的。您无需使用Drupal.behaviors即可工作。

正如JonMcL自己在最后的评论中指出的那样,locale.inc中的函数_locale_parse_js_file负责解析从第1493行(在Drupal 7.22中)开始的Drupal.t(“ somestring”)模式:

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);

它只是一个“哑”解析函数,不关心语义,而只是在接收到的任何文件中查找Drupal.t(“ something”)的所有实例。

可能的常见陷阱是,您需要以Drupal.t(“ translateme”)形式在源代码中包含整个字符串,因为(显然)通过php中的file_get_contents打开文件时,不会执行任何javascript。这意味着您永远无法执行Drupal.t(somevariable),并希望Drupal能够捕获您在Drupal.t中抛出的所有包含字符串的JavaScript变量。

如果要翻译图表的“女性”并为字符串提供上下文,则语法为:

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

另外,如果您已经安装了drush,请使用以下命令验证您的js文件是否已解析:

drush vget javascript_parsed

然后,您可以使用

drush cc all

...并重复上面的vget命令以验证已解析文件的列表为空。这样,您的文件将在下次运行时得到重新解析(也要进行验证)。


1
谢谢drush vget javascript_parsed!强制重建翻译脚本文件的更快方法是使用删除CSS和JS文件drush @sitealias cc css-js
lmeurs 2014年

0

在Drupal 7中实现多语言JS时遇到的一些陷阱:

  1. 首先,请确保您的JS文件未包含在内。从Drupal 7.22开始,Drupal.locale.strings如果要在Drupal中内联JavaScript文件,似乎并不会自动更新。无论如何,翻译界面仍然会选择字符串,这使我更加困惑。

  2. 其次,确保您正在使用Drupal.behaviors将JS附加到页面上。常规的JS关闭不会触发Drupal的Drupal.t()调用“魔术”解析。从技术上来说,这是您应该做的事情;)

从那里开始,这确实很轻松。只需Drupal.t()在要翻译的文本周围使用,每次更新文件时清除缓存,翻译人员应在界面上看到新的字符串/admin/config/regional/translate/translate。一旦开始工作,那就太好了。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.