Added locale rtl support (e. g. for Persian or Hebrew).
This commit is contained in:
parent
afafa1d8b2
commit
3e92e4f9f4
5 changed files with 84 additions and 10 deletions
|
@ -96,12 +96,15 @@ class _i18nSingleton extends Spine.Module
|
||||||
|
|
||||||
# prepare locale
|
# prepare locale
|
||||||
localeToSet = localeToSet.toLowerCase()
|
localeToSet = localeToSet.toLowerCase()
|
||||||
|
dirToSet = 'ltr'
|
||||||
|
|
||||||
# check if locale exists
|
# check if locale exists
|
||||||
localeFound = false
|
localeFound = false
|
||||||
locales = App.Locale.all()
|
locales = App.Locale.all()
|
||||||
for locale in locales
|
for locale in locales
|
||||||
if locale.locale is localeToSet
|
if locale.locale is localeToSet
|
||||||
|
localeToSet = locale.locale
|
||||||
|
dirToSet = locale.dir
|
||||||
localeFound = true
|
localeFound = true
|
||||||
|
|
||||||
# try aliases
|
# try aliases
|
||||||
|
@ -109,6 +112,8 @@ class _i18nSingleton extends Spine.Module
|
||||||
for locale in locales
|
for locale in locales
|
||||||
if locale.alias is localeToSet
|
if locale.alias is localeToSet
|
||||||
localeToSet = locale.locale
|
localeToSet = locale.locale
|
||||||
|
dirToSet = locale.dir
|
||||||
|
localeFound = true
|
||||||
|
|
||||||
# if no locale and no alias was found, try to find correct one
|
# if no locale and no alias was found, try to find correct one
|
||||||
if !localeFound
|
if !localeFound
|
||||||
|
@ -118,13 +123,7 @@ class _i18nSingleton extends Spine.Module
|
||||||
for locale in locales
|
for locale in locales
|
||||||
if locale.alias is localeToSet
|
if locale.alias is localeToSet
|
||||||
localeToSet = locale.locale
|
localeToSet = locale.locale
|
||||||
localeFound = true
|
dirToSet = locale.dir
|
||||||
|
|
||||||
# try to find by locale
|
|
||||||
if !localeFound
|
|
||||||
for locale in locales
|
|
||||||
if locale.locale is localeToSet
|
|
||||||
localeToSet = locale.locale
|
|
||||||
localeFound = true
|
localeFound = true
|
||||||
|
|
||||||
# check if locale need to be changed
|
# check if locale need to be changed
|
||||||
|
@ -136,8 +135,9 @@ class _i18nSingleton extends Spine.Module
|
||||||
# set if not translated should be logged
|
# set if not translated should be logged
|
||||||
@_notTranslatedLog = @notTranslatedFeatureEnabled(@locale)
|
@_notTranslatedLog = @notTranslatedFeatureEnabled(@locale)
|
||||||
|
|
||||||
# set lang attribute of html tag
|
# set lang and dir attribute of html tag
|
||||||
$('html').prop('lang', @locale.substr(0, 2) )
|
$('html').prop('lang', localeToSet.substr(0, 2))
|
||||||
|
$('html').prop('dir', dirToSet)
|
||||||
|
|
||||||
@mapString = {}
|
@mapString = {}
|
||||||
App.Ajax.request(
|
App.Ajax.request(
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
# Copyright (C) 2012-2016 Zammad Foundation, http://zammad-foundation.org/
|
# Copyright (C) 2012-2016 Zammad Foundation, http://zammad-foundation.org/
|
||||||
|
require 'csv'
|
||||||
|
|
||||||
class Translation < ApplicationModel
|
class Translation < ApplicationModel
|
||||||
before_create :set_initial
|
before_create :set_initial
|
||||||
|
@ -212,7 +213,7 @@ translate strings in ruby context, e. g. for notifications
|
||||||
|
|
||||||
=begin
|
=begin
|
||||||
|
|
||||||
load locales from local
|
load translations from local
|
||||||
|
|
||||||
all:
|
all:
|
||||||
|
|
||||||
|
@ -282,6 +283,65 @@ all:
|
||||||
true
|
true
|
||||||
end
|
end
|
||||||
|
|
||||||
|
=begin
|
||||||
|
|
||||||
|
load translations from csv file
|
||||||
|
|
||||||
|
all:
|
||||||
|
|
||||||
|
Translation.load_from_csv
|
||||||
|
|
||||||
|
or
|
||||||
|
|
||||||
|
Translation.load_from_csv(locale, file_location, file_charset) # e. g. 'en-us' or 'de-de' and /path/to/translation_list.csv
|
||||||
|
|
||||||
|
e. g.
|
||||||
|
|
||||||
|
Translation.load_from_csv('he-il', '/Users/me/Downloads/Hebrew_translation_list-1.csv', 'Windows-1255')
|
||||||
|
|
||||||
|
Get source file at https://i18n.zammad.com/api/v1/translations_empty_translation_list
|
||||||
|
|
||||||
|
=end
|
||||||
|
|
||||||
|
def self.load_from_csv(locale_name, location, charset = 'UTF8')
|
||||||
|
locale = Locale.find_by(locale: locale_name)
|
||||||
|
if !locale
|
||||||
|
raise "No such locale: #{locale_name}"
|
||||||
|
end
|
||||||
|
|
||||||
|
if !::File.exist?(location)
|
||||||
|
raise "No such file: #{location}"
|
||||||
|
end
|
||||||
|
|
||||||
|
content = ::File.open(location, "r:#{charset}").read
|
||||||
|
params = {
|
||||||
|
col_sep: ',',
|
||||||
|
}
|
||||||
|
rows = ::CSV.parse(content, params)
|
||||||
|
header = rows.shift
|
||||||
|
|
||||||
|
translation_raw = []
|
||||||
|
rows.each { |row|
|
||||||
|
raise "Can't import translation, source is missing" if row[0].blank?
|
||||||
|
if row[1].blank?
|
||||||
|
warn "Skipped #{row[0]}, because translation is blank"
|
||||||
|
next
|
||||||
|
end
|
||||||
|
raise "Can't import translation, format is missing" if row[2].blank?
|
||||||
|
raise "Can't import translation, format is invalid (#{row[2]})" if row[2] !~ /^(time|string)$/
|
||||||
|
item = {
|
||||||
|
'locale' => locale.locale,
|
||||||
|
'source' => row[0],
|
||||||
|
'target' => row[1],
|
||||||
|
'target_initial' => '',
|
||||||
|
'format' => row[2],
|
||||||
|
}
|
||||||
|
translation_raw.push item
|
||||||
|
}
|
||||||
|
to_database(locale.name, translation_raw)
|
||||||
|
true
|
||||||
|
end
|
||||||
|
|
||||||
private_class_method def self.to_database(locale, data)
|
private_class_method def self.to_database(locale, data)
|
||||||
translations = Translation.where(locale: locale).all
|
translations = Translation.where(locale: locale).all
|
||||||
ActiveRecord::Base.transaction do
|
ActiveRecord::Base.transaction do
|
||||||
|
|
|
@ -209,6 +209,7 @@ class CreateBase < ActiveRecord::Migration
|
||||||
t.string :locale, limit: 20, null: false
|
t.string :locale, limit: 20, null: false
|
||||||
t.string :alias, limit: 20, null: true
|
t.string :alias, limit: 20, null: true
|
||||||
t.string :name, limit: 255, null: false
|
t.string :name, limit: 255, null: false
|
||||||
|
t.string :dir, limit: 9, null: false, default: 'ltr'
|
||||||
t.boolean :active, null: false, default: true
|
t.boolean :active, null: false, default: true
|
||||||
t.timestamps limit: 3, null: false
|
t.timestamps limit: 3, null: false
|
||||||
end
|
end
|
||||||
|
|
|
@ -1,5 +1,9 @@
|
||||||
class TreeSelect < ActiveRecord::Migration
|
class TreeSelect < ActiveRecord::Migration
|
||||||
def up
|
def up
|
||||||
|
|
||||||
|
# return if it's a new setup
|
||||||
|
return if !Setting.find_by(name: 'system_init_done')
|
||||||
|
|
||||||
change_column :object_manager_attributes, :data_option, :text, limit: 800.kilobytes + 1, null: true
|
change_column :object_manager_attributes, :data_option, :text, limit: 800.kilobytes + 1, null: true
|
||||||
change_column :object_manager_attributes, :data_option_new, :text, limit: 800.kilobytes + 1, null: true
|
change_column :object_manager_attributes, :data_option_new, :text, limit: 800.kilobytes + 1, null: true
|
||||||
end
|
end
|
||||||
|
|
9
db/migrate/20170626000001_locale_add_direction.rb
Normal file
9
db/migrate/20170626000001_locale_add_direction.rb
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
class LocaleAddDirection < ActiveRecord::Migration
|
||||||
|
def up
|
||||||
|
|
||||||
|
# return if it's a new setup
|
||||||
|
return if !Setting.find_by(name: 'system_init_done')
|
||||||
|
|
||||||
|
add_column :locales, :dir, :string, limit: 9, null: false, default: 'ltr'
|
||||||
|
end
|
||||||
|
end
|
Loading…
Reference in a new issue