tolk 1.2.0 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. checksums.yaml +7 -0
  2. data/app/assets/javascripts/tolk/actions.js +30 -0
  3. data/app/assets/javascripts/tolk/application.js +3 -4
  4. data/app/assets/javascripts/tolk/interpolations.js +21 -0
  5. data/app/assets/javascripts/tolk/jquery-1.9.1.min.js +5 -0
  6. data/app/assets/javascripts/tolk/layout.js +17 -0
  7. data/app/assets/javascripts/tolk/libraries.js +1 -0
  8. data/app/assets/stylesheets/tolk/application.css +4 -2
  9. data/app/assets/stylesheets/tolk/screen.css +104 -38
  10. data/app/controllers/tolk/application_controller.rb +5 -4
  11. data/app/controllers/tolk/locales_controller.rb +51 -12
  12. data/app/controllers/tolk/searches_controller.rb +3 -3
  13. data/app/helpers/tolk/application_helper.rb +22 -6
  14. data/app/models/tolk/locale.rb +96 -95
  15. data/app/models/tolk/phrase.rb +4 -5
  16. data/app/models/tolk/translation.rb +53 -11
  17. data/app/views/layouts/tolk/application.html.erb +6 -10
  18. data/app/views/tolk/locales/all.html.erb +14 -9
  19. data/app/views/tolk/locales/index.html.erb +1 -4
  20. data/app/views/tolk/locales/show.html.erb +14 -9
  21. data/app/views/tolk/searches/_form.html.erb +2 -2
  22. data/app/views/tolk/searches/show.html.erb +15 -10
  23. data/config/initializers/will_paginate.rb +18 -0
  24. data/config/routes.rb +4 -0
  25. data/lib/generators/tolk/install_generator.rb +44 -0
  26. data/lib/generators/tolk/templates/initializer.erb +412 -0
  27. data/lib/generators/{tolk_migration/templates/migrate/create_tolk_tables.rb → tolk/templates/migration.rb} +0 -0
  28. data/lib/generators/tolk/utils.rb +35 -0
  29. data/lib/tasks/tolk_tasks.rake +14 -2
  30. data/lib/tolk.rb +13 -2
  31. data/lib/tolk/config.rb +87 -0
  32. data/lib/tolk/engine.rb +18 -0
  33. data/lib/tolk/export.rb +27 -0
  34. data/lib/tolk/import.rb +23 -5
  35. data/lib/tolk/pagination.rb +28 -0
  36. data/lib/tolk/sync.rb +25 -9
  37. data/lib/tolk/version.rb +2 -2
  38. data/lib/tolk/yaml.rb +29 -0
  39. metadata +113 -40
  40. data/app/assets/javascripts/tolk/controls.js +0 -963
  41. data/app/assets/javascripts/tolk/dragdrop.js +0 -972
  42. data/app/assets/javascripts/tolk/effects.js +0 -1120
  43. data/app/assets/javascripts/tolk/prototype.js +0 -4221
  44. data/init.rb +0 -8
  45. data/lib/generators/tolk_migration/tolk_migration_generator.rb +0 -19
@@ -1,28 +1,24 @@
1
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
2
-
3
- <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="<%= Tolk::Locale.primary_locale_name %>" lang="<%= Tolk::Locale.primary_locale_name %>">
1
+ <!DOCTYPE html>
2
+ <html lang="<%= Tolk::Locale.primary_locale_name %>">
4
3
 
5
4
  <head>
6
5
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
7
6
  <title>Tolk</title>
8
7
 
9
- <%= javascript_include_tag "tolk/application" %>
10
8
  <%= stylesheet_link_tag "tolk/application" %>
9
+
11
10
  <%= yield :head %>
12
11
  </head>
13
12
 
14
13
  <body>
15
14
  <div id="container">
16
15
  <div id="head">
17
- <h1><span class="home"><%= link_to "Tolk", tolk.root_path %></span><%= yield :locale %></h1>
16
+ <h1><span class="home"><%= link_to "Tolk", root_path %></span><% if @locale.present? %><span class="locale"><%= link_to @locale.language_name, locale_path(@locale) %></span><% end %><span class="locale"><%= button_to "Apply Changes", dump_all_locales_path, :method => :post, :class => "apply" %></span></h1>
18
17
  </div>
19
18
  <%= yield %>
20
19
  </div>
21
20
 
22
- <script type="text/javascript">
23
- $$('td textarea').each(function(element) {
24
- element.setStyle({height: element.up('td').measure('height')+'px'});
25
- });
26
- </script>
21
+ <%= javascript_include_tag "tolk/libraries" %>
22
+ <%= javascript_include_tag "tolk/application" %>
27
23
  </body>
28
24
  </html>
@@ -1,6 +1,3 @@
1
- <% content_for :locale do %><span class="locale"><%= @locale.language_name %></span>
2
- <% end %>
3
-
4
1
  <h3 class="switch">Completed translations <span>(<%= link_to 'See phrases missing translation', @locale %>)</span></h3>
5
2
 
6
3
  <% if @locale.has_updated_translations? && action_name != 'updated' %>
@@ -17,6 +14,7 @@
17
14
  <table class="translations">
18
15
  <tr>
19
16
  <th class="translation"><%= @locale.language_name -%></th>
17
+ <th class="actions"></th>
20
18
  <th class="key"><%= Tolk::Locale.primary_language_name -%></th>
21
19
  </tr>
22
20
  <% @phrases.each do |phrase| %>
@@ -28,19 +26,26 @@
28
26
  <%= text_area_tag :"translations[][text]", format_i18n_text_area_value(phrase.translation.text), :class => 'locale',
29
27
  :onfocus => "$(this).up('tr').addClassName('active');", :onblur => "$(this).up('tr').removeClassName('active');" %>
30
28
  </td>
31
- <td class="phrase">
32
-
29
+ <td class="actions">
30
+ <a class="copy" href="#" tabindex="-1" title="Copy original translation">&larr;</a><br>
31
+ <span class="warning" title="Interpolation keys don't match">⚠</span>
32
+ </td>
33
+ <td class="original">
34
+ <%= text_area_tag :"translations[][original_text]", format_i18n_text_area_value(phrase.translations.primary.text), :disabled => true %>
35
+
33
36
  <% if action_name == 'updated' %>
