123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185 |
- # 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
- url = 'https://i18n.zammad.com/api/v1/translations'
- if !UserInfo.current_user_id
- UserInfo.current_user_id = 1
- end
- result = UserAgent.get(
- url,
- {},
- {
- json: true,
- }
- )
- raise "Can't load translations from #{url}: #{result.error}" if !result.success?
- ActiveRecord::Base.transaction do
- result.data.each {|translation|
- #puts translation.inspect
- # 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?
- #return translations_to_push
- url = 'https://i18n.zammad.com/api/v1/thanks_for_your_support'
- result = UserAgent.post(
- url,
- {
- locale: locale,
- translations: translations_to_push,
- fqdn: Setting.get('fqdn'),
- translator_key: '',
- },
- {
- json: true,
- }
- )
- raise "Can't push translations to #{url}: #{result.error}" if !result.success?
- true
- end
- =begin
- get list of translations
- list = Translation.list('de-de')
- =end
- def self.list(locale, admin = false)
- # check cache
- if !admin
- list = cache_get( locale )
- end
- if !list
- list = []
- translations = Translation.where( locale: locale.downcase ).order( :source )
- translations.each { |item|
- if admin
- data = [
- item.id,
- item.source,
- item.target,
- item.target_initial,
- item.format,
- ]
- list.push data
- else
- data = [
- item.id,
- item.source,
- item.target,
- item.format,
- ]
- list.push data
- end
- }
- # set cache
- if !admin
- cache_set( locale, list )
- end
- end
- {
- list: list,
- }
- 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 = self.target
- end
- def cache_clear
- Cache.delete( 'Translation::' + self.locale.downcase )
- end
- def self.cache_set(locale, data)
- Cache.write( 'Translation::' + locale.downcase, data )
- end
- def self.cache_get(locale)
- Cache.get( 'Translation::' + locale.downcase )
- end
- end
|