出于某种原因,我从没想过在 i18n YAML 文件中存储比字符串更复杂的数据结构,但是你的问题让我深思熟虑,在这种情况下改变我的方式,所以非常感谢你(和 +1)!
ApplicationHelper
我最初在我的(尽管与特定的 Rails 环境无关)中有一个类似于@Sachin R 解决方案的方法,如下所示:
app/helpers/application_helper.rb
def locale_language_labels
[
{ label: t('layouts.locale_selector.en'), locale: 'en' },
{ label: t('layouts.locale_selector.it'), locale: 'it' },
{ label: t('layouts.locale_selector.ja'), locale: 'ja' }
]
end
它提取了以下值(当然取决于语言环境):
config/locales/layouts/layouts_en.yml
en:
layouts:
locale_selector:
en: English
it: Italiano (Italian)
ja: 日本語 (Japanese)
然后,我的语言环境选择器(Twitter Bootstrap 格式)将填充这些值,如下所示:
应用程序/视图/布局/_locale_selector.html.haml
%li#fat-menu.dropdown
%a.dropdown-toggle{"data-toggle" => "dropdown", href: "#"}
%i.icon-globe
= t('.language')
%b.caret
%ul.dropdown-menu
- locale_language_labels.each do |language|
%li
= link_to language[:label],
controller: controller,
action: action,
set_locale: language[:locale],
page: page
现在,我已经摆脱了该locale_language_labels
方法,并将我的语言环境选择器语言放在 YAML 文件的哈希中,这可能是您问题的一个很好的候选者。我的代码现在如下所示:
config/locales/layouts/layouts_en.yml
en:
layouts:
locale_selector:
language: Language
language_labels: { en: English,
it: Italiano (Italian),
ja: 日本語 (Japanese) }
应用程序/视图/布局/_locale_selector.html.haml
%li#fat-menu.dropdown
%a.dropdown-toggle{"data-toggle" => "dropdown", href: "#"}
%i.icon-globe
= t('.language')
%b.caret
%ul.dropdown-menu
- t('.language_labels').each_pair do |locale, label|
%li
= link_to label,
controller: controller,
action: action,
set_locale: locale,
page: page
将语言标签与 YAML 文件中的语言环境配对对我来说更有意义,因为它们是紧密耦合的一对,现在在 YAML 中定义一半而在帮助程序中定义另一半似乎并不自然。