45

我想在那里使用在 yml 文件中声明的变量。例如,我site_name在下面声明并希望使用它description

en:
  site_name: &site_name "Site Name"
  static_pages:
    company:
      description: *site_name #this works fine
      description: "#{*site_name} is an online system" #this doesn't work

如何将*site_name变量与其他文本结合起来?

4

3 回答 3

68

简短的回答是,我相信,不,您不能按照您想要的方式在 YAML 中使用alias进行字符串插值。

在您的情况下,我要做的是在我的语言环境文件中包含以下内容:

en:
  site_name: "Site Name"
  static_pages:
    company:
      description: ! '%{site_name} is an online system'

然后以站点名称作为参数调用适当的视图:

t('.description', site_name: t('site_name'))

这会让你"Site Name is an online system"

但是,如果您迫切希望在 YAML 文件中使用别名将字符串连接在一起,则以下完全不推荐的代码也可以通过将字符串作为数组的两个元素来工作:

en:
  site_name: &site_name "Site Name"
  static_pages:
    company:
      description:
        - *site_name
        - "is an online system"

然后你会join像这样在适当的视图中排列数组:

t('.description').join(" ")

这也会让你"Site Name is an online system"

但是,在您决定走这条路之前,除了@felipeclopes 链接到的问题之外,请查看:

  • 这个 StackOverflow关于连接 i18n 字符串的答案(tl;dr 请不要为了您的翻译团队)。
  • 此处此处的StackOverflow 问题与您的问题类似。
于 2012-12-19T14:03:54.503 回答
6

您可以使用以下语法,如示例中所示:

dictionary:
  email: &email Email
  name: &name Name
  password: &password Password
  confirmation: &confirmation Confirmation

activerecord:
  attributes:
    user:
      email: *email
      name: *name
      password: *password
      password_confirmation: *confirmation
  models:
    user: User
users:
  fields:  
    email: *email
    name: *name
    password: *password
    confirmation: *confirmation
sessions:
  new:
    email: *email
    password: *password

这个例子取自:Refactoring Ruby on Rails i18n YAML files using dictionaries

于 2012-10-24T20:41:46.660 回答
0

晚会迟到了。我已经创建了一个可以做到这一点的宝石。i18n-env-var-查找

我的具体用例有点独特。在我们的组织中,我们有一个现有的 Rails 应用程序,我们想为组织中另一个团队的另一个项目“贴上白标签”。我们希望为两个项目共享相同的源代码存储库,而只更改站点名称。鉴于语言环境文件中已经有数千个条目,其中近百个包含站点名称,因此更新所有模板以将站点名称作为变量传递将是一个不好的做法。我们在相关问题中找到的其他建议对我们的案例也没有好处。我们希望两个项目的语言环境文件完全相同,这样我们就可以避免弄乱源代码并使用 3rd 方本地化服务轻松管理语言环境文件。

因此我转向实现 gem,它解决了我们的确切问题。

于 2022-02-22T17:07:55.097 回答