2016-10-19 03:11:36 +00:00
# Copyright (C) 2012-2016 Zammad Foundation, http://zammad-foundation.org/
2013-06-12 15:59:58 +00:00
2012-09-20 12:08:02 +00:00
class Translation < ApplicationModel
2012-05-18 14:24:00 +00:00
before_create :set_initial
2013-08-06 14:17:30 +00:00
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
2015-09-21 12:20:36 +00:00
all :
2015-04-27 06:20:52 +00:00
Translation . load
2015-09-21 12:20:36 +00:00
dedicated :
2016-01-19 06:58:58 +00:00
Translation . load ( locale ) # e. g. 'en-us' or 'de-de'
2015-09-21 12:20:36 +00:00
2015-04-27 06:20:52 +00:00
= end
2015-09-21 12:20:36 +00:00
def self . load ( dedicated_locale = nil )
locales_list = [ ]
if ! dedicated_locale
locales = Locale . to_sync
2016-06-30 20:04:48 +00:00
locales . each { | locale |
2015-09-21 12:20:36 +00:00
locales_list . push locale . locale
}
else
locales_list = [ dedicated_locale ]
2015-08-15 07:48:08 +00:00
end
2016-06-30 20:04:48 +00:00
locales_list . each { | locale |
2015-09-21 12:20:36 +00:00
url = " https://i18n.zammad.com/api/v1/translations/ #{ locale } "
2015-08-04 10:41:36 +00:00
if ! UserInfo . current_user_id
UserInfo . current_user_id = 1
end
result = UserAgent . get (
url ,
{ } ,
{
json : true ,
2015-11-20 01:59:35 +00:00
open_timeout : 6 ,
read_timeout : 16 ,
2015-08-04 10:41:36 +00:00
}
)
2016-03-01 14:26:46 +00:00
raise " Can't load translations from #{ url } : #{ result . error } " if ! result . success?
2015-08-04 10:41:36 +00:00
2015-11-18 07:37:18 +00:00
translations = Translation . where ( locale : locale ) . all
2015-08-04 10:41:36 +00:00
ActiveRecord :: Base . transaction do
2016-06-30 20:04:48 +00:00
result . data . each { | translation_raw |
2015-08-04 10:41:36 +00:00
# handle case insensitive sql
2015-10-28 12:24:52 +00:00
translation = nil
2016-06-30 20:04:48 +00:00
translations . each { | item |
2015-11-18 07:37:18 +00:00
next if item . format != translation_raw [ 'format' ]
next if item . source != translation_raw [ 'source' ]
translation = item
break
2015-08-04 10:41:36 +00:00
}
2015-10-28 12:24:52 +00:00
if translation
2015-08-04 10:41:36 +00:00
# verify if update is needed
2015-10-28 12:24:52 +00:00
update_needed = false
2016-06-30 20:04:48 +00:00
translation_raw . each { | key , _value |
2015-10-28 12:26:41 +00:00
if translation_raw [ key ] != translation [ key ]
2015-10-28 12:24:52 +00:00
update_needed = true
break
end
}
if update_needed
translation . update_attributes ( translation_raw . symbolize_keys! )
translation . save
end
2015-08-04 10:41:36 +00:00
else
2015-10-28 12:24:52 +00:00
Translation . create ( translation_raw . symbolize_keys! )
2015-04-28 21:08:39 +00:00
end
}
2015-08-04 10:41:36 +00:00
end
}
2015-04-27 06:20:52 +00:00
true
end
= begin
push translations to online
Translation . push ( locale )
= end
def self . push ( locale )
2015-04-27 11:47:48 +00:00
# only push changed translations
2015-04-27 13:42:53 +00:00
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 ,
{
2015-04-27 13:42:53 +00:00
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
} ,
{
2015-04-27 13:42:53 +00:00
json : true ,
2015-11-20 01:59:35 +00:00
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
2015-11-18 13:27:46 +00:00
list = Translation . lang ( 'de-de' )
2015-04-27 06:20:52 +00:00
= end
2015-11-18 13:27:46 +00:00
def self . lang ( locale , admin = false )
2013-08-06 14:17:30 +00:00
2015-06-28 00:16:47 +00:00
# use cache if not admin page is requested
2015-04-12 08:41:59 +00:00
if ! admin
2015-06-28 00:16:47 +00:00
data = cache_get ( locale )
2015-11-18 13:27:46 +00:00
return data if data
2015-04-12 08:41:59 +00:00
end
2015-06-28 00:16:47 +00:00
2015-11-18 13:27:46 +00:00
# show total translations as reference count
data = {
'total' = > Translation . where ( locale : 'de-de' ) . count ,
}
list = [ ]
2016-01-15 17:22:57 +00:00
translations = if admin
Translation . where ( locale : locale . downcase ) . order ( :source )
else
Translation . where ( locale : locale . downcase ) . where . not ( target : '' ) . order ( :source )
end
2015-11-18 13:27:46 +00:00
translations . each { | item |
2016-01-15 17:22:57 +00:00
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-18 13:27:46 +00:00
}
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
2015-11-18 13:27:46 +00:00
# set cache
if ! admin
cache_set ( locale , data )
2013-08-06 14:17:30 +00:00
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
2013-01-04 13:14:20 +00:00
def self . translate ( locale , string )
# translate string
2015-11-18 13:27:46 +00:00
records = Translation . where ( locale : locale , source : string )
2016-06-30 20:04:48 +00:00
records . each { | record |
2013-01-04 14:28:55 +00:00
return record . target if record . source == string
}
2013-01-04 13:14:20 +00:00
# fallback lookup in en
2015-11-18 13:27:46 +00:00
records = Translation . where ( locale : 'en' , source : string )
2016-06-30 20:04:48 +00:00
records . each { | record |
2013-01-04 14:28:55 +00:00
return record . target if record . source == string
}
2013-01-04 13:14:20 +00:00
2015-04-30 17:20:27 +00:00
string
2013-01-04 13:14:20 +00:00
end
2012-05-18 14:24:00 +00:00
private
2015-05-01 12:31:46 +00:00
2013-06-12 15:59:58 +00:00
def set_initial
2015-04-30 15:25:04 +00:00
return if target_initial
2015-11-19 08:03:18 +00:00
return if target_initial == ''
2015-05-07 12:10:38 +00:00
self . target_initial = target
2013-06-12 15:59:58 +00:00
end
2015-05-07 10:27:12 +00:00
2013-08-06 14:17:30 +00:00
def cache_clear
2015-11-18 13:27:46 +00:00
Cache . delete ( 'TranslationMapOnlyContent::' + locale . downcase )
2013-08-06 14:17:30 +00:00
end
2015-09-09 18:16:20 +00:00
2013-08-06 14:17:30 +00:00
def self . cache_set ( locale , data )
2015-11-18 13:27:46 +00:00
Cache . write ( 'TranslationMapOnlyContent::' + locale . downcase , data )
2013-08-06 14:17:30 +00:00
end
2016-01-15 17:22:57 +00:00
private_class_method :cache_set
2015-09-09 18:16:20 +00:00
2013-08-06 14:17:30 +00:00
def self . cache_get ( locale )
2015-11-18 13:27:46 +00:00
Cache . get ( 'TranslationMapOnlyContent::' + locale . downcase )
2013-08-06 14:17:30 +00:00
end
2016-01-15 17:22:57 +00:00
private_class_method :cache_get
2012-05-18 14:24:00 +00:00
end