Answers:
Drupal处理将需要的字符串填充到javascript对象中。就像不是在每个页面上都加载了整个字符串集合一样,仅将所需的字符串添加到JavaScript中。
我相信这是通过在将脚本文件实际添加到页面之前遍历脚本文件来完成的。
因此,如果您添加Drupal.t('Some string');
到JavaScript代码中,则应该能够在翻译界面中对其进行翻译。
今天就遇到了同样的问题,并对其进行了更多研究。上面的克里斯(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命令以验证已解析文件的列表为空。这样,您的文件将在下次运行时得到重新解析(也要进行验证)。
drush vget javascript_parsed
!强制重建翻译脚本文件的更快方法是使用删除CSS和JS文件drush @sitealias cc css-js
。
在Drupal 7中实现多语言JS时遇到的一些陷阱:
首先,请确保您的JS文件未包含在内。从Drupal 7.22开始,Drupal.locale.strings
如果要在Drupal中内联JavaScript文件,似乎并不会自动更新。无论如何,翻译界面仍然会选择字符串,这使我更加困惑。
其次,确保您正在使用Drupal.behaviors将JS附加到页面上。常规的JS关闭不会触发Drupal的Drupal.t()
调用“魔术”解析。从技术上来说,这是您应该做的事情;)
从那里开始,这确实很轻松。只需Drupal.t()
在要翻译的文本周围使用,每次更新文件时清除缓存,翻译人员应在界面上看到新的字符串/admin/config/regional/translate/translate
。一旦开始工作,那就太好了。