Translations
This commit is contained in:
@@ -1,8 +1,8 @@
|
||||
#= require jquery
|
||||
#= require jquery_ujs
|
||||
#= require jquery.ui.sortable
|
||||
#= require jquery.turbolinks
|
||||
#= require turbolinks
|
||||
# = #require jquery.turbolinks
|
||||
# = #require turbolinks
|
||||
#= require foundation
|
||||
|
||||
# FRONT END
|
||||
@@ -123,6 +123,50 @@ updateFormFieldList = () ->
|
||||
updateFormFieldList()
|
||||
return
|
||||
|
||||
saveTranslation = ($td, $move_to, auto_translate) ->
|
||||
val = ''
|
||||
do_auto_translate = true
|
||||
if typeof auto_translate == "undefined" || !auto_translate
|
||||
val = $td.find('textarea').val()
|
||||
do_auto_translate = false
|
||||
key = $td.parent().data().key
|
||||
params = {translationkey: key, translationvalue: val, translationlang: window.location.href.replace(/^.*\/(\w+)\/$/, '$1')}
|
||||
if do_auto_translate
|
||||
params['auto_translate'] = true
|
||||
$.post '/translate/', params,
|
||||
(json) ->
|
||||
#console.log json
|
||||
$td.html(json.translation)
|
||||
if $td.parent().hasClass('not-exists')
|
||||
$td.parent().removeClass('not-exists')
|
||||
$td.parent().addClass('exists')
|
||||
$('.translation-form').remove()
|
||||
if typeof $move_to != "undefined" && $move_to
|
||||
startTranslating $move_to
|
||||
return
|
||||
return
|
||||
|
||||
stopTranslating = () -> $('.translation-form').remove()
|
||||
|
||||
startTranslating = ($td) ->
|
||||
stopTranslating()
|
||||
value = if $td.parent().hasClass('not-exists') then '' else $td.html().trim()
|
||||
$tr = $td.parent()
|
||||
key = $tr.data().key
|
||||
$td.append('<div class="translation-form"><textarea>' + value + '</textarea><button class="small" data-key="' + key + '">Save</textarea>')
|
||||
$textarea = $td.find('textarea')
|
||||
$textarea.select()
|
||||
$td.find('.translation-form button').click () -> saveTranslation($td)
|
||||
$textarea.keydown (event) ->
|
||||
if event.keyCode == 9
|
||||
event.preventDefault()
|
||||
$new_tr = if event.shiftKey then $tr.prev() else $tr.next()
|
||||
saveTranslation $td, $new_tr.find('.value')
|
||||
else if event.keyCode == 27
|
||||
stopTranslating()
|
||||
return
|
||||
return
|
||||
|
||||
$ ->
|
||||
$(document).foundation();
|
||||
$('.field.country-select select').change () ->
|
||||
@@ -169,3 +213,16 @@ $ ->
|
||||
# (json) ->
|
||||
# console.log json
|
||||
#, 'json'
|
||||
$('table#translations td.value').click () ->
|
||||
$this = $(this)
|
||||
if !$this.find('.translation-form').length
|
||||
startTranslating($this)
|
||||
if $('table#translations').length
|
||||
$(document).click (event) ->
|
||||
$target = $(event.target)
|
||||
if $target.closest('table#translations').length < 1 && !$target.hasClass('auto-translate')
|
||||
stopTranslating()
|
||||
$('.auto-translate').click (event) ->
|
||||
event.preventDefault()
|
||||
$td = $(this).parent()
|
||||
saveTranslation($td, null, true)
|
||||
@@ -22,3 +22,4 @@
|
||||
// Local settings (also edit foundation_and_overrides.scss to modify global variables)
|
||||
@import "sass/layout";
|
||||
@import "sass/typography";
|
||||
@import "sass/base";
|
||||
|
||||
@@ -0,0 +1,88 @@
|
||||
table#translations {
|
||||
td.value {
|
||||
position: relative;
|
||||
cursor: text;
|
||||
|
||||
&:hover,
|
||||
.translation-form {
|
||||
color: $white;
|
||||
background-color: $body-font-color;
|
||||
}
|
||||
}
|
||||
|
||||
.not-exists {
|
||||
td.value {
|
||||
font-style: italic;
|
||||
color: lighten($body-font-color, 45);
|
||||
}
|
||||
}
|
||||
|
||||
.translation-form {
|
||||
position: absolute;
|
||||
left: 0;
|
||||
top: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
z-index: 10;
|
||||
padding: inherit;
|
||||
|
||||
textarea {
|
||||
height: 100%;
|
||||
font-size: inherit;
|
||||
padding: 0;
|
||||
color: inherit;
|
||||
background-color: inherit;
|
||||
}
|
||||
|
||||
button {
|
||||
right: 100%;
|
||||
position: absolute;
|
||||
border-radius: 0;
|
||||
top: 0;
|
||||
}
|
||||
}
|
||||
|
||||
.auto-translate {
|
||||
float: right;
|
||||
}
|
||||
}
|
||||
|
||||
.grid.links {
|
||||
li > a {
|
||||
display: block;
|
||||
background-color: $color-5;
|
||||
color: $white;
|
||||
padding: 1em;
|
||||
min-height: 7em;
|
||||
|
||||
&:hover {
|
||||
background-color: $color-1;
|
||||
}
|
||||
|
||||
h3 {
|
||||
color: inherit;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ul.tags,
|
||||
.tags > ul {
|
||||
display: inline;
|
||||
list-style: none;
|
||||
font-size: 0.9em;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.tags {
|
||||
li {
|
||||
display: inline-block;
|
||||
background-color: $black;
|
||||
color: $white;
|
||||
padding: 0 0.5em;
|
||||
margin: 0.6em 0 0 0.3em;
|
||||
}
|
||||
h5 {
|
||||
float: left;
|
||||
color: lighten($body-font-color, 10);
|
||||
}
|
||||
}
|
||||
@@ -379,3 +379,13 @@ body.organizations-show {
|
||||
text-align: inherit;
|
||||
}
|
||||
}
|
||||
|
||||
table {
|
||||
td {
|
||||
vertical-align: top;
|
||||
|
||||
&.primary {
|
||||
width: 100%;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -14,7 +14,13 @@ class PagesController < ApplicationController
|
||||
def translate
|
||||
key = params[:translationkey]
|
||||
value = params[:translationvalue]
|
||||
if params[:translationhascount] == '1'
|
||||
if params[:auto_translate]
|
||||
if params[:translationlang] == 'en'
|
||||
value = I18n::MissingTranslationExceptionHandler.note(key)
|
||||
else
|
||||
value = I18n.backend.request_translation(key, {}, {fallback: true, locale: params[:translationlang]})
|
||||
end
|
||||
elsif params[:translationhascount] == '1'
|
||||
['zero', 'one', 'two', 'few', 'many'].each { |c|
|
||||
if params['translationpluralization_' + c]
|
||||
if !value.is_a?(Hash)
|
||||
@@ -34,18 +40,46 @@ class PagesController < ApplicationController
|
||||
end
|
||||
store_translations(params[:translationlang], {key => value}, :escape => false)
|
||||
begin
|
||||
render json: {success: true, key: key, jkey: key.gsub('.', '--'), translation: I18n.translate!(key, {:raise => false})}
|
||||
render json: {success: true, key: key, jkey: key.gsub('.', '--'), translation: I18n.translate(key, {:raise => false, :locale => params[:translationlang].to_sym})}
|
||||
rescue
|
||||
render json: {error: 'Failed to load translation'}
|
||||
end
|
||||
end
|
||||
|
||||
def location_territories
|
||||
#render json: (Carmen:::RegionCollection.new(Carmen::Country.coded(params[:country])) || []).to_json
|
||||
territories = {}
|
||||
Carmen::Country.coded(params[:country]).subregions.each { |t| territories[t.code] = t.name }
|
||||
render json: territories.to_json
|
||||
end
|
||||
def location_territories
|
||||
#render json: (Carmen:::RegionCollection.new(Carmen::Country.coded(params[:country])) || []).to_json
|
||||
territories = {}
|
||||
Carmen::Country.coded(params[:country]).subregions.each { |t| territories[t.code] = t.name }
|
||||
render json: territories.to_json
|
||||
end
|
||||
|
||||
def translations
|
||||
@lang = params[:lang]
|
||||
@translations = I18n.backend.get_translation_info
|
||||
I18n.config.enforce_available_locales = false
|
||||
end
|
||||
|
||||
def translation_list
|
||||
total = 0
|
||||
complete = 0
|
||||
@completeness = Hash.new
|
||||
translation_info = I18n.backend.get_translation_info()
|
||||
translation_info.each { |k,v|
|
||||
#total += 1
|
||||
#complete += v['languages'].include?(lang.to_s) ? 1 : 0
|
||||
v['languages'].each { |l|
|
||||
@completeness[l] ||= 0
|
||||
@completeness[l] += 1
|
||||
}
|
||||
}
|
||||
#@test = total ? complete / total : 0
|
||||
@total_translations = translation_info.size()
|
||||
@language_codes = I18n.backend.get_language_codes().select { |s| s }.sort{ | a1, a2 |
|
||||
c2 = @completeness.has_key?(a2.to_s) ? @completeness[a2.to_s] : 0
|
||||
c1 = @completeness.has_key?(a1.to_s) ? @completeness[a1.to_s] : 0
|
||||
c1 == c2 ? a1 <=> a2 : c2 <=> c1
|
||||
}
|
||||
end
|
||||
|
||||
private
|
||||
def store_translations(locale, data, options = {})
|
||||
|
||||
@@ -60,98 +60,82 @@ module ApplicationHelper
|
||||
content_for?(section) ? content_for(section) : default
|
||||
end
|
||||
|
||||
def _lorem_ipsum(method, size)
|
||||
options = {:random => true}
|
||||
case method.to_s
|
||||
when 'c', 'char', 'character', 'characters'
|
||||
if size
|
||||
return Forgery::LoremIpsum.characters size, options
|
||||
end
|
||||
return Forgery::LoremIpsum.character, options
|
||||
when 'w', 'word', 'words'
|
||||
if size
|
||||
return Forgery::LoremIpsum.words size, options
|
||||
end
|
||||
#return'LOREM'
|
||||
return Forgery::LoremIpsum.word options
|
||||
when 's', 'sentence', 'sentences'
|
||||
if size
|
||||
return Forgery::LoremIpsum.sentences size, options
|
||||
end
|
||||
return Forgery::LoremIpsum.sentence options
|
||||
when 'p', 'paragraph', 'paragraphs'
|
||||
if size
|
||||
return Forgery::LoremIpsum.paragraphs size, options.merge({:sentences => 10})
|
||||
end
|
||||
return Forgery::LoremIpsum.sentences 10, options
|
||||
when 't', 'title'
|
||||
return Forgery::LoremIpsum.sentences 1, options
|
||||
def _(key, behavior = nil, behavior_size = nil, locale: nil, vars: {}, html: nil, blockData: {}, &block)
|
||||
options = vars
|
||||
options[:fallback] = true
|
||||
if behavior
|
||||
options[:behavior] = behavior
|
||||
options[:behavior_size] = behavior_size
|
||||
end
|
||||
return nil
|
||||
end
|
||||
|
||||
def _(key, behavior = nil, behavior_size = nil, vars: {}, html: nil, blockData: {}, &block)
|
||||
if locale
|
||||
options[:locale] = locale.to_sym
|
||||
end
|
||||
#if vars
|
||||
# puts "\nVARS:\t#{vars}\n"
|
||||
#end
|
||||
I18n.translate(key, options)
|
||||
|
||||
queued_keys = nil
|
||||
result = nil
|
||||
|
||||
if key.kind_of?(Hash)
|
||||
blockData.merge!(key)
|
||||
key = key.keys
|
||||
end
|
||||
|
||||
if block_given?
|
||||
@@keyQueue ||= Array.new
|
||||
|
||||
if key.kind_of?(Array)
|
||||
@@keyQueue += key
|
||||
else
|
||||
@@keyQueue << key
|
||||
end
|
||||
end
|
||||
|
||||
if key.kind_of?(Array)
|
||||
new_key = key.shift
|
||||
if key.count > 0
|
||||
queued_keys = key.dup
|
||||
end
|
||||
key = new_key
|
||||
end
|
||||
|
||||
if blockData[key]
|
||||
behavior = blockData[key][:behavior] || nil
|
||||
behavior_size = blockData[key][:behavior_size] || nil
|
||||
vars = blockData[key][:vars] || {}
|
||||
end
|
||||
|
||||
@@lastTranslation = nil
|
||||
generate_control = _can_translate?
|
||||
|
||||
translation = _do_translate(key, vars, behavior, behavior_size)
|
||||
|
||||
if block_given?
|
||||
html = capture(&block)
|
||||
end
|
||||
|
||||
if html
|
||||
translation['html'] = html.gsub('%' + key + '%', translation['untranslated'])
|
||||
end
|
||||
|
||||
if generate_control
|
||||
@@lastTranslation = translation
|
||||
@@allTranslations ||= Hash.new
|
||||
@@allTranslations[key] = key
|
||||
|
||||
result = _translate_me(translation)
|
||||
end
|
||||
|
||||
result ||= translation['html'] || translation['untranslated']
|
||||
|
||||
if queued_keys
|
||||
return _ queued_keys, behavior, behavior_size, vars: vars, html: result, blockData: blockData
|
||||
end
|
||||
|
||||
return result
|
||||
#queued_keys = nil
|
||||
# #result = nil
|
||||
#
|
||||
# #if key.kind_of?(Hash)
|
||||
# # blockData.merge!(key)
|
||||
# # key = key.keys
|
||||
# #end
|
||||
#
|
||||
# #if block_given?
|
||||
# # @@keyQueue ||= Array.new
|
||||
#
|
||||
# # if key.kind_of?(Array)
|
||||
# # @@keyQueue += key
|
||||
# # else
|
||||
# # @@keyQueue << key
|
||||
# # end
|
||||
# #end
|
||||
#
|
||||
# #if key.kind_of?(Array)
|
||||
# # new_key = key.shift
|
||||
# # if key.count > 0
|
||||
# # queued_keys = key.dup
|
||||
# # end
|
||||
# # key = new_key
|
||||
# #end
|
||||
#
|
||||
# #if blockData[key]
|
||||
# # behavior = blockData[key][:behavior] || nil
|
||||
# # behavior_size = blockData[key][:behavior_size] || nil
|
||||
# # vars = blockData[key][:vars] || {}
|
||||
# #end
|
||||
#
|
||||
# #@@lastTranslation = nil
|
||||
# #generate_control = _can_translate?
|
||||
#
|
||||
# #puts "\nLLOOCCAALLEE:\t#{locale.to_s}"
|
||||
# #translation = _do_translate(key, vars, behavior, behavior_size, locale)
|
||||
#
|
||||
# #if block_given?
|
||||
# # html = capture(&block)
|
||||
# #end
|
||||
#
|
||||
# #if html
|
||||
# # translation['html'] = html.gsub('%' + key + '%', translation['untranslated'])
|
||||
# #end
|
||||
#
|
||||
# #if generate_control
|
||||
# # @@lastTranslation = translation
|
||||
# # @@allTranslations ||= Hash.new
|
||||
# # @@allTranslations[key] = key
|
||||
#
|
||||
# # result = _translate_me(translation)
|
||||
# #end
|
||||
#
|
||||
# #result ||= translation['html'] || (behavior.to_s == 'strict' ? nil : translation['untranslated'])
|
||||
#
|
||||
# #if queued_keys
|
||||
# # return _ queued_keys, behavior, behavior_size, vars: vars, html: result, blockData: blockData
|
||||
# #end
|
||||
#
|
||||
#return result
|
||||
end
|
||||
|
||||
def _translate_me(translation)
|
||||
@@ -161,27 +145,39 @@ module ApplicationHelper
|
||||
('<span class="translate-me ' + (translation['is_translated'] ? '' : 'un') + 'translated lang-' + (translation['lang']) + ' key--' + translation['key'].gsub('.', '--') + '" data-translate-key="' + translation['key'] + '" data-translate-untranslated="' + translation['untranslated'].gsub('"', '"') + (translation['translated'] ? '" data-translate-translated="' + translation['translated'] : '') + '" data-vars="' + (translation['vars'].length ? translation['vars'].to_json.gsub('"', '"') : '') + '" title="' + ('translate.alt_click') + '">' + (translation['html'] || translation['untranslated']) + '</span>').to_s.html_safe
|
||||
end
|
||||
|
||||
def _do_translate(key, vars, behavior, behavior_size)
|
||||
def _do_translate(key, vars, behavior, behavior_size, locale)
|
||||
translation = {'key' => key, 'lang' => '0', 'vars' => vars}
|
||||
v = vars.dup
|
||||
#locale ||= I18n.locale
|
||||
begin
|
||||
v[:raise] = true
|
||||
translation['untranslated'] = I18n.translate!(key, v)
|
||||
translation['lang'] = I18n.locale.to_s
|
||||
#v[:locale] = locale.to_sym
|
||||
#v[:fallback] = false
|
||||
#puts "\nSTART\n"
|
||||
options = {:raise => true}
|
||||
if locale
|
||||
options[:locale] = locale.to_sym
|
||||
end
|
||||
#puts "\n#{options.to_json.to_s}\n"
|
||||
translation['untranslated'] = I18n.translate(key, v, options)
|
||||
#puts "\nEND\n"
|
||||
translation['lang'] = locale.to_s
|
||||
translation['is_translated'] = true
|
||||
|
||||
hash = Hash.new
|
||||
translations = Translation.where(["locale = ? AND key LIKE ?", I18n.locale, key + '%']).take(6).each { |o| hash[o.key] = o.value }
|
||||
translations = Translation.where(["locale = ? AND key LIKE ?", locale.to_s, key + '%']).take(6).each { |o| hash[o.key] = o.value }
|
||||
translation['translated'] = hash.to_json.gsub('"', '"')
|
||||
rescue I18n::MissingTranslationData
|
||||
begin
|
||||
translation['untranslated'] = I18n.translate!(config.i18n.default_locale, key, vars)
|
||||
translation['lang'] = config.i18n.default_locale.to_s
|
||||
rescue
|
||||
default_translation = I18n::MissingTranslationExceptionHandler.note(key, behavior, behavior_size)
|
||||
translation['untranslated'] = default_translation
|
||||
end
|
||||
#begin
|
||||
#translation['untranslated'] = I18n.translate!(config.i18n.default_locale, key, vars)
|
||||
#translation['lang'] = config.i18n.default_locale.to_s
|
||||
#rescue
|
||||
#puts "BEHAVIOR:\t#{behavior.to_s}"
|
||||
default_translation = I18n::MissingTranslationExceptionHandler.note(key, behavior, behavior_size)
|
||||
translation['untranslated'] = default_translation
|
||||
#end
|
||||
end
|
||||
puts "TRANSLATION:\t#{translation.to_json.to_s}"
|
||||
return translation
|
||||
end
|
||||
|
||||
|
||||
@@ -0,0 +1,22 @@
|
||||
.row
|
||||
%h1
|
||||
= _ 'languages.list'
|
||||
%h2
|
||||
= _ 'languages.active'
|
||||
%ul.languages.active.small-block-grid-1.medium-block-grid-3.large-block-grid-4.grid.links
|
||||
- @language_codes.each do |code|
|
||||
- if code && @completeness.has_key?(code.to_s)
|
||||
%li.text-center
|
||||
%a{:href => "/translations/#{code}/"}
|
||||
%h3=_"languages.#{code}"
|
||||
- completeness = @completeness[code.to_s]
|
||||
- percent = @total_translations ? ((completeness / @total_translations.to_f) * 100).round() : 0
|
||||
.completeness
|
||||
= "#{completeness} / #{@total_translations} (#{percent}%)"
|
||||
%h2= _ 'languages.inactive'
|
||||
%ul.languages.inactive.small-block-grid-1.medium-block-grid-3.large-block-grid-4.grid.links
|
||||
- @language_codes.each do |code|
|
||||
- if code && !@completeness.has_key?(code.to_s)
|
||||
%li.text-center
|
||||
%a{:href => "/translations/#{code}/"}
|
||||
%h3=_"languages.#{code}"
|
||||
@@ -0,0 +1,41 @@
|
||||
.row
|
||||
%h1
|
||||
= _ 'language_translations', vars: {:language => (_ ('languages.' + @lang))}
|
||||
%table.columns#translations
|
||||
%thead
|
||||
%tr
|
||||
%th.key=_'translations.Key'
|
||||
%th.key=_'translations.Pages'
|
||||
%th.key=_'translations.Value'
|
||||
- @translations.sort{| a1, a2 | a1[0].downcase <=> a2[0].downcase}.each do |k,translation|
|
||||
- current_translation = Translation.locale(@lang.to_sym).lookup(k)#[0].value #_ translation[0], :strict, locale: @lang.to_sym
|
||||
- current_translation = current_translation.size() > 0 ? current_translation = current_translation[0].value : nil
|
||||
- cached = (translation['languages'] && translation['languages'].include?(@lang))
|
||||
- vars = translation.has_key?('vars') && translation['vars'].size() > 0 ? translation['vars'] : nil
|
||||
- (vars && vars.include?(:count) ? I18n.backend.get_pluralization_rules(@lang) : [nil]).each do |pluralization|
|
||||
- key = k + (pluralization ? ".#{pluralization.to_s}" : '')
|
||||
%tr{:class => current_translation ? 'exists' : 'not-exists', :data => {:key => key}}
|
||||
%td.key
|
||||
= key
|
||||
- if vars
|
||||
.tags
|
||||
%h5=_'translations.Vars'
|
||||
%ul
|
||||
- vars.each do |v|
|
||||
%li=v
|
||||
%td.pages
|
||||
%ul
|
||||
- translation['pages'].each do |page|
|
||||
%li
|
||||
%a{:href => page}=page
|
||||
%td.value.primary
|
||||
- if current_translation
|
||||
= current_translation
|
||||
- elsif I18n.locale.to_s == @lang.to_s
|
||||
Nil
|
||||
- else
|
||||
- translation_hint = Translation.locale(I18n.locale).lookup(k)
|
||||
- translation_hint = translation_hint && translation_hint.size() > 0 ? translation_hint = translation_hint[0].value : nil
|
||||
= translation_hint ? (_ "languages.#{I18n.locale.to_s}") + " = \"#{translation_hint}\"" : 'Nil'
|
||||
- unless current_translation
|
||||
%a{:href => '#', :class => 'auto-translate button small'}='Auto'
|
||||
@@ -1,4 +1,4 @@
|
||||
= form_tag user_sessions_path, :method => :post do
|
||||
= field :email, :email_field
|
||||
= field :password, :password_field_tag
|
||||
= actions [:sign_in, :facebook_sign_in]
|
||||
= actions [:Sign_In, :facebook_sign_in]
|
||||
|
||||
Reference in New Issue
Block a user