Drupal中Drupal.t() JavaScript翻译函数失效问题求助
Drupal自定义模块JS翻译失效的解决思路
模块的PHP控制器、模板层翻译都正常,但JS里用Drupal.t()就是拿不到翻译,window.drupalTranslations里也找不到对应词条,给你几个排查方向:
1. 手动把JS要用的翻译词条同步到前端
Drupal不会自动把所有后端翻译词条传到JS里,得明确告诉系统哪些词条要给JS用:
- 在模块的
.module文件里,用#attached把翻译字符串塞进drupalSettings:
// 比如在hook_page_attachments里添加 function mybestmodule_page_attachments(array &$attachments) { $attachments['#attached']['library'][] = 'core/drupal.i18n'; $attachments['#attached']['drupalSettings']['locale']['translation']['strings']['mybestmodule.greeting'] = t('mybestmodule.greeting')->render(); }
或者在定义JS库的时候直接绑定翻译:
function mybestmodule_library_info_build() { $libraries['mybestmodule.main'] = [ 'js' => [ 'js/mybestmodule.js' => [], ], 'dependencies' => [ 'core/drupal', 'core/drupalSettings', 'core/once', 'core/jquery', ], 'translations' => [ 'mybestmodule.greeting' => t('mybestmodule.greeting')->getUntranslatedString(), ], ]; return $libraries; }
2. 让locale模块扫描到JS里的翻译词条
运行drush locale:check的时候,得确保系统扫到了JS文件里的mybestmodule.greeting:
- 在
mybestmodule.info.yml里加一行,指定要扫描的JS文件:
interface translation files: - js/mybestmodule.js
加完再跑drush locale:check && drush locale:update,看看后台翻译页面里有没有这个词条的JS版本。
3. 检查前端的drupalSettings有没有加载翻译
打开页面源代码,搜drupalSettings.locale.translation.strings,看看有没有mybestmodule.greeting。要是没有,说明词条没传过来:
- 也可以在模块的Twig模板里手动塞:
{% set greeting_trans = 'mybestmodule.greeting'|t %} {{ drupalSettings_add('locale.translation.strings.mybestmodule.greeting', greeting_trans) }}
4. 清缓存+确认翻译状态
- 先去
/admin/config/regional/translate确认这个法语翻译是已完成状态,法语也得是启用的语言。 - 跑
drush locale:update && drush cr full,彻底清一遍缓存,有时候缓存残留会搞事情。
5. 检查JS代码的执行时机
虽然用了Drupal.behaviors,但还是确认下drupalSettings是不是已经加载完了:
(function ($, Drupal, once) { Drupal.behaviors.myBestModule = { attach: function (context, settings) { once('myBestModule', 'body', context).forEach(function () { // 先打log看看drupalSettings里有没有翻译 console.log(settings.locale?.translation?.strings['mybestmodule.greeting']); console.log(Drupal.t('mybestmodule.greeting')); }); } }; })(jQuery, Drupal, once);
6. 重新导入翻译文件试试
要是上面都没用,试试删除现有翻译,重新导入PO文件:
- 去
/admin/config/regional/translate/import,选法语,上传mybestmodule.fr.po,导入后再清缓存。
内容的提问来源于stack exchange,提问作者Hasina Njaratin
相关产品推荐
相关产品推荐