34
37
  <div class="updated">
35
38
  <span class="key">Updated</span>
36
39
  <%= format_i18n_value(phrase.translations.primary.text) -%>
40
+ <%= boolean_warning if phrase.translations.primary.boolean? -%>
37
41
  </div>
38
- <div class="original">
39
- <span class="key">Original</span>
42
+ <div class="previous">
43
+ <span class="key">Previous</span>
40
44
  <%= format_i18n_value(phrase.translations.primary.previous_text) -%>
41
45
  </div>
42
46
  <% else %>
43
47
  <%= format_i18n_value(phrase.translations.primary.text) -%>
48
+ <%= boolean_warning if phrase.translations.primary.boolean? -%>
44
49
  <% end %>
45
50
 
46
51
  <span class="key"><%= phrase.key %></span>
@@ -50,10 +55,10 @@
50
55
  <% end %>
51
56
  </table>
52
57
  <div class="table_submit">
53
- <p><%= locale_form.submit "Save changes" %></p>
58
+ <p><%= locale_form.submit "Save changes", :class => 'save' %></p>
54
59
  </div>
55
60
  <div class="paginate">
56
- <%= will_paginate @phrases %>
61
+ <%= tolk_paginate @phrases %>
57
62
  </div>
58
63
  <% end %>
59
64
  <% else %>
@@ -1,6 +1,3 @@
1
- <% content_for :locale do %><span class="locale empty"></span>
2
- <% end %>
3
-
4
1
  <h2>Locales <span>Primary locale is <%= Tolk::Locale.primary_locale.language_name %></span></h2>
5
2
  <% if @locales.any? %>
6
3
  <ul class="locales clearfix">
@@ -9,7 +6,7 @@
9
6
  <%= link_to locale.language_name, locale %>
10
7
  <% missing_count = locale.count_phrases_without_translation %>
11
8
  <% if missing_count > 0 %>
12
- <span class="missing_translations"><%= locale.count_phrases_without_translation %></span>
9
+ <span class="missing_translations"><%= missing_count %></span>
13
10
  <% end %>
14
11
  </li>
15
12
  <% end %>
@@ -1,7 +1,3 @@
1
- <% content_for :locale do %>
2
- <span class="locale"><%= @locale.language_name %></span>
3
- <% end %>
4
-
5
1
  <% content_for :head do %>
6
2
  <link rel="alternate" type="application/rss+xml" title="RSS" href="<%= tolk.locale_path(@locale, :format => 'atom') -%>" />
7
3
  <% end %>
@@ -22,6 +18,7 @@
22
18
  <table class="translations">
23
19
  <tr>
24
20
  <th class="translation"><%= @locale.language_name -%></th>
21
+ <th class="actions"></th>
25
22
  <th class="key"><%= Tolk::Locale.primary_language_name -%></th>
26
23
  </tr>
27
24
  <% @phrases.each do |phrase| %>
@@ -31,25 +28,33 @@
31
28
  <%= hidden_field_tag :"translations[][id]", translation.id, :id => "#{translation.object_id}_id" %>
32
29
  <%= hidden_field_tag :"translations[][phrase_id]", phrase.id, :id => "#{translation.object_id}_phrase_id" %>
33
30
  <%= hidden_field_tag :"translations[][locale_id]", translation.locale_id, :id => "#{translation.object_id}_locale_id" %>
34
- <%= text_area_tag :"translations[][text]", format_i18n_text_area_value(translation.text), :class => "locale", :id => "#{translation.object_id}_text", :onfocus => "$(this).up('tr').addClassName('active');", :onblur => "$(this).up('tr').removeClassName('active');" %>
31
+ <%= text_area_tag :"translations[][text]", format_i18n_text_area_value(translation.text), :class => "locale", :id => "#{translation.object_id}_text" %>
32
+ </td>
33
+ <td class="actions">
34
+ <a class="copy" href="#" tabindex="-1" title="Copy original translation">&larr;</a><br>
35
+ <span class="warning" title="Interpolation keys don't match">⚠</span>
35
36
  </td>
36
- <td class="phrase">
37
+ <td class="original">
38
+ <%= text_area_tag :"translations[][original_text]", format_i18n_text_area_value(phrase.translations.primary.text), :disabled => true %>
39
+
37
40
  <% if params[:q].present? -%>
38
41
  <%= highlight(format_i18n_value(phrase.translations.primary.text), params[:q]) -%>
39
42
  <% else -%>
40
- <%= format_i18n_value(phrase.translations.primary.text).html_safe -%>
43
+ <%= format_i18n_value(phrase.translations.primary.text) -%>
41
44
  <% end -%>
45
+ <%= boolean_warning if phrase.translations.primary.boolean? -%>
46
+
42
47
  <span class="key" title="<%= phrase.key %>"><%= truncate(phrase.key, :length => 100) %></span>
43
48
  </td>
44
49
  </tr>
45
50
  <% end %>
46
51
  </table>
47
52
  <div class="table_submit">
48
- <p><%= locale_form.submit "Save changes" %></p>
53
+ <p><%= locale_form.submit "Save changes", :class => 'save' %></p>
49
54
  </div>
50
55
  <% end %>
51
56
  <div class="paginate">
52
- <%= will_paginate @phrases %>
57
+ <%= tolk_paginate @phrases %>
53
58
  </div>
54
59
  <% else %>
55
60
  <p style="text-align: left">There aren't any missing or updated phrases that need translation.</p>
@@ -1,5 +1,5 @@
1
- <%= form_tag "/tolk/search", :method => :get do %>
2
- <%= hidden_field_tag :locale, locale.name %>
1
+ <%= form_tag tolk.search_path, :method => :get do %>
2
+ <%= hidden_field_tag :tolk_locale, locale.name %>
3
3
  Search for
4
4
  <%= scope_selector_for(@locale) %>
5
5
  phrase:
@@ -1,7 +1,3 @@
1
- <% content_for :locale do %>
2
- <span class="locale"><%= @locale.language_name %></span>
3
- <% end %>
4
-
5
1
  <h3 class="search">
6
2
  <%= render :partial => "form", :locals => { :locale => @locale } %>
7
3
  </h3>
@@ -18,11 +14,12 @@
18
14
  <table class="translations">
19
15
  <tr>
20
16
  <th class="translation"><%= @locale.language_name -%></th>
17
+ <th class="actions"></th>
21
18
  <th class="key"><%= Tolk::Locale.primary_language_name -%></th>
22
19
  </tr>
23
20
  <% @phrases.each do |phrase| %>
24
21
 
25
- <% if translation = phrase.translations.find_by_locale_id(@locale.id) || Tolk::Translation.new(:locale => @locale, :phrase => phrase) %>
22
+ <% if translation = phrase.translations.where(locale_id: @locale.id).first || Tolk::Translation.new(:locale => @locale, :phrase => phrase) %>
26
23
  <tr>
27
24
  <td class="translation">
28
25
  <%= hidden_field_tag :"translations[][id]", translation.id, :id => "#{translation.object_id}_id" %>
@@ -30,26 +27,34 @@
30
27
  <%= hidden_field_tag :"translations[][locale_id]", translation.locale_id, :id => "#{translation.object_id}_locale_id" %>
31
28
  <%= text_area_tag :"translations[][text]", format_i18n_text_area_value(translation.text), :class => "locale", :id => "#{translation.object_id}_text", :onfocus => "$(this).up('tr').addClassName('active');", :onblur => "$(this).up('tr').removeClassName('active');" %>
32
29
  </td>
33
- <td class="phrase">
30
+ <td class="actions">
31
+ <a class="copy" href="#" tabindex="-1" title="Copy original translation">&larr;</a><br>
32
+ <span class="warning" title="Interpolation keys don't match">⚠</span>
33
+ </td>
34
+ <td class="original">
35
+ <%= text_area_tag :"translations[][original_text]", format_i18n_text_area_value(phrase.translations.primary.text), :disabled => true %>
36
+
34
37
  <% if params[:q].present? -%>
35
38
  <%= highlight(format_i18n_value(phrase.translations.primary.text), params[:q]) -%>
36
39
  <% else -%>
37
40
  <%= format_i18n_value(phrase.translations.primary.text) -%>
38
41
  <% end -%>
42
+ <%= boolean_warning if phrase.translations.primary.boolean? -%>
43
+
39
44
  <span class="key" title="<%= phrase.key %>"><%= params[:k].present? ?
40
- highlight(h(truncate(phrase.key, :length => 100)), params[:k]) :
41
- h(truncate(phrase.key, :length => 100)) %></span>
45
+ highlight(h(truncate(phrase.key, :length => 100)), params[:k]) :
46
+ h(truncate(phrase.key, :length => 100)) %></span>
42
47
  </td>
43
48
  </tr>
44
49
  <% end %>
45
50
  <% end %>
46
51
  </table>
47
52
  <div class="table_submit">
48
- <p><%= locale_form.submit "Save changes" %></p>
53
+ <p><%= locale_form.submit "Save changes", :class => 'save' %></p>
49
54
  </div>
50
55
  <% end %>
51
56
  <div class="paginate">
52
- <%= will_paginate @phrases %>
57
+ <%= tolk_paginate @phrases %>
53
58
  </div>
54
59
  <% else %>
55
60
  <p style="text-align: left">No search results.</p>
@@ -0,0 +1,18 @@
1
+ if defined?(WillPaginate)
2
+ ActiveSupport.on_load :active_record do
3
+ module WillPaginate
4
+ module ActiveRecord
5
+ module RelationMethods
6
+ def per(value = nil) per_page(value) end
7
+ def total_count() count end
8
+ end
9
+ end
10
+ module CollectionMethods
11
+ alias_method :num_pages, :total_pages
12
+ end
13
+ module PerPage
14
+ def paginates_per(value) self.per_page=(value) end
15
+ end
16
+ end
17
+ end
18
+ end
data/config/routes.rb CHANGED
@@ -1,5 +1,9 @@
1
1
  Tolk::Engine.routes.draw do
2
2
  root :to => 'locales#index'
3
+
4
+ post "/dump_all" => "locales#dump_all", :as => :dump_all_locales
5
+ get "/stats" => "locales#stats"
6
+
3
7
  resources :locales do
4
8
  member do
5
9
  get :all
