如何从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
相关产品推荐
相关产品推荐

