Как я могу использовать локали в своем драгоценном камне из другого драгоценного камня?

У меня есть драгоценный камень, который использует другой драгоценный камень. У этого другого драгоценного камня есть переводы (I18n). Когда в моей библиотеке применяется локализация, вместо текста я вижу значение с отсутствующим переводом:

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

Сейчас для меня есть одно решение — это переместить каталог config из этой библиотеки в свою.

Но я бы не хотел копировать эти файлы, которые по сути бесполезны для моей библиотеки. Более того, эти файлы придется поддерживать, обновлять и т. д.

Можно ли как-то автоматически загрузить эти файлы в текущий гем из другого?

🤔 А знаете ли вы, что...
Ruby поддерживает интернационализацию и работу с различными языками и символами.


2
54
1

Ответ:

Решено

Вы можете загрузить файлы перевода другого драгоценного камня в свой текущий драгоценный камень, не копируя файлы. Это можно сделать, настроив путь загрузки I18n, который будет добавлять пути к файлам перевода из другого гема. Это будет выглядеть так:

Добавьте следующий код в инициализатор или файл конфигурации вашего Gem.

  1. В инициализаторе или файле конфигурации вашего драгоценного камня добавьте следующий код:
# config/initializers/load_translations.rb
I18n.load_path += YourOtherGem.config.i18n.load_path

Чтобы загрузить переводы из драгоценного камня, выполните следующие действия:

  1. Замените YourOtherGem настоящим названием драгоценного камня, содержащего перевод.

  2. Убедитесь, что файлы перевода правильно настроены и доступны в геме. Обычно файлы перевода можно найти в каталоге config/locales драгоценного камня.

  3. Настройте I18n.load_path, чтобы включить файлы перевода драгоценного камня. Возможно, вам придется сделать это в инициализаторе или файле конфигурации драгоценного камня. Например:

# 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

Это устанавливает объект конфигурации для драгоценного камня и добавляет файлы перевода из каталога config/locales в путь I18n.load_path.

  1. Убедитесь, что вы добавили все необходимые зависимости в файл gemspec вашего драгоценного камня. Включите эту строку в спецификацию драгоценного камня add_runtime_dependentency, если другой драгоценный камень будет зависимостью времени выполнения.

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

Это позволяет вашему драгоценному камню загружать и использовать переводы другого драгоценного камня. Нет необходимости копировать файлы перевода других пользователей в свой драгоценный камень.

Замените YourOtherGem и your_other_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."