如何在我的 gem 中使用另一个 gem 的语言环境?

问题描述 投票:0回答:1

我有一个宝石使用了另一个宝石。另一个宝石有翻译(I18n)。当我的库中应用本地化时,我看到的不是文本,而是缺少翻译的值:

Translation missing: en.some_field.a.b.c

现在我有一个解决方案 - 即将

config
目录从该库移动到我自己的库中。

但我不想复制这些文件,它们对我的库来说基本上没有用。此外,这些文件还需要维护、更新等。

是否可以以某种方式自动将这些文件从另一个gem加载到当前gem中?

ruby rubygems gemspecs
1个回答
1
投票

您可以在当前gem中加载另一个gem的翻译文件,而无需复制文件。可以通过设置 I18n 加载路径来完成,该路径将添加来自另一个 gem 的翻译文件的路径。它看起来像这样:

将以下代码添加到 Gem 的初始化程序或配置文件中。

  1. 在 gem 的初始化程序或配置文件中,添加以下代码:
# config/initializers/load_translations.rb
I18n.load_path += YourOtherGem.config.i18n.load_path

要从 gem 加载翻译,请按照以下步骤操作:

  1. YourOtherGem
    替换为包含翻译的 gem 的实际名称。

  2. 确保翻译文件已正确配置并可在 gem 中访问。一般情况下,你可以在gem的

    config/locales
    目录下找到翻译文件。

  3. 配置

    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。

  1. 确保在 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."
© www.soinside.com 2019 - 2024. All rights reserved.