# 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 return { 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 } return 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