class Tml::TranslationKey

Public Class Methods

cache_key(locale, key) click to toggle source
# File lib/tml/translation_key.rb, line 92
def self.cache_key(locale, key)
  File.join(locale, 'keys', key)
end
generate_key(label, desc = '') click to toggle source
# File lib/tml/translation_key.rb, line 62
def self.generate_key(label, desc = '')
  "#{Digest::MD5.hexdigest("#{label};;;#{desc}")}~"[0..-2].to_s
end
new(attrs = {}) click to toggle source
Calls superclass method Tml::Base::new
# File lib/tml/translation_key.rb, line 40
def initialize(attrs = {})
  super

  self.attributes[:key] ||= self.class.generate_key(label, description)
  self.attributes[:locale] ||= Tml.session.block_option(:locale) || (application ? application.default_locale : Tml.config.default_locale)
  self.attributes[:language] ||= application ? application.language(locale) : Tml.config.default_language
  self.attributes[:translations] = {}

  if hash_value(attrs, :translations)
    hash_value(attrs, :translations).each do |locale, translations|
      language = application.language(locale)

      self.attributes[:translations][locale] ||= []

      translations.each do |translation_hash|
        translation = Tml::Translation.new(translation_hash.merge(:translation_key => self, :locale => language.locale))
        self.attributes[:translations][locale] << translation
      end
    end
  end
end
substitute_tokens(label, token_values, language, options = {}) click to toggle source

if the translations engine is disabled

# File lib/tml/translation_key.rb, line 197
def self.substitute_tokens(label, token_values, language, options = {})
  return label.to_s if options[:skip_substitution]
  Tml::TranslationKey.new(:label => label.to_s).substitute_tokens(label.to_s, token_values, language, options)
end

Public Instance Methods

data_tokens() click to toggle source

Returns an array of data tokens from the translation key

# File lib/tml/translation_key.rb, line 179
def data_tokens
  @data_tokens ||= begin
    dt = Tml::Tokenizers::Data.new(label)
    dt.tokens
  end
end
data_tokens_names_map() click to toggle source
# File lib/tml/translation_key.rb, line 186
def data_tokens_names_map
  @data_tokens_names_map ||= begin
    map = {}
    data_tokens.each do |token|
      map[token.name] = token
    end
    map
  end
end
decoration_tokens() click to toggle source

Returns an array of decoration tokens from the translation key

# File lib/tml/translation_key.rb, line 170
def decoration_tokens
  @decoration_tokens ||= begin
    dt = Tml::Tokenizers::Decoration.new(label)
    dt.parse
    dt.tokens
  end
end
fetch_translations(locale) click to toggle source

fetch translations for a specific translation key

# File lib/tml/translation_key.rb, line 106
def fetch_translations(locale)
  self.translations ||= {}
  return if self.translations[locale]

  # Tml.logger.debug("Fetching translations for #{label}")

  results = self.application.api_client.get(
      "translation_keys/#{self.key}/translations",
      {:locale => locale, :per_page => 10000},
      {:cache_key => Tml::TranslationKey.cache_key(locale, self.key)}
  ) || []

  update_translations(locale, results)

  self
rescue Tml::Exception => ex
  self.translations = {}
  self
end
find_first_valid_translation(language, token_values) click to toggle source
# File lib/tml/translation_key.rb, line 135
def find_first_valid_translation(language, token_values)
  translations = translations_for_language(language)

  translations.sort! { |x, y| x.precedence <=> y.precedence }

  translations.each do |translation|
    return translation if translation.matches_rules?(token_values)
  end

  nil
end
has_translations_for_language?(language) click to toggle source
# File lib/tml/translation_key.rb, line 66
def has_translations_for_language?(language)
  translations and translations[language.locale] and translations[language.locale].any?
end
set_application(app) click to toggle source

switches to a new application

# File lib/tml/translation_key.rb, line 81
def set_application(app)
  self.application = app
  translations.values.each do |locale_translations|
    locale_translations.each do |translation|
      translation.translation_key = self
      translation.language = self.application.language(translation.locale)
    end
  end
  self
end
set_translations(locale, translations) click to toggle source
# File lib/tml/translation_key.rb, line 70
def set_translations(locale, translations)
  return unless translations
  translations.each do |translation|
    translation.locale ||= locale
    translation.translation_key = self
    translation.language = self.application.language(translation.locale)
  end
  self.translations[locale] = translations
end
substitute_tokens(translated_label, token_values, language, options = {}) click to toggle source
# File lib/tml/translation_key.rb, line 202
def substitute_tokens(translated_label, token_values, language, options = {})
  if options[:syntax] == 'xmessage'
    # pp "Translating #{translated_label} using xmessage syntax"
    tokenizer = Tml::Tokenizers::XMessage.new(translated_label)
    return tokenizer.substitute(language, token_values, options)
  end

  if Tml::Tokenizers::Decoration.required?(translated_label)
    translated_label = Tml::Tokenizers::Decoration.new(translated_label, token_values, :allowed_tokens => decoration_tokens).substitute
  end

  if Tml::Tokenizers::Data.required?(translated_label)
    translated_label = Tml::Tokenizers::Data.new(translated_label, token_values, :allowed_tokens => data_tokens_names_map).substitute(language, options)
  end

  translated_label
end
translate(language, token_values = {}, options = {}) click to toggle source
# File lib/tml/translation_key.rb, line 147
def translate(language, token_values = {}, options = {})
  if Tml.config.disabled?
    return substitute_tokens(label, token_values, language, options.merge(:fallback => false))
  end

  translation = find_first_valid_translation(language, token_values)
  decorator = Tml::Decorators::Base.decorator(options)

  if translation
    options[:locked] = translation.locked
    translated_label = substitute_tokens(translation.label, token_values, translation.language, options)
    return decorator.decorate(translated_label, translation.language, language, self, options)
  end

  translated_label = substitute_tokens(label, token_values, self.language, options)
  decorator.decorate(translated_label, self.language, language, self, options)
end
translations_for_language(language) click to toggle source

Translation Methods

# File lib/tml/translation_key.rb, line 130
def translations_for_language(language)
  return [] unless self.translations
  self.translations[language.locale] || []
end
update_translations(locale, data) click to toggle source

update translations in the key

# File lib/tml/translation_key.rb, line 97
def update_translations(locale, data)
  set_translations(locale, application.cache_translations(
                             locale,
                             key,
                             data.is_a?(Hash) ? data['translations'] : data
                         ))
end