У меня есть драгоценный камень, который использует другой драгоценный камень. У этого другого драгоценного камня есть переводы (I18n). Когда в моей библиотеке применяется локализация, вместо текста я вижу значение с отсутствующим переводом:
Translation missing: en.some_field.a.b.c
Сейчас для меня есть одно решение — это переместить каталог config
из этой библиотеки в свою.
Но я бы не хотел копировать эти файлы, которые по сути бесполезны для моей библиотеки. Более того, эти файлы придется поддерживать, обновлять и т. д.
Можно ли как-то автоматически загрузить эти файлы в текущий гем из другого?
🤔 А знаете ли вы, что...
Ruby поддерживает интернационализацию и работу с различными языками и символами.
Вы можете загрузить файлы перевода другого драгоценного камня в свой текущий драгоценный камень, не копируя файлы. Это можно сделать, настроив путь загрузки I18n, который будет добавлять пути к файлам перевода из другого гема. Это будет выглядеть так:
Добавьте следующий код в инициализатор или файл конфигурации вашего Gem.
# config/initializers/load_translations.rb
I18n.load_path += YourOtherGem.config.i18n.load_path
Чтобы загрузить переводы из драгоценного камня, выполните следующие действия:
Замените YourOtherGem
настоящим названием драгоценного камня, содержащего перевод.
Убедитесь, что файлы перевода правильно настроены и доступны в геме. Обычно файлы перевода можно найти в каталоге config/locales
драгоценного камня.
Настройте 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.
Убедитесь, что вы добавили все необходимые зависимости в файл 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."