我有一个宝石使用了另一个宝石。另一个宝石有翻译(I18n)。当我的库中应用本地化时,我看到的不是文本,而是缺少翻译的值:
Translation missing: en.some_field.a.b.c
现在我有一个解决方案 - 即将
config
目录从该库移动到我自己的库中。
但我不想复制这些文件,它们对我的库来说基本上没有用。此外,这些文件还需要维护、更新等。
是否可以以某种方式自动将这些文件从另一个gem加载到当前gem中?
您可以在当前gem中加载另一个gem的翻译文件,而无需复制文件。可以通过设置 I18n 加载路径来完成,该路径将添加来自另一个 gem 的翻译文件的路径。它看起来像这样:
将以下代码添加到 Gem 的初始化程序或配置文件中。
# config/initializers/load_translations.rb
I18n.load_path += YourOtherGem.config.i18n.load_path
要从 gem 加载翻译,请按照以下步骤操作:
将
YourOtherGem
替换为包含翻译的 gem 的实际名称。
确保翻译文件已正确配置并可在 gem 中访问。一般情况下,你可以在gem的
config/locales
目录下找到翻译文件。
配置
I18n.load_path
以包含 gem 的翻译文件。您可能需要在 gem 的初始化程序或配置文件中执行此操作。例如:
# lib/your_other_gem/config.rb
module YourOtherGem
class Config
attr_accessor :i18n
def initialize
@i18n = OpenStruct.new(load_path: [])
@i18n.load_path << File.expand_path("../../config/locales/*.yml", __FILE__)
end
end
def self.config
@config ||= Config.new
end
end
这会为 gem 设置一个配置对象,并将翻译文件从 config/locales 目录添加到 I18n.load_path。
确保在 gem 的 gemspec 文件中添加所有必需的依赖项。如果另一个 gem 将成为运行时依赖项,请将此行包含在您的 gemspec add_runtime_dependency 中。
# your_gem.gemspec
Gem::Specification.new do |spec|
# ...
spec.add_runtime_dependency "your_other_gem"
# ...
end
它允许您的 gem 加载并使用另一个 gem 的翻译。无需将其他人的翻译文件复制到您的 gem 中。
将 YourOtherGem 和 your_other_gem 替换为您正在使用的宝石的实际名称。
几周前我不得不编写一个 shell 脚本来自动完成同样的事情。
#!/bin/bash
# Define the names of your gem and the other gem
your_gem_initializer="path/to/your/gem/config/initializers/your_gem.rb"
your_gem_gemspec="path/to/your/gem/your_gem.gemspec"
other_gem_name="your_other_gem"
# Check if the initializer and gemspec files exist
if [ ! -f "$your_gem_initializer" ] || [ ! -f "$your_gem_gemspec" ]; then
echo "Error: Gem files not found."
exit 1
fi
# Add translation path to initializer
echo "Adding translation load path to initializer..."
echo "I18n.load_path += $other_gem_name.config.i18n.load_path" >> "$your_gem_initializer"
# Add dependency to gemspec
echo "Adding runtime dependency to gemspec..."
sed -i "/spec.add_runtime_dependency/a \ \ spec.add_runtime_dependency '$other_gem_name'" "$your_gem_gemspec"
echo "Process completed successfully."