【问题标题】:Rails I18n, check if translation exists?Rails I18n,检查翻译是否存在?
【发布时间】:2012-09-03 10:07:09
【问题描述】:

在 Rails 3 应用程序上工作,我想在输出之前检查翻译是否存在,如果不存在则回退到一些静态文本。我可以这样做:

if I18n.t("some_translation.key").to_s.index("translation missing")

但我觉得应该有比这更好的方法。如果将来 Rails 将“翻译缺失”更改为“未找到翻译”怎么办。或者如果由于某种奇怪的原因文本包含“翻译缺失”怎么办。有什么想法吗?

【问题讨论】:

    标签: ruby-on-rails internationalization rails-i18n


    【解决方案1】:

    根据您的描述,这应该可行:

    I18n.t("some_translation.key", :default => "fallback text")
    

    详情请参阅documentation

    【讨论】:

      【解决方案2】:

      你也可以使用

      I18n.exists?(key, locale)
      I18n.exists?('do_i_exist', :en)
      

      【讨论】:

      • 这确实有效。该方法没有记录,只是在这里提到:rubydoc.info/github/svenfuchs/i18n/master/I18n/Backend/…
      • I18n.exists?('key') 似乎是核心评估。如果未设置键值,我已在 helper_methods 中将其用于后备操作,例如title = I18n.exists?('page_title.default') ? t('page_title.default') : "Fallback title..."
      【解决方案3】:

      :default 并不总是一个解决方案。将此用于更高级的情况:

      helpers/application.rb:

      def i18n_set? key
        I18n.t key, :raise => true rescue false
      end
      

      任何 ERB 模板:

      <% if i18n_set? "home.#{name}.quote" %>
        <div class="quote">
          <blockquote><%= t "home.#{name}.quote" %></blockquote>
          <cite><%= t "home.#{name}.cite" %></cite>
        </div>
      <% end %>
      

      【讨论】:

        【解决方案4】:

        这个呢?

        I18n.t('some_translation.key', :default => '').empty?
        

        我只是觉得感觉更好,更像没有翻译

        警告:如果您故意将空字符串作为翻译值,则不起作用。

        【讨论】:

          【解决方案5】:

          使用:默认参数:

          I18n.t("some_translation.key", :default => 'some text')
          

          【讨论】:

            【解决方案6】:

            有时你想在翻译上做更多的事情失败了

            v = "doesnt_exist"
            begin
              puts I18n.t "langs.#{v}", raise: true
            rescue
              ...
              puts "Nooo #{v} has no Translation!"
            end
            

            【讨论】:

              【解决方案7】:

              这是一个技巧,但我认为它有时会很有用......

              假设你的 i18n 文件中有这个:

              en:
                key:
                  special_value: "Special value"
                  default_value: "Default value"
              

              你可以这样做:

              if I18n.t('key').keys.include?(:special_value)
                I18n.t('key.special_value')
              else
                I18n.t('key.default_value')
              end
              # => "Special value"
              
              if I18n.t('key').keys.include?(:unknown_value)
                I18n.t('key.special_value')
              else
                I18n.t('key.default_value')
              end
              # => "Default value"
              

              注意:这仅在您测试除根密钥之外的任何内容时才有效,因为您正在查看父项。

              其实有趣的是,当你请求一个父键时,你能得到什么……

              I18n.t('key')
              # => {:special_value=>"Special value", :default_value=>"Default value"}
              

              【讨论】:

              • 一行:I18n.t('key.special_value', default: I18n.t('key.default_value'))
              【解决方案8】:

              导轨 4

              我正在迭代一些陪审团成员的网址。 url 的最大数量为 2,default_lang 为“de”。这是我使用的yaml

              de:
               jury:
                urls:
                 url0: http://www.example.com
                 name0: example.com
                 url1:
                 name1:
              
              en:
               jury:
                urls:
                 url0: 
                 name0: 
                 url1:
                 name1:
              

              这是我如何检查是否有给定的 url,如果它不存在另一种语言,它将回退到 I18n default_lang“de”。我使用了@albandiguer 的答案,效果很好。

              我希望这对某人有所帮助:

                  <% 2.times do |j| %>
                      <% if I18n.exists?("jury.urls.url#{j}", "de") &&
                         I18n.exists?("jury.urls.name#{j}", "de") %>
                        <%= "<br/>".html_safe  if j == 1%>
                        <a href="<%= t("jury.urls.url#{j}") %>" target="_blank">
                          <%= t("jury.urls.name#{j}") %>
                        </a>
                      <% end %>
                   <% end %>
              

              【讨论】:

                【解决方案9】:

                一些版本之前有更简单的方法i18next documentation > API > t:

                您可以将一个键指定为字符串,也可以将多个键指定为字符串数组。第一个解析的将被返回。

                例子:

                i18next.t ( ['unknown.key', 'my.key' ] ); // It will return value for 'my.key'

                您也可以使用Contextst 如果没有找到 key 进入 context 则返回默认值。

                【讨论】:

                  猜你喜欢
                  • 2023-01-25
                  • 1970-01-01
                  • 1970-01-01
                  • 2012-02-08
                  • 2015-04-20
                  • 1970-01-01
                  • 2011-07-10
                  • 1970-01-01
                  • 2015-03-25
                  相关资源
                  最近更新 更多