如何在CoffeeScript页面访问Rails locales文件中的字符串?
在CoffeeScript中访问Rails I18n本地化字符串的正确方式
你遇到的问题很典型——t()是Rails后端视图的Helper方法,CoffeeScript作为前端脚本文件,根本没法直接调用后端的Ruby方法,所以才会报undefined method 't'的错误。下面给你几种靠谱的解决方案:
方法1:通过全局变量注入本地化内容
在你的ERB布局文件(比如application.html.erb)里,把I18n的翻译内容转成JSON并挂载到全局window对象上:
<script> window.I18n = <%= raw I18n.backend.send(:translations).to_json %>; // 也可以只注入需要的部分,减少体积: // window.ShareLocales = <%= raw { share_message: t('share_message') }.to_json %>; </script>
之后在CoffeeScript里就能直接访问了:
# 直接访问指定locale的字符串 shareMessage = I18n.en.share_message # 如果要适配当前应用的locale,更通用的写法 shareMessage = I18n[I18n.locale].share_message
方法2:通过DOM的data属性传递单个字符串
如果只是需要这一个share_message字符串,更轻量的方式是在视图里把它放到某个DOM元素的data属性中:
<!-- 随便找个合适的元素,比如页面的共享按钮容器 --> <button id="share-btn" data-share-text="<%= t('share_message') %>">分享</button>
然后在CoffeeScript里读取这个属性:
# 原生JS写法 shareMessage = document.getElementById('share-btn').dataset.shareText # 如果你用jQuery的话 shareMessage = $('#share-btn').data('shareText')
方法3:使用专门的gem管理前端I18n
如果你的前端需要大量使用本地化字符串,推荐用i18n-js这个gem。它能自动把Rails的config/locales下的文件编译成前端可用的脚本,让你能在CoffeeScript里用和后端几乎一样的语法调用:
shareMessage = I18n.t('share_message')
具体的安装和配置可以参考gem的官方文档,步骤很简单,适合中大型项目的多语言场景。
内容的提问来源于stack exchange,提问作者satish
相关产品推荐
相关产品推荐

