discourse/lib/theme_translation_manager.rb
David Taylor 880311dd4d
FEATURE: Support for localized themes (#6848)
- Themes can supply translation files in a format like `/locales/{locale}.yml`. These files should be valid YAML, with a single top level key equal to the locale being defined. For now these can only be defined using the `discourse_theme` CLI, importing a `.tar.gz`, or from a GIT repository.

- Fallback is handled on a global level (if the locale is not defined in the theme), as well as on individual keys (if some keys are missing from the selected interface language).

- Administrators can override individual keys on a per-theme basis in the /admin/customize/themes user interface.

- Theme developers should access defined translations using the new theme prefix variables:
  JavaScript: `I18n.t(themePrefix("my_translation_key"))`
  Handlebars: `{{theme-i18n "my_translation_key"}}` or `{{i18n (theme-prefix "my_translation_key")}}`

- To design for backwards compatibility, theme developers can check for the presence of the `themePrefix` variable in JavaScript

- As part of this, the old `{{themeSetting.setting_name}}` syntax is deprecated in favour of `{{theme-setting "setting_name"}}`
2019-01-17 11:46:11 +00:00

58 lines
1.4 KiB
Ruby

class ThemeTranslationManager
include ActiveModel::Serialization
attr_reader :key, :default, :theme
def self.list_from_hash(locale:, hash:, theme:, parent_keys: [])
list = []
hash.map do |key, value|
this_key_array = parent_keys + [key]
if value.is_a?(Hash)
self.list_from_hash(locale: locale, hash: value, theme: theme, parent_keys: this_key_array)
else
self.new(locale: locale, theme: theme, key: this_key_array.join("."), default: value)
end
end.flatten
end
def initialize(locale:, key:, default:, theme:)
@locale = locale
@key = key
@default = default
@theme = theme
end
def value
has_record? ? db_record.value : default
end
def value=(new_value)
if new_value == @default
db_record.destroy! if db_record
new_value
else
if has_record?
record = db_record
record.value = new_value.to_s
record.save!
else
record = create_record!(new_value.to_s)
end
record.value
end
end
def db_record
theme.theme_translation_overrides.to_a.find do |i|
i.locale.to_s == @locale.to_s && i.translation_key.to_s == key.to_s
end
end
def has_record?
db_record.present?
end
def create_record!(value)
record = ThemeTranslationOverride.create!(locale: @locale, translation_key: @key, theme: @theme, value: value)
end
end