@@ -0,0 +1,44 @@
1
+ require 'rails/generators'
2
+ require File.expand_path('../utils', __FILE__)
3
+
4
+ # http://guides.rubyonrails.org/generators.html
5
+ # http://rdoc.info/github/wycats/thor/master/Thor/Actions.html
6
+ # keep generator idempotent, thanks
7
+ # Thanks to https://github.com/sferik/rails_admin !
8
+
9
+ module Tolk
10
+ class InstallGenerator < Rails::Generators::Base
11
+
12
+ source_root File.expand_path("../templates", __FILE__)
13
+ include Rails::Generators::Migration
14
+ include Generators::Utils::InstanceMethods
15
+ extend Generators::Utils::ClassMethods
16
+
17
+ argument :_namespace, :type => :string, :required => false, :desc => "Tolk url namespace"
18
+ desc "Tolk installation generator"
19
+ def install
20
+ routes = File.open(Rails.root.join("config/routes.rb")).try :read
21
+ initializer = (File.open(Rails.root.join("config/initializers/tolk.rb")) rescue nil).try :read
22
+
23
+ display "Hello, Tolk installer will help you sets things up!", :black
24
+ unless initializer
25
+ install_generator = ask_boolean("Do you want to install the optional configuration file (to change mappings, locales dump location etc..) ?")
26
+ template "initializer.erb", "config/initializers/tolk.rb" if install_generator
27
+ else
28
+ display "You already have a config file. You're updating, heh? I'm generating a new 'tolk.rb.example' that you can review."
29
+ template "initializer.erb", "config/initializers/tolk.rb.example"
30
+ end
31
+
32
+ display "Adding a migration..."
33
+ migration_template 'migration.rb', 'db/migrate/create_tolk_tables.rb' rescue display $!.message
34
+
35
+ namespace = ask_for("Where do you want to mount tolk?", "tolk", _namespace)
36
+ gsub_file "config/routes.rb", /mount Tolk::Engine => \'\/.+\', :as => \'tolk\'/, ''
37
+ gsub_file "config/routes.rb", /mount Tolk::Engine => \'\/.+\'/, ''
38
+ route("mount Tolk::Engine => '/#{namespace}', :as => 'tolk'")
39
+
40
+ display "Job's done: migrate, start your server and visit '/#{namespace}'!", :blue
41
+
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,412 @@
1
+ # encoding: utf-8
2
+
3
+ # Tolk config file. Generated on <%= DateTime.now.to_s(:long) %>
4
+ # See github.com/tolk/tolk for more informations
5
+
6
+ Tolk.config do |config|
7
+
8
+ # If you need to add a mapping do it like this :
9
+ # May we suggest you use http://en.wikipedia.org/wiki/List_of_ISO_639-1_codes
10
+ # config.mapping['fr-ES'] = 'Frañol !'
11
+
12
+ # config.mapping['aa'] = 'Afar'
13
+ # config.mapping['aa-DJ'] = 'Afar (Djibouti)'
14
+ # config.mapping['aa-ER'] = 'Afar (Eritrea)'
15
+ # config.mapping['aa-ET'] = 'Afar (Ethiopia)'
16
+ # config.mapping['af'] = 'Afrikaans'
17
+ # config.mapping['af-NA'] = 'Afrikaans (Namibia)'
18
+ # config.mapping['af-ZA'] = 'Afrikaans (South Africa)'
19
+ # config.mapping['ak'] = 'Akan'
20
+ # config.mapping['ak-GH'] = 'Akan (Ghana)'
21
+ # config.mapping['am'] = 'Amharic'
22
+ # config.mapping['am-ET'] = 'Amharic (Ethiopia)'
23
+ # config.mapping['ar'] = 'Arabic'
24
+ # config.mapping['ar-AE'] = 'Arabic (United Arab Emirates)'
25
+ # config.mapping['ar-BH'] = 'Arabic (Bahrain)'
26
+ # config.mapping['ar-DZ'] = 'Arabic (Algeria)'
27
+ # config.mapping['ar-EG'] = 'Arabic (Egypt)'
28
+ # config.mapping['ar-IQ'] = 'Arabic (Iraq)'
29
+ # config.mapping['ar-JO'] = 'Arabic (Jordan)'
30
+ # config.mapping['ar-KW'] = 'Arabic (Kuwait)'
31
+ # config.mapping['ar-LB'] = 'Arabic (Lebanon)'
32
+ # config.mapping['ar-LY'] = 'Arabic (Libya)'
33
+ # config.mapping['ar-MA'] = 'Arabic (Morocco)'
34
+ # config.mapping['ar-OM'] = 'Arabic (Oman)'
35
+ # config.mapping['ar-QA'] = 'Arabic (Qatar)'
36
+ # config.mapping['ar-SA'] = 'Arabic (Saudi Arabia)'
37
+ # config.mapping['ar-SD'] = 'Arabic (Sudan)'
38
+ # config.mapping['ar-SY'] = 'Arabic (Syria)'
39
+ # config.mapping['ar-TN'] = 'Arabic (Tunisia)'
40
+ # config.mapping['ar-YE'] = 'Arabic (Yemen)'
41
+ # config.mapping['as'] = 'Assamese'
42
+ # config.mapping['as-IN'] = 'Assamese (India)'
43
+ # config.mapping['az'] = 'Azerbaijani'
44
+ # config.mapping['az-AZ'] = 'Azerbaijani (Azerbaijan)'
45
+ # config.mapping['be'] = 'Belarusian'
46
+ # config.mapping['be-BY'] = 'Belarusian (Belarus)'
47
+ # config.mapping['bg'] = 'Bulgarian'
48
+ # config.mapping['bg-BG'] = 'Bulgarian (Bulgaria)'
49
+ # config.mapping['bn'] = 'Bengali'
50
+ # config.mapping['bn-BD'] = 'Bengali (Bangladesh)'
51
+ # config.mapping['bn-IN'] = 'Bengali (India)'
52
+ # config.mapping['bo'] = 'Tibetan'
53
+ # config.mapping['bo-CN'] = 'Tibetan (China)'
54
+ # config.mapping['bn-IN'] = 'Tibetan (India)'
55
+ # config.mapping['bs'] = 'Bosnian'
56
+ # config.mapping['bs-BA'] = 'Bosnian (Bosnia and Herzegovina)'
57
+ # config.mapping['byn'] = 'Blin'
58
+ # config.mapping['byn-ER'] = 'Blin (Eritrea)'
59
+ # config.mapping['ca'] = 'Catalan'
60
+ # config.mapping['ca-ES'] = 'Catalan (Spain)'
61
+ # config.mapping['cch'] = 'Atsam'
62
+ # config.mapping['cch-NG'] = 'Atsam (Nigeria)'
63
+ # config.mapping['cop'] = 'Coptic'
64
+ # config.mapping['cs'] = 'Czech'
65
+ # config.mapping['cs-CZ'] = 'Czech (Czech Republic)'
66
+ # config.mapping['cy'] = 'Welsh'
67
+ # config.mapping['cy-GB'] = 'Welsh (United Kingdom)'
68
+ # config.mapping['da'] = 'Danish'
69
+ # config.mapping['da-DK'] = 'Danish (Denmark)'
70
+ # config.mapping['de'] = 'German'
71
+ # config.mapping['de-AT'] = 'German (Austria)'
72
+ # config.mapping['de-BE'] = 'German (Belgium)'
73
+ # config.mapping['de-CH'] = 'German (Switzerland)'
74
+ # config.mapping['de-DE'] = 'German (Germany)'
75
+ # config.mapping['de-LI'] = 'German (Liechtenstein)'
76
+ # config.mapping['de-LU'] = 'German (Luxembourg)'
77
+ # config.mapping['dv'] = 'Divehi'
78
+ # config.mapping['dv-MV'] = 'Divehi (Maldives)'
79
+ # config.mapping['dz'] = 'Dzongkha'
80
+ # config.mapping['dz-BT'] = 'Dzongkha (Bhutan)'
81
+ # config.mapping['ee'] = 'Ewe'
82
+ # config.mapping['ee-GH'] = 'Ewe (Ghana)'
83
+ # config.mapping['ee-TG'] = 'Ewe (Togo)'
84
+ # config.mapping['el'] = 'Greek'
85
+ # config.mapping['el-CY'] = 'Greek (Cyprus)'
86
+ # config.mapping['el-GR'] = 'Greek (Greece)'
87
+ # config.mapping['en'] = 'English'
88
+ # config.mapping['en-AS'] = 'English (American Samoa)'
89
+ # config.mapping['en-AU'] = 'English (Australia)'
90
+ # config.mapping['en-BE'] = 'English (Belgium)'
91
+ # config.mapping['en-BW'] = 'English (Botswana)'
92
+ # config.mapping['en-BZ'] = 'English (Belize)'
93
+ # config.mapping['en-CA'] = 'English (Canada)'
94
+ # config.mapping['en-GB'] = 'English (United Kingdom)'
95
+ # config.mapping['en-GU'] = 'English (Guam)'
96
+ # config.mapping['en-HK'] = 'English (Hong Kong)'
97
+ # config.mapping['en-IE'] = 'English (Ireland)'
98
+ # config.mapping['en-IN'] = 'English (India)'
99
+ # config.mapping['en-JM'] = 'English (Jamaica)'
100
+ # config.mapping['en-MH'] = 'English (Marshall Islands)'
101
+ # config.mapping['en-MP'] = 'English (Northern Mariana Islands)'
102
+ # config.mapping['en-MT'] = 'English (Malta)'
103
+ # config.mapping['en-NA'] = 'English (Namibia)'
104
+ # config.mapping['en-NZ'] = 'English (New Zealand)'
105
+ # config.mapping['en-PH'] = 'English (Philippines)'
106
+ # config.mapping['en-PK'] = 'English (Pakistan)'
107
+ # config.mapping['en-SG'] = 'English (Singapore)'
108
+ # config.mapping['en-TT'] = 'English (Trinidad and Tobago)'
109
+ # config.mapping['en-UM'] = 'English (United States Minor Outlying Islands)'
110
+ # config.mapping['en-US'] = 'English (United States)'
111
+ # config.mapping['en-VI'] = 'English (U.S. Virgin Islands)'
112
+ # config.mapping['en-ZA'] = 'English (South Africa)'
113
+ # config.mapping['en-ZW'] = 'English (Zimbabwe)'
114
+ # config.mapping['eo'] = 'Esperanto'
115
+ # config.mapping['es'] = 'Spanish'
116
+ # config.mapping['es-AR'] = 'Spanish (Argentina)'
117
+ # config.mapping['es-BO'] = 'Spanish (Bolivia)'
118
+ # config.mapping['es-CL'] = 'Spanish (Chile)'
119
+ # config.mapping['es-CO'] = 'Spanish (Colombia)'
120
+ # config.mapping['es-CR'] = 'Spanish (Costa Rica)'
121
+ # config.mapping['es-DO'] = 'Spanish (Dominican Republic)'
122
+ # config.mapping['es-EC'] = 'Spanish (Ecuador)'
123
+ # config.mapping['es-ES'] = 'Spanish (Spain)'
124
+ # config.mapping['es-GT'] = 'Spanish (Guatemala)'
125
+ # config.mapping['es-HN'] = 'Spanish (Honduras)'
126
+ # config.mapping['es-MX'] = 'Spanish (Mexico)'
127
+ # config.mapping['es-NI'] = 'Spanish (Nicaragua)'
128
+ # config.mapping['es-PA'] = 'Spanish (Panama)'
129
+ # config.mapping['es-PE'] = 'Spanish (Peru)'
130
+ # config.mapping['es-PR'] = 'Spanish (Puerto Rico)'
131
+ # config.mapping['es-PY'] = 'Spanish (Paraguay)'
132
+ # config.mapping['es-SV'] = 'Spanish (El Salvador)'
133
+ # config.mapping['es-US'] = 'Spanish (United States)'
134
+ # config.mapping['es-UY'] = 'Spanish (Uruguay)'
135
+ # config.mapping['es-VE'] = 'Spanish (Venezuela)'
136
+ # config.mapping['et'] = 'Estonian'
137
+ # config.mapping['et-EE'] = 'Estonian (Estonia)'
138
+ # config.mapping['eu'] = 'Basque'
139
+ # config.mapping['eu-ES'] = 'Basque (Spain)'
140
+ # config.mapping['fa'] = 'Persian'
141
+ # config.mapping['fa-AF'] = 'Persian (Afghanistan)'
142
+ # config.mapping['fa-IR'] = 'Persian (Iran)'
143
+ # config.mapping['fi'] = 'Finnish'
144
+ # config.mapping['fi-FI'] = 'Finnish (Finland)'
145
+ # config.mapping['fil'] = 'Filipino'
146
+ # config.mapping['fil-PH'] = 'Filipino (Philippines)'
147
+ # config.mapping['fo'] = 'Faroese'
148
+ # config.mapping['fo-FO'] = 'Faroese (Faroe Islands)'
149
+ # config.mapping['fr'] = 'French'
150
+ # config.mapping['fr-BE'] = 'French (Belgium)'
151
+ # config.mapping['fr-CA'] = 'French (Canada)'
152
+ # config.mapping['fr-CH'] = 'French (Switzerland)'
153
+ # config.mapping['fr-FR'] = 'French (France)'
154
+ # config.mapping['fr-LU'] = 'French (Luxembourg)'
155
+ # config.mapping['fr-MC'] = 'French (Monaco)'
156
+ # config.mapping['fr-SN'] = 'French (Senegal)'
157
+ # config.mapping['fur'] = 'Friulian'
158
+ # config.mapping['fur-IT'] = 'Friulian (Italy)'
159
+ # config.mapping['ga'] = 'Irish'
160
+ # config.mapping['ga-IE'] = 'Irish (Ireland)'
161
+ # config.mapping['gaa'] = 'Ga'
162
+ # config.mapping['gaa-GH'] = 'Ga (Ghana)'
163
+ # config.mapping['gez'] = 'Geez'
164
+ # config.mapping['gez-ER'] = 'Geez (Eritrea)'
165
+ # config.mapping['gez-ET'] = 'Geez (Ethiopia)'
166
+ # config.mapping['gl'] = 'Gallegan'
167
+ # config.mapping['gl-ES'] = 'Gallegan (Spain)'
168
+ # config.mapping['gsw'] = 'Swiss German'
169
+ # config.mapping['gsw-CH'] = 'Swiss German (Swiss)'
170
+ # config.mapping['gu'] = 'Gujarati'
171
+ # config.mapping['gu-IN'] = 'Gujarati (India)'
172
+ # config.mapping['gv'] = 'Manx'
173
+ # config.mapping['gv-GB'] = 'Manx (United Kingdom)'
174
+ # config.mapping['ha'] = 'Hausa'
175
+ # config.mapping['ha-GH'] = 'Hausa (Ghana)'
176
+ # config.mapping['ha-NE'] = 'Hausa (Niger)'
177
+ # config.mapping['ha-NG'] = 'Hausa (Nigeria)'
178
+ # config.mapping['ha-SD'] = 'Hausa (Sudan)'
179
+ # config.mapping['haw'] = 'Hawaiian'
180
+ # config.mapping['haw-US'] = 'Hawaiian (United States)'
181
+ # config.mapping['he'] = 'Hebrew'
182
+ # config.mapping['he-IL'] = 'Hebrew (Israel)'
183
+ # config.mapping['hi'] = 'Hindi'
184
+ # config.mapping['hi-IN'] = 'Hindi (India)'
185
+ # config.mapping['hr'] = 'Croatian'
186
+ # config.mapping['hr-HR'] = 'Croatian (Croatia)'
187
+ # config.mapping['hu'] = 'Hungarian'
188
+ # config.mapping['hu-HU'] = 'Hungarian (Hungary)'
189
+ # config.mapping['hy'] = 'Armenian'
190
+ # config.mapping['ia'] = 'Interlingua'
191
+ # config.mapping['id'] = 'Indonesian'
192
+ # config.mapping['id-ID'] = 'Indonesian (Indonesia)'
193
+ # config.mapping['ig'] = 'Igbo'
194
+ # config.mapping['ig-NG'] = 'Igbo (Nigeria)'
195
+ # config.mapping['ii'] = 'Sichuan Yi'
196
+ # config.mapping['ii-CN'] = 'Sichuan Yi (China)'
197
+ # config.mapping['in'] = 'Indonesian'
198
+ # config.mapping['is'] = 'Icelandic'
199
+ # config.mapping['is-IS'] = 'Icelandic (Iceland)'
200
+ # config.mapping['it'] = 'Italian'
201
+ # config.mapping['it-CH'] = 'Italian (Switzerland)'
202
+ # config.mapping['it-IT'] = 'Italian (Italy)'
203
+ # config.mapping['iu'] = 'Inuktitut'
204
+ # config.mapping['iw'] = 'Hebrew'
205
+ # config.mapping['ja'] = 'Japanese'
206
+ # config.mapping['ja-JP'] = 'Japanese (Japan)'
207
+ # config.mapping['ka'] = 'Georgian'
208
+ # config.mapping['ka-GE'] = 'Georgian (Georgia)'
209
+ # config.mapping['kaj'] = 'Jju'
210
+ # config.mapping['kaj-NG'] = 'Jju (Nigeria)'
211
+ # config.mapping['kam'] = 'Kamba'
212
+ # config.mapping['kam-KE'] = 'Kamba (Kenya)'
213
+ # config.mapping['kcg'] = 'Tyap'
214
+ # config.mapping['kcg-NG'] = 'Tyap (Nigeria)'
215
+ # config.mapping['kfo'] = 'Koro'
216
+ # config.mapping['kfo-CI'] = 'Koro (Ivory Coast)'
217
+ # config.mapping['kk'] = 'Kazakh'
218
+ # config.mapping['kk-KZ'] = 'Kazakh (Kazakhstan)'
219
+ # config.mapping['kl'] = 'Kalaallisut'
220
+ # config.mapping['kl-GL'] = 'Kalaallisut (Greenland)'
221
+ # config.mapping['km'] = 'Khmer'
222
+ # config.mapping['km-KH'] = 'Khmer (Cambodia)'
223
+ # config.mapping['kn'] = 'Kannada'
224
+ # config.mapping['kn-IN'] = 'Kannada (India)'
225
+ # config.mapping['ko'] = 'Korean'
226
+ # config.mapping['ko-KR'] = 'Korean (South Korea)'
227
+ # config.mapping['kok'] = 'Konkani'
228
+ # config.mapping['kok-IN'] = 'Konkani (India)'
229
+ # config.mapping['kpe'] = 'Kpelle'
230
+ # config.mapping['kpe-GN'] = 'Kpelle (Guinea)'
231
+ # config.mapping['kpe-LR'] = 'Kpelle (Liberia)'
232
+ # config.mapping['ku'] = 'Kurdish'
233
+ # config.mapping['ku-IQ'] = 'Kurdish (Iraq)'
234
+ # config.mapping['Iran'] = 'Kurdish (Iran)'
235
+ # config.mapping['Syria'] = 'Kurdish (Syria)'
236
+ # config.mapping['Turkey'] = 'Kurdish (Turkey)'
237
+ # config.mapping['kw'] = 'Cornish'
238
+ # config.mapping['kw-GB'] = 'Cornish (United Kingdom)'
239
+ # config.mapping['ky'] = 'Kirghiz'
240
+ # config.mapping['ky-KG'] = 'Kirghiz (Kyrgyzstan)'
241
+ # config.mapping['ln'] = 'Lingala'
242
+ # config.mapping['ln-CD'] = 'Lingala (Congo - Kinshasa)'
243
+ # config.mapping['ln-CG'] = 'Lingala (Congo - Brazzaville)'
244
+ # config.mapping['lo'] = 'Lao'
245
+ # config.mapping['lo-LA'] = 'Lao (Laos)'
246
+ # config.mapping['lt'] = 'Lithuanian'
247
+ # config.mapping['lt-LT'] = 'Lithuanian (Lithuania)'
248
+ # config.mapping['lv'] = 'Latvian'
249
+ # config.mapping['lv-LV'] = 'Latvian (Latvia)'
250
+ # config.mapping['mk'] = 'Macedonian'
251
+ # config.mapping['mk-MK'] = 'Macedonian (Macedonia)'
252
+ # config.mapping['ml'] = 'Malayalam'
253
+ # config.mapping['ml-IN'] = 'Malayalam (India)'
254
+ # config.mapping['mn'] = 'Mongolian'
255
+ # config.mapping['mn-CN'] = 'Mongolian (China)'
256
+ # config.mapping['mn-MN'] = 'Mongolian (Mongolia)'
257
+ # config.mapping['mo'] = 'Romanian'
258
+ # config.mapping['mr'] = 'Marathi'
259
+ # config.mapping['mr-IN'] = 'Marathi (India)'
260
+ # config.mapping['ms'] = 'Malay'
261
+ # config.mapping['ms-BN'] = 'Malay (Brunei)'
262
+ # config.mapping['ms-MY'] = 'Malay (Malaysia)'
263
+ # config.mapping['mt'] = 'Maltese'
264
+ # config.mapping['mt-MT'] = 'Maltese (Malta)'
265
+ # config.mapping['my'] = 'Burmese'
266
+ # config.mapping['my-MM'] = 'Burmese (Myanmar)'
267
+ # config.mapping['nb'] = 'Norwegian Bokmal'
268
+ # config.mapping['nb-NO'] = 'Norwegian Bokmal (Norway)'
269
+ # config.mapping['nds'] = 'Low German'
270
+ # config.mapping['nds-DE'] = 'Low German (Germany)'
271
+ # config.mapping['ne'] = 'Nepali'
272
+ # config.mapping['ne-IN'] = 'Nepali (India)'
273
+ # config.mapping['ne-NP'] = 'Nepali (Nepal)'
274
+ # config.mapping['nl'] = 'Dutch'
275
+ # config.mapping['nl-BE'] = 'Dutch (Belgium)'
276
+ # config.mapping['nl-NL'] = 'Dutch (Netherlands)'
277
+ # config.mapping['nn'] = 'Norwegian Nynorsk'
278
+ # config.mapping['nn-NO'] = 'Norwegian Nynorsk (Norway)'
279
+ # config.mapping['no'] = 'Norwegian'
280
+ # config.mapping['nr'] = 'South Ndebele'
281
+ # config.mapping['nr-ZA'] = 'South Ndebele (South Africa)'
282
+ # config.mapping['nso'] = 'Northern Sotho'
283
+ # config.mapping['nso-ZA'] = 'Northern Sotho (South Africa)'
284
+ # config.mapping['ny'] = 'Nyanja'
285
+ # config.mapping['ny-MW'] = 'Nyanja (Malawi)'
286
+ # config.mapping['oc'] = 'Occitan'
287
+ # config.mapping['oc-FR'] = 'Occitan (France)'
288
+ # config.mapping['om'] = 'Oromo'
289
+ # config.mapping['om-ET'] = 'Oromo (Ethiopia)'
290
+ # config.mapping['om-KE'] = 'Oromo (Kenya)'
291
+ # config.mapping['or'] = 'Oriya'
292
+ # config.mapping['or-IN'] = 'Oriya (India)'
293
+ # config.mapping['pa'] = 'Punjabi'
294
+ # config.mapping['pa-IN'] = 'Punjabi (India)'
295
+ # config.mapping['pa-PK'] = 'Punjabi (Pakistan)'
296
+ # config.mapping['pl'] = 'Polish'
297
+ # config.mapping['pl-PL'] = 'Polish (Poland)'
298
+ # config.mapping['ps'] = 'Polish'
299
+ # config.mapping['ps-AF'] = 'Polish (Afghanistan)'
300
+ # config.mapping['pt'] = 'Portuguese'
301
+ # config.mapping['pt-BR'] = 'Portuguese (Brazil)'
302
+ # config.mapping['pt-PT'] = 'Portuguese (Portugal)'
303
+ # config.mapping['ro'] = 'Romanian'
304
+ # config.mapping['ro-MD'] = 'Romanian (Moldova)'
305
+ # config.mapping['ro-RO'] = 'Romanian (Romania)'
306
+ # config.mapping['ru'] = 'Russian'
307
+ # config.mapping['ru-RU'] = 'Russian (Russia)'
308
+ # config.mapping['ru-UA'] = 'Russian (Ukraine)'
309
+ # config.mapping['rw'] = 'Kinyarwanda'
310
+ # config.mapping['rw-RW'] = 'Kinyarwanda (Rwanda)'
311
+ # config.mapping['sa'] = 'Sanskrit'
312
+ # config.mapping['sa-IN'] = 'Sanskrit (India)'
313
+ # config.mapping['se'] = 'Northern Sami'
314
+ # config.mapping['se-FI'] = 'Northern Sami (Finland)'
315
+ # config.mapping['se-NO'] = 'Northern Sami (Norway)'
316
+ # config.mapping['sh'] = 'Serbo-Croatian'
317
+ # config.mapping['sh-BA'] = 'Serbo-Croatian (Bosnia and Herzegovina)'
318
+ # config.mapping['sh-CS'] = 'Serbo-Croatian (Serbia and Montenegro)'
319
+ # config.mapping['sh-YU'] = 'Serbo-Croatian (Serbia)'
320
+ # config.mapping['si'] = 'Sinhala'
321
+ # config.mapping['si-LK'] = 'Sinhala (Sri Lanka)'
322
+ # config.mapping['sid'] = 'Sidamo'
323
+ # config.mapping['sid-ET'] = 'Sidamo (Ethiopia)'
324
+ # config.mapping['sk'] = 'Slovak'
325
+ # config.mapping['sk-SK'] = 'Slovak (Slovakia)'
326
+ # config.mapping['sl'] = 'Slovenian'
327
+ # config.mapping['sl-SI'] = 'Slovenian (Slovenia)'
328
+ # config.mapping['so'] = 'Slovenian'
329
+ # config.mapping['so-DJ'] = 'Slovenian (Djibouti)'
330
+ # config.mapping['so-ET'] = 'Slovenian (Ethiopia)'
331
+ # config.mapping['so-KE'] = 'Slovenian (Kenya)'
332
+ # config.mapping['so-SO'] = 'Slovenian (Somalia)'
333
+ # config.mapping['sq'] = 'Albanian'
334
+ # config.mapping['sq-AL'] = 'Albanian (Albania)'
335
+ # config.mapping['sr'] = 'Serbian'
336
+ # config.mapping['sr-BA'] = 'Serbian (Bosnia and Herzegovina)'
337
+ # config.mapping['sr-CS'] = 'Serbian (Serbia and Montenegro)'
338
+ # config.mapping['sr-ME'] = 'Serbian (Montenegro)'
339
+ # config.mapping['sr-RS'] = 'Serbian (Serbia)'
340
+ # config.mapping['sr-YU'] = 'Serbian (Serbia)'
341
+ # config.mapping['ss'] = 'Swati'
342
+ # config.mapping['ss-SZ'] = 'Swati (Swaziland)'
343
+ # config.mapping['ss-ZA'] = 'Swati (South Africa)'
344
+ # config.mapping['st'] = 'Southern Sotho'
345
+ # config.mapping['st-LS'] = 'Southern Sotho (Lesotho)'
346
+ # config.mapping['st-ZA'] = 'Southern Sotho (South Africa)'
347
+ # config.mapping['sv'] = 'Swedish'
348
+ # config.mapping['sv-FI'] = 'Swedish (Finland)'
349
+ # config.mapping['sv-SE'] = 'Swedish (Sweden)'
350
+ # config.mapping['sw'] = 'Swahili'
351
+ # config.mapping['sw-KE'] = 'Swahili (Kenya)'
352
+ # config.mapping['sw-TZ'] = 'Swahili (Tanzania)'
353
+ # config.mapping['syr'] = 'Syriac'
354
+ # config.mapping['syr-SY'] = 'Syriac (Syria)'
355
+ # config.mapping['ta'] = 'Tamil'
356
+ # config.mapping['ta-IN'] = 'Tamil (India)'
357
+ # config.mapping['te'] = 'Telugu'
358
+ # config.mapping['te-IN'] = 'Telugu (India)'
359
+ # config.mapping['tg'] = 'Tajik'
360
+ # config.mapping['tg-TJ'] = 'Tajik (Tajikistan)'
361
+ # config.mapping['th'] = 'Thai'
362
+ # config.mapping['th-TH'] = 'Thai (Thailand)'
363
+ # config.mapping['ti'] = 'Tigrinya'
364
+ # config.mapping['ti-ER'] = 'Tigrinya (Eritrea)'
365
+ # config.mapping['ti-ET'] = 'Tigrinya (Ethiopia)'
366
+ # config.mapping['tig'] = 'Tigre'
367
+ # config.mapping['tig-ER'] = 'Tigre (Eritrea)'
368
+ # config.mapping['tl'] = 'Tagalog'
369
+ # config.mapping['tn'] = 'Tswana'
370
+ # config.mapping['tn-ZA'] = 'Tswana (South Africa)'
371
+ # config.mapping['to'] = 'Tonga'
372
+ # config.mapping['to-TO'] = 'Tonga (Tonga)'
373
+ # config.mapping['tr'] = 'Turkish'
374
+ # config.mapping['tr-TR'] = 'Turkish (Turkey)'
375
+ # config.mapping['trv'] = 'Taroko'
376
+ # config.mapping['trv-TW'] = 'Taroko (Taiwan)'
377
+ # config.mapping['ts'] = 'Tsonga'
378
+ # config.mapping['ts-ZA'] = 'Tsonga (South Africa)'
379
+ # config.mapping['tt'] = 'Tatar'
380
+ # config.mapping['tt-RU'] = 'Tatar (Russia)'
381
+ # config.mapping['ug'] = 'Uighur'
382
+ # config.mapping['ug-CN'] = 'Uighur (China)'
383
+ # config.mapping['uk'] = 'Ukrainian'
384
+ # config.mapping['uk-UA'] = 'Ukrainian (Ukraine)'
385
+ # config.mapping['ur'] = 'Urdu'
386
+ # config.mapping['ur-IN'] = 'Urdu (India)'
387
+ # config.mapping['ur-PK'] = 'Urdu (Pakistan)'
388
+ # config.mapping['uz'] = 'Uzbek'
389
+ # config.mapping['uz-AF'] = 'Uzbek (Afghanistan)'
390
+ # config.mapping['uz-UZ'] = 'Uzbek (Uzbekistan)'
391
+ # config.mapping['ve'] = 'Venda'
392
+ # config.mapping['ve-ZA'] = 'Venda (South Africa)'
393
+ # config.mapping['vi'] = 'Vietnamese'
394
+ # config.mapping['vi-VN'] = 'Vietnamese (Vietnam)'
395
+ # config.mapping['wal'] = 'Walamo'
396
+ # config.mapping['wal-ET'] = 'Walamo (Ethiopia)'
397
+ # config.mapping['wo'] = 'Wolof'
398
+ # config.mapping['wo-SN'] = 'Wolof (Senegal)'
399
+ # config.mapping['xh'] = 'Xhosa'
400
+ # config.mapping['xh-ZA'] = 'Xhosa (South Africa)'
401
+ # config.mapping['yo'] = 'Yoruba'
402
+ # config.mapping['yo-NG'] = 'Yoruba (Nigeria)'
403
+ # config.mapping['zh'] = 'Chinese'
404
+ # config.mapping['zh-CN'] = 'Chinese (Simplified)'
405
+ # config.mapping['zh-HK'] = 'Chinese (Hong Kong)'
406
+ # config.mapping['zh-MO'] = 'Chinese (Macau)'
407
+ # config.mapping['zh-SG'] = 'Chinese (Singapore)'
408
+ # config.mapping['zh-TW'] = 'Chinese (Traditional)'
409
+ # config.mapping['zu'] = 'Zulu'
410
+ # config.mapping['zu-ZA'] = 'Zulu (South Africa)
411
+
412
+ end