# 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