123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229 |
- # Copyright (C) 2012-2014 Zammad Foundation, http://zammad-foundation.org/
- class Translation < ApplicationModel
- before_create :set_initial
- after_create :cache_clear
- after_update :cache_clear
- after_destroy :cache_clear
- =begin
- load translations from online
- Translation.load
- =end
- def self.load
- locales = Locale.where(active: true)
- if Rails.env.test?
- locales = Locale.where(active: true, locale: ['en-us', 'de-de'])
- end
- locales.each {|locale|
- url = "https://i18n.zammad.com/api/v1/translations/#{locale.locale}"
- if !UserInfo.current_user_id
- UserInfo.current_user_id = 1
- end
- result = UserAgent.get(
- url,
- {},
- {
- json: true,
- }
- )
- fail "Can't load translations from #{url}: #{result.error}" if !result.success?
- ActiveRecord::Base.transaction do
- result.data.each {|translation|
- # handle case insensitive sql
- exists = Translation.where(locale: translation['locale'], format: translation['format'], source: translation['source'])
- translaten = nil
- exists.each {|item|
- if item.source == translation['source']
- translaten = item
- end
- }
- if translaten
- # verify if update is needed
- translaten.update_attributes(translation.symbolize_keys!)
- translaten.save
- else
- Translation.create(translation.symbolize_keys!)
- end
- }
- end
- }
- true
- end
- =begin
- push translations to online
- Translation.push(locale)
- =end
- def self.push(locale)
- # only push changed translations
- translations = Translation.where(locale: locale)
- translations_to_push = []
- translations.each {|translation|
- if translation.target != translation.target_initial
- translations_to_push.push translation
- end
- }
- return true if translations_to_push.empty?
- url = 'https://i18n.zammad.com/api/v1/thanks_for_your_support'
- translator_key = Setting.get('translator_key')
- result = UserAgent.post(
- url,
- {
- locale: locale,
- translations: translations_to_push,
- fqdn: Setting.get('fqdn'),
- translator_key: translator_key,
- },
- {
- json: true,
- }
- )
- fail "Can't push translations to #{url}: #{result.error}" if !result.success?
- # set new translator_key if given
- if result.data['translator_key']
- translator_key = Setting.set('translator_key', result.data['translator_key'])
- end
- true
- end
- =begin
- reset translations to origin
- Translation.reset(locale)
- =end
- def self.reset(locale)
- # only push changed translations
- translations = Translation.where(locale: locale)
- translations.each {|translation|
- if !translation.target_initial || translation.target_initial.empty?
- translation.destroy
- elsif translation.target != translation.target_initial
- translation.target = translation.target_initial
- translation.save
- end
- }
- true
- end
- =begin
- get list of translations
- list = Translation.list('de-de')
- =end
- def self.list(locale, admin = false)
- # use cache if not admin page is requested
- if !admin
- data = cache_get(locale)
- end
- if !data
- # show total translations as reference count
- data = {
- 'total' => Translation.where(locale: 'de-de').count,
- }
- list = []
- translations = Translation.where(locale: locale.downcase).order(:source)
- translations.each { |item|
- if admin
- translation_item = [
- item.id,
- item.source,
- item.target,
- item.target_initial,
- item.format,
- ]
- list.push translation_item
- else
- translation_item = [
- item.id,
- item.source,
- item.target,
- item.format,
- ]
- list.push translation_item
- end
- data['list'] = list
- }
- # set cache
- if !admin
- cache_set(locale, data)
- end
- end
- data
- end
- =begin
- translate strings in ruby context, e. g. for notifications
- translated = Translation.translate('de-de', 'New')
- =end
- def self.translate(locale, string)
- # translate string
- records = Translation.where( locale: locale, source: string )
- records.each {|record|
- return record.target if record.source == string
- }
- # fallback lookup in en
- records = Translation.where( locale: 'en', source: string )
- records.each {|record|
- return record.target if record.source == string
- }
- string
- end
- private
- def set_initial
- return if target_initial
- self.target_initial = target
- end
- def cache_clear
- Cache.delete( 'TranslationMap::' + locale.downcase )
- end
- def self.cache_set(locale, data)
- Cache.write( 'TranslationMap::' + locale.downcase, data )
- end
- def self.cache_get(locale)
- Cache.get( 'TranslationMap::' + locale.downcase )
- end
- end
|