新手问题 I18n 当 locale 是 en 如何不翻译?

dreamable · 2013年04月14日 · 最后由 kgen 回复于 2013年04月14日 · 2723 次阅读

默认的 Locale 是 EN,支持 ZN,并提供了 zh.yml。当 Locale 是 ZH 的时候没有问题,但是当是 EN 的时候报 translation missing 错误。例如 t("hello") zh.yml hello: 你好 en.yml // 空文件

我知道在 en.yml 中加入 "hello: hello"可以解决问题。但是这不是很傻么?能不能设置一下,让 I18n 在默认 locale 下直接用显示,不再报错?

谢谢。

但是这不是很傻么? 哪里傻... en.yml 是空的话你让 i18n 怎么显示 显示什么...

PS. t("hello") 这个 hello 只是个 key 而已...

#1 楼 @leozwa 就是不翻译,显示 key 啊。English 是默认语言,代码里面就用英语写的,没必要再翻译一遍啊。

#2 楼 @dreamable 用 key ?那这么说,假设有一句很长的话需要 I18n,你的 key 也是和原文一样长咯?

<% if params[:locale] == 'en' %>
  <p>Hello</p>
<% else %>
  <p><%= t('.hello') %></p>
<% end %>

当然我认为这纯属蛋疼......

#1 楼 @leozwa 楼主说得在理,Cocoa 的 I18n 就可以这样

你可以定义一个 I18n 的 exception_handler:

I18n.exception_handler = CustomizeI18nExceptionHandler.new

class CustomizeI18nExceptionHandler
  def call(exception, locale, key, options) 
    if exception.is_a?(MissingTranslation) && locale == I18n.default_locale
      return key
    end
  end
end

不过如果是有比较多的 i18n 内容项目,我建议是将内容放到数据库或者其他存储,方便修改,有很多 i18n 的 backend,比如 redis,activerecord。你复写一下 backend 的 lookup 方法,也可以实现上面的用途,毕竟用 exception_handler 不是正途。

#5 楼 @huacnlee 原来是这样... 可是如果写好的 app 要拿去做翻译 不就得去 view 里面一句一句挖出来了么...

#7 楼 @leozwa 早年的桌面级开发都这样,所有的字符串资源挖出来,一条条做多国语言翻译。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号