trabajo-afectivo/app/models/translation.rb

260 lines
6 KiB
Ruby
Raw Normal View History

2014-02-03 19:23:00 +00:00
# Copyright (C) 2012-2014 Zammad Foundation, http://zammad-foundation.org/
class Translation < ApplicationModel
2012-05-18 14:24:00 +00:00
before_create :set_initial
after_create :cache_clear
after_update :cache_clear
after_destroy :cache_clear
2012-05-18 14:24:00 +00:00
2015-04-27 06:20:52 +00:00
=begin
load translations from online
all:
2015-04-27 06:20:52 +00:00
Translation.load
dedicated:
Translation.load(locale) # e. g. en-us or de-de
2015-04-27 06:20:52 +00:00
=end
def self.load(dedicated_locale = nil)
locales_list = []
if !dedicated_locale
locales = Locale.to_sync
locales.each {|locale|
locales_list.push locale.locale
}
else
locales_list = [dedicated_locale]
2015-08-15 07:48:08 +00:00
end
locales_list.each {|locale|
url = "https://i18n.zammad.com/api/v1/translations/#{locale}"
if !UserInfo.current_user_id
UserInfo.current_user_id = 1
end
result = UserAgent.get(
url,
{},
{
json: true,
open_timeout: 6,
read_timeout: 16,
}
)
fail "Can't load translations from #{url}: #{result.error}" if !result.success?
2015-11-18 07:37:18 +00:00
translations = Translation.where(locale: locale).all
ActiveRecord::Base.transaction do
result.data.each {|translation_raw|
# handle case insensitive sql
translation = nil
2015-11-18 07:37:18 +00:00
translations.each {|item|
next if item.format != translation_raw['format']
next if item.source != translation_raw['source']
translation = item
break
}
if translation
# verify if update is needed
update_needed = false
translation_raw.each {|key, _value|
if translation_raw[key] != translation[key]
update_needed = true
break
end
}
if update_needed
translation.update_attributes(translation_raw.symbolize_keys!)
translation.save
end
else
Translation.create(translation_raw.symbolize_keys!)
2015-04-28 21:08:39 +00:00
end
}
end
}
2015-04-27 06:20:52 +00:00
true
end
=begin
push translations to online
Translation.push(locale)
=end
def self.push(locale)
# only push changed translations
translations = Translation.where(locale: locale)
2015-04-27 06:20:52 +00:00
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?
2015-06-28 00:16:47 +00:00
url = 'https://i18n.zammad.com/api/v1/thanks_for_your_support'
2015-04-27 06:20:52 +00:00
2015-06-28 00:16:47 +00:00
translator_key = Setting.get('translator_key')
2015-04-27 06:20:52 +00:00
result = UserAgent.post(
url,
{
locale: locale,
translations: translations_to_push,
fqdn: Setting.get('fqdn'),
2015-06-28 00:16:47 +00:00
translator_key: translator_key,
2015-04-27 06:20:52 +00:00
},
{
json: true,
open_timeout: 6,
read_timeout: 16,
2015-04-27 06:20:52 +00:00
}
)
fail "Can't push translations to #{url}: #{result.error}" if !result.success?
2015-06-28 00:16:47 +00:00
# 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
}
2015-04-27 06:20:52 +00:00
true
end
=begin
get list of translations
list = Translation.lang('de-de')
2015-04-27 06:20:52 +00:00
=end
def self.lang(locale, admin = false)
2015-06-28 00:16:47 +00:00
# use cache if not admin page is requested
if !admin
2015-06-28 00:16:47 +00:00
data = cache_get(locale)
return data if data
end
2015-06-28 00:16:47 +00:00
# show total translations as reference count
data = {
'total' => Translation.where(locale: 'de-de').count,
}
list = []
translations = if admin
Translation.where(locale: locale.downcase).order(:source)
else
Translation.where(locale: locale.downcase).where.not(target: '').order(:source)
end
translations.each { |item|
translation_item = []
translation_item = if admin
[
item.id,
item.source,
item.target,
item.target_initial,
item.format,
]
else
[
item.id,
item.source,
item.target,
item.format,
]
end
list.push translation_item
}
2015-11-19 08:03:18 +00:00
data['list'] = list
# set cache
if !admin
cache_set(locale, data)
end
2013-08-06 08:18:50 +00:00
2015-06-28 00:16:47 +00:00
data
2013-08-06 08:18:50 +00:00
end
2015-04-27 06:20:52 +00:00
=begin
translate strings in ruby context, e. g. for notifications
2015-04-27 13:06:37 +00:00
translated = Translation.translate('de-de', 'New')
2015-04-27 06:20:52 +00:00
=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
2012-05-18 14:24:00 +00:00
private
def set_initial
return if target_initial
2015-11-19 08:03:18 +00:00
return if target_initial == ''
self.target_initial = target
end
def cache_clear
Cache.delete('TranslationMapOnlyContent::' + locale.downcase)
end
2015-09-09 18:16:20 +00:00
def self.cache_set(locale, data)
Cache.write('TranslationMapOnlyContent::' + locale.downcase, data)
end
private_class_method :cache_set
2015-09-09 18:16:20 +00:00
def self.cache_get(locale)
Cache.get('TranslationMapOnlyContent::' + locale.downcase)
end
private_class_method :cache_get
2012-05-18 14:24:00 +00:00
end