自分の gem で別の gem のロケールを使用するにはどうすればよいですか?

概要

別の gem を使用する gem があります。他の宝石には翻訳があります (I18n)。ライブラリにローカリゼーションを適用すると、テキストの代わりに翻訳が欠落している値が表示されます。

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

さて、私にとって解決策は 1 つあります。これは、config ディレクトリをそのライブラリから自分のライブラリに移動することです。

しかし、これらのファイルは私のライブラリには本質的に役に立たないので、コピーしたくありません。さらに、これらのファイルは保守、更新などを行う必要があります。

これらのファイルを何らかの方法で別の gem から現在の gem に自動的にロードすることは可能ですか?

解決策

ファイルをコピーせずに、別の gem の翻訳ファイルを現在の gem にロードできます。これは、別の gem からの翻訳ファイルのパスを追加する I18n ロード パスを設定することで実行できます。次のようになります。

次のコードを Gem のイニシャライザまたは構成ファイルに追加します。

# config/initializers/load_translations.rb
I18n.load_path += YourOtherGem.config.i18n.load_path

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 に追加されます。

# your_gem.gemspec
Gem::Specification.new do |spec|
  # ...
  spec.add_runtime_dependency "your_other_gem"
  # ...
end

これにより、Gem が別の gem の翻訳をロードして使用できるようになります。他の翻訳ファイルを自分の gem にコピーする必要はありません。

YourOtherGem と your_other_gem を、使用している gem の実際の名前に置き換えます。

数週間前、同じことを自動化するためにシェル スクリプトを作成する必要がありました。

#!/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."