trabajo-afectivo/app/models/translation.rb

365 lines
8.5 KiB
Ruby
Raw Normal View History

2016-10-19 03:11:36 +00:00
# Copyright (C) 2012-2016 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
sync translations from local if exists, otherwise from online
all:
Translation.sync
Translation.sync(locale) # e. g. 'en-us' or 'de-de'
=end
def self.sync(dedicated_locale = nil)
return true if load_from_file(dedicated_locale)
load
end
=begin
2015-04-27 06:20:52 +00:00
load translations from online
all:
2015-04-27 06:20:52 +00:00
Translation.load
dedicated:
2016-01-19 06:58:58 +00:00
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)
locals_to_sync(dedicated_locale).each { |locale|
fetch(locale)
load_from_file(locale)
}
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 = []
2016-06-30 20:04:48 +00:00
translations.each { |translation|
2015-04-27 06:20:52 +00:00
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
2016-07-25 20:13:38 +00:00
url = 'https://i18n.zammad.com/api/v1/translations/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
}
)
2016-03-01 14:26:46 +00:00
raise "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)
2016-06-30 20:04:48 +00:00
translations.each { |translation|
2015-06-28 00:16:47 +00:00
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
}
2016-03-07 01:25:52 +00:00
# add presorted on top
presorted_list = []
2016-06-30 20:04:48 +00:00
%w(yes no or Year Years Month Months Day Days Hour Hours Minute Minutes Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec January February March April May June July August September October November December Mon Tue Wed Thu Fri Sat Sun Monday Tuesday Wednesday Thursday Friday Saturday Sunday).each { |presort|
list.each { |item|
2016-03-07 01:25:52 +00:00
next if item[1] != presort
presorted_list.push item
list.delete item
#list.unshift presort
}
}
data['list'] = presorted_list.concat 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)
2016-06-30 20:04:48 +00:00
records.each { |record|
return record.target if record.source == string
}
# fallback lookup in en
records = Translation.where(locale: 'en', source: string)
2016-06-30 20:04:48 +00:00
records.each { |record|
return record.target if record.source == string
}
string
end
=begin
load locales from local
all:
Translation.load_from_file
or
Translation.load_from_file(locale) # e. g. 'en-us' or 'de-de'
=end
def self.load_from_file(dedicated_locale = nil)
version = Version.get
directory = Rails.root.join('config/translations')
locals_to_sync(dedicated_locale).each { |locale|
file = Rails.root.join("#{directory}/#{locale}-#{version}.yml")
return false if !File.exist?(file)
data = YAML.load_file(file)
to_database(locale, data)
}
true
end
=begin
fetch translation from remote and store them in local file system
all:
Translation.fetch
or
Translation.fetch(locale) # e. g. 'en-us' or 'de-de'
=end
def self.fetch(dedicated_locale = nil)
version = Version.get
locals_to_sync(dedicated_locale).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,
{
version: version,
},
{
json: true,
open_timeout: 8,
read_timeout: 24,
}
)
raise "Can't load translations from #{url}: #{result.error}" if !result.success?
directory = Rails.root.join('config/translations')
if !File.directory?(directory)
Dir.mkdir(directory, 0o755)
end
file = Rails.root.join("#{directory}/#{locale}-#{version}.yml")
File.open(file, 'w') do |out|
YAML.dump(result.data, out)
end
}
true
end
private_class_method def self.to_database(locale, data)
translations = Translation.where(locale: locale).all
ActiveRecord::Base.transaction do
data.each { |translation_raw|
# handle case insensitive sql
translation = nil
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 target has changes
next unless translation_raw[key] != translation.target
# do not update translations which are already changed by user
if translation.target == translation.target_initial
update_needed = true
break
end
}
if update_needed
translation.update_attributes(translation_raw.symbolize_keys!)
translation.save
end
else
2016-12-06 10:46:26 +00:00
if !UserInfo.current_user_id
translation_raw['updated_by_id'] = 1
translation_raw['created_by_id'] = 1
end
Translation.create(translation_raw.symbolize_keys!)
end
}
end
end
private_class_method def self.locals_to_sync(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]
end
locales_list
end
2012-05-18 14:24:00 +00:00
private
def set_initial
return true if target_initial
return true if target_initial == ''
self.target_initial = target
true
end
def cache_clear
Cache.delete('TranslationMapOnlyContent::' + locale.downcase)
true
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