【问题标题】:I18n - locale file - use ruby - use translation()I18n - 语言环境文件 - 使用 ruby​​ - 使用翻译()
【发布时间】:2018-10-27 08:07:58
【问题描述】:

I18n locale file(例如el.yml)中:

  • 我可以使用translation 方法来使用已经定义的翻译吗?
  • 我可以在里面使用ruby code吗?

例如,在locale yml file中,有几个地方我要使用“Invalid”这个词。所以一种方法是每次都翻译“无效”这个词

另一种方法是translate it once,在顶部,然后在包含这个词的语言环境 yml 内的每个翻译中,我可以使用类似 t(:invalid)..

例如:

el:
  # global translations - in order to be used later in the file
  locked: 'kleidomeno'
  invalid: 'mi egiro'
  password: 'kodikos'

  devise:
    failure:
      invalid: "#{Invalid} %{authentication_keys} or #{password}."
      locked: "Your account is #{locked}."
      last_attempt: "You have one more attempt before your account is #{locked}."
      not_found_in_database: "#{invalid} %{authentication_keys} ή #{password}."

【问题讨论】:

  • 为什么要在 I18n 文件中使用 Ruby?你能解释一下你想要达到的目标吗?
  • 亲爱的@spickemann,我在上面的问题中添加了澄清......

标签: ruby-on-rails ruby internationalization translation


【解决方案1】:

我可以使用翻译方法来使用已经定义的翻译吗?

是的,这就是 I18n 翻译的目的,例如

t 'something'

我可以在里面使用 ruby​​ 代码吗?

不,它是一个 .yml 文件,不接受 Ruby 或任何其他编程语言。

另一种方法是翻译一次

要翻译一次,你可以编写一个新的 Rake 任务来为你生成目标 yml。

或者,也许,用一个新方法包装官方翻译函数,它可以识别你的自定义字符串语法:

# custom translate
def ct(msg)
  msg.gsub(/#\{\s*([^\}]+)\s*\}/) {|_| t $1}
end

这样称呼:

ct 'Your account is #{locked}.'

如果是这样,我认为您最好从 yml 文件中删除这些失败字符串。

【讨论】:

  • 非常感谢您的回复对于第一个问题,我想澄清一下,我的意思是在 locale.yml 文件中。例如,在几个地方我想使用“无效”这个词。所以一种方法是每次翻译“无效”这个词另一种方法是在顶部翻译一次,然后在包含这个词的语言环境 yml 内的每个翻译中,我可以使用类似 t(:invalid).. .
  • @AndreasGortsilas 这里的 once 是什么意思?如果您只想为您的网站配置一种语言,您可以只使用一种 .一旦您必须同时支持多种语言,您仍然必须为每个访问者确定语言。根据您的描述,您似乎希望在访问者到来后翻译所有世界,并将它们放入会话全局变量中,这在我的选择中有点麻烦,因为在这个会话中浪费了很多翻译。
  • 亲爱的 @hxpax,我添加了 locale.yml 文件的示例部分,希望您现在明白我在问什么...
  • 亲爱的@hxpax,非常感谢您的宝贵时间和精力
  • 亲爱的@hxpax 还有一个问题,如果我遵循ct method 方法,每次运行时需要翻译时都会调用它吗?或者它被称为有些不同?我想知道这种做法是否严重performance issues。这是否与原始 t method 用于处理将变量传递给翻译的方法相同,例如我的示例代码中的 authentication_keys
猜你喜欢
  • 2021-08-15
  • 2012-03-25
  • 1970-01-01
  • 2023-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-15
  • 1970-01-01
相关资源
最近更新 更多