You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从Rails的I18n::Backend中提取全部可用的翻译键?

Rails I18n全量翻译键提取方案

不管你用的是默认YAML backend还是自定义的远程资源加载backend,只要符合Rails I18n的接口规范,都可以通过以下方式提取所有点分隔格式的翻译键:

1. 核心工具方法

先实现一个递归打平嵌套翻译哈希的辅助方法:

# 入参是嵌套的翻译哈希,返回打平后的点分隔键数组
def flatten_i18n_keys(translations_hash, parent_prefix = nil)
  translations_hash.flat_map do |key, value|
    current_key = parent_prefix ? "#{parent_prefix}.#{key}" : key.to_s
    value.is_a?(Hash) ? flatten_i18n_keys(value, current_key) : current_key
  end
end

2. 提取当前语种的翻译键

直接从I18n backend的已加载翻译存储中取数据即可:

# 提取当前加载语种的所有翻译键
current_locale_keys = flatten_i18n_keys(
  I18n.backend.send(:translations)[I18n.locale]
)

说明:translations 是I18n标准backend的受保护方法,用send调用即可,自定义远程加载backend只要遵循Rails I18n规范,都会将加载完成的翻译数据存在该属性中。

3. 扩展用法(全语种提取)

如果需要拿到所有可用语种的翻译键,遍历所有语种即可:

# 键为语种标识,值为对应翻译键数组
all_locale_keys = I18n.available_locales.each_with_object({}) do |locale, res|
  res[locale] = flatten_i18n_keys(I18n.backend.send(:translations)[locale])
end

注意事项

  • 确保提取操作在翻译资源加载完成后执行,如果你是应用启动时从内部服务拉取翻译,建议将提取逻辑放在初始化流程的最后一步,避免拿到不完整的键列表。
  • 拿到的键格式完全和之前从YAML提取的一致,可直接用于前端JS翻译暴露逻辑。

内容的提问来源于stack exchange,提问作者Neil Middleton

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 02:06:03