tr8n 3.0.2
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.
- data/.project +18 -0
- data/Gemfile +34 -0
- data/Gemfile.lock +79 -0
- data/LICENSE +18 -0
- data/README.rdoc +116 -0
- data/Rakefile +29 -0
- data/VERSION +1 -0
- data/app/controllers/application_controller.rb +28 -0
- data/app/controllers/tr8n/admin/base_controller.rb +65 -0
- data/app/controllers/tr8n/admin/clientsdk_controller.rb +34 -0
- data/app/controllers/tr8n/admin/domain_controller.rb +77 -0
- data/app/controllers/tr8n/admin/forum_controller.rb +58 -0
- data/app/controllers/tr8n/admin/glossary_controller.rb +56 -0
- data/app/controllers/tr8n/admin/language_controller.rb +129 -0
- data/app/controllers/tr8n/admin/translation_controller.rb +64 -0
- data/app/controllers/tr8n/admin/translation_key_controller.rb +157 -0
- data/app/controllers/tr8n/admin/translator_controller.rb +119 -0
- data/app/controllers/tr8n/api/v1/base_controller.rb +81 -0
- data/app/controllers/tr8n/api/v1/language_controller.rb +107 -0
- data/app/controllers/tr8n/api/v1/translation_controller.rb +75 -0
- data/app/controllers/tr8n/api/v1/translator_controller.rb +34 -0
- data/app/controllers/tr8n/awards_controller.rb +43 -0
- data/app/controllers/tr8n/base_controller.rb +206 -0
- data/app/controllers/tr8n/dashboard_controller.rb +32 -0
- data/app/controllers/tr8n/forum_controller.rb +100 -0
- data/app/controllers/tr8n/glossary_controller.rb +40 -0
- data/app/controllers/tr8n/help_controller.rb +40 -0
- data/app/controllers/tr8n/home_controller.rb +51 -0
- data/app/controllers/tr8n/language_cases_controller.rb +82 -0
- data/app/controllers/tr8n/language_controller.rb +372 -0
- data/app/controllers/tr8n/login_controller.rb +86 -0
- data/app/controllers/tr8n/phrases_controller.rb +293 -0
- data/app/controllers/tr8n/translations_controller.rb +194 -0
- data/app/controllers/tr8n/translator_controller.rb +83 -0
- data/app/helpers/application_helper.rb +27 -0
- data/app/helpers/tr8n/admin/base_helper.rb +84 -0
- data/app/helpers/tr8n/base_helper.rb +44 -0
- data/app/helpers/tr8n/dashboard_helper.rb +43 -0
- data/app/models/tr8n/base_filter.rb +68 -0
- data/app/models/tr8n/daily_language_metric.rb +42 -0
- data/app/models/tr8n/date_rule.rb +123 -0
- data/app/models/tr8n/gender_list_rule.rb +247 -0
- data/app/models/tr8n/gender_rule.rb +140 -0
- data/app/models/tr8n/glossary.rb +27 -0
- data/app/models/tr8n/glossary_filter.rb +33 -0
- data/app/models/tr8n/integration/ru/russian_gender_list_rule.rb +60 -0
- data/app/models/tr8n/integration/ru/russian_numeric_rule.rb +64 -0
- data/app/models/tr8n/ip_location.rb +74 -0
- data/app/models/tr8n/ip_location_filter.rb +34 -0
- data/app/models/tr8n/language.rb +318 -0
- data/app/models/tr8n/language_case.rb +141 -0
- data/app/models/tr8n/language_case_filter.rb +30 -0
- data/app/models/tr8n/language_case_rule.rb +187 -0
- data/app/models/tr8n/language_case_rule_filter.rb +30 -0
- data/app/models/tr8n/language_case_value_map.rb +100 -0
- data/app/models/tr8n/language_case_value_map_filter.rb +41 -0
- data/app/models/tr8n/language_filter.rb +75 -0
- data/app/models/tr8n/language_forum_abuse_report.rb +33 -0
- data/app/models/tr8n/language_forum_abuse_report_filter.rb +30 -0
- data/app/models/tr8n/language_forum_message.rb +46 -0
- data/app/models/tr8n/language_forum_message_filter.rb +34 -0
- data/app/models/tr8n/language_forum_topic.rb +41 -0
- data/app/models/tr8n/language_forum_topic_filter.rb +34 -0
- data/app/models/tr8n/language_metric.rb +91 -0
- data/app/models/tr8n/language_metric_filter.rb +63 -0
- data/app/models/tr8n/language_rule.rb +117 -0
- data/app/models/tr8n/language_rule_filter.rb +45 -0
- data/app/models/tr8n/language_user.rb +61 -0
- data/app/models/tr8n/language_user_filter.rb +34 -0
- data/app/models/tr8n/list_rule.rb +118 -0
- data/app/models/tr8n/monthly_language_metric.rb +34 -0
- data/app/models/tr8n/numeric_rule.rb +175 -0
- data/app/models/tr8n/total_language_metric.rb +59 -0
- data/app/models/tr8n/translation.rb +299 -0
- data/app/models/tr8n/translation_domain.rb +48 -0
- data/app/models/tr8n/translation_domain_filter.rb +26 -0
- data/app/models/tr8n/translation_filter.rb +34 -0
- data/app/models/tr8n/translation_key.rb +625 -0
- data/app/models/tr8n/translation_key_comment.rb +37 -0
- data/app/models/tr8n/translation_key_comment_filter.rb +30 -0
- data/app/models/tr8n/translation_key_filter.rb +45 -0
- data/app/models/tr8n/translation_key_lock.rb +59 -0
- data/app/models/tr8n/translation_key_lock_filter.rb +30 -0
- data/app/models/tr8n/translation_key_source.rb +58 -0
- data/app/models/tr8n/translation_key_source_filter.rb +30 -0
- data/app/models/tr8n/translation_source.rb +52 -0
- data/app/models/tr8n/translation_source_filter.rb +30 -0
- data/app/models/tr8n/translation_vote.rb +36 -0
- data/app/models/tr8n/translation_vote_filter.rb +34 -0
- data/app/models/tr8n/translator.rb +301 -0
- data/app/models/tr8n/translator_filter.rb +46 -0
- data/app/models/tr8n/translator_following.rb +38 -0
- data/app/models/tr8n/translator_following_filter.rb +34 -0
- data/app/models/tr8n/translator_log.rb +120 -0
- data/app/models/tr8n/translator_log_filter.rb +49 -0
- data/app/models/tr8n/translator_metric.rb +83 -0
- data/app/models/tr8n/translator_metric_filter.rb +38 -0
- data/app/models/tr8n/translator_report.rb +82 -0
- data/app/models/tr8n/translator_report_filter.rb +30 -0
- data/app/models/tr8n/value_rule.rb +117 -0
- data/app/views/layouts/_footer.html.erb +15 -0
- data/app/views/layouts/_header.html.erb +12 -0
- data/app/views/layouts/_html_head.html.erb +5 -0
- data/app/views/layouts/tr8n.html.erb +21 -0
- data/app/views/layouts/tr8n_admin.html.erb +33 -0
- data/app/views/tr8n/admin/clientsdk/index.html.erb +133 -0
- data/app/views/tr8n/admin/clientsdk/lb_samples.html.erb +54 -0
- data/app/views/tr8n/admin/common/_footer.html.erb +1 -0
- data/app/views/tr8n/admin/common/_header.html.erb +30 -0
- data/app/views/tr8n/admin/common/_lightbox_buttons.html.erb +5 -0
- data/app/views/tr8n/admin/common/_paginator.html.erb +20 -0
- data/app/views/tr8n/admin/domain/_tabs.html.erb +23 -0
- data/app/views/tr8n/admin/domain/index.html.erb +33 -0
- data/app/views/tr8n/admin/domain/key_sources.rhtml +53 -0
- data/app/views/tr8n/admin/domain/lb_caller.html.erb +35 -0
- data/app/views/tr8n/admin/domain/sources.html.erb +35 -0
- data/app/views/tr8n/admin/forum/_tabs.html.erb +22 -0
- data/app/views/tr8n/admin/forum/index.html.erb +34 -0
- data/app/views/tr8n/admin/forum/messages.html.erb +33 -0
- data/app/views/tr8n/admin/forum/reports.html.erb +50 -0
- data/app/views/tr8n/admin/glossary/index.html.erb +22 -0
- data/app/views/tr8n/admin/glossary/lb_update.html.erb +26 -0
- data/app/views/tr8n/admin/language/_rules.html.erb +22 -0
- data/app/views/tr8n/admin/language/_tabs.html.erb +27 -0
- data/app/views/tr8n/admin/language/_users.html.erb +40 -0
- data/app/views/tr8n/admin/language/case_rules.html.erb +24 -0
- data/app/views/tr8n/admin/language/case_values.html.erb +25 -0
- data/app/views/tr8n/admin/language/cases.html.erb +24 -0
- data/app/views/tr8n/admin/language/charts.html.erb +35 -0
- data/app/views/tr8n/admin/language/index.html.erb +99 -0
- data/app/views/tr8n/admin/language/lb_update.html.erb +76 -0
- data/app/views/tr8n/admin/language/lb_value_map.html.erb +42 -0
- data/app/views/tr8n/admin/language/metrics.rhtml +16 -0
- data/app/views/tr8n/admin/language/rules.html.erb +24 -0
- data/app/views/tr8n/admin/language/users.rhtml +31 -0
- data/app/views/tr8n/admin/language/view.html.erb +106 -0
- data/app/views/tr8n/admin/translation/_tabs.html.erb +21 -0
- data/app/views/tr8n/admin/translation/index.html.erb +75 -0
- data/app/views/tr8n/admin/translation/view.html.erb +142 -0
- data/app/views/tr8n/admin/translation/votes.rhtml +81 -0
- data/app/views/tr8n/admin/translation_key/_tabs.html.erb +22 -0
- data/app/views/tr8n/admin/translation_key/comments.html.erb +49 -0
- data/app/views/tr8n/admin/translation_key/index.html.erb +79 -0
- data/app/views/tr8n/admin/translation_key/lb_merge.html.erb +43 -0
- data/app/views/tr8n/admin/translation_key/lb_update.html.erb +44 -0
- data/app/views/tr8n/admin/translation_key/locks.html.erb +51 -0
- data/app/views/tr8n/admin/translation_key/view.html.erb +192 -0
- data/app/views/tr8n/admin/translator/_list.html.erb +51 -0
- data/app/views/tr8n/admin/translator/_tabs.html.erb +26 -0
- data/app/views/tr8n/admin/translator/following.html.erb +20 -0
- data/app/views/tr8n/admin/translator/index.html.erb +77 -0
- data/app/views/tr8n/admin/translator/ip_locations.html.erb +9 -0
- data/app/views/tr8n/admin/translator/lb_register.html.erb +18 -0
- data/app/views/tr8n/admin/translator/log.html.erb +27 -0
- data/app/views/tr8n/admin/translator/metrics.html.erb +25 -0
- data/app/views/tr8n/admin/translator/reports.html.erb +22 -0
- data/app/views/tr8n/admin/translator/view.html.erb +228 -0
- data/app/views/tr8n/awards/_list.html.erb +46 -0
- data/app/views/tr8n/awards/index.html.erb +42 -0
- data/app/views/tr8n/common/_flashes.html.erb +39 -0
- data/app/views/tr8n/common/_footer.html.erb +1 -0
- data/app/views/tr8n/common/_header.html.erb +5 -0
- data/app/views/tr8n/common/_language_selector.html.erb +8 -0
- data/app/views/tr8n/common/_language_strip.html.erb +29 -0
- data/app/views/tr8n/common/_language_table.html.erb +13 -0
- data/app/views/tr8n/common/_paginator.html.erb +8 -0
- data/app/views/tr8n/common/_permutations.html.erb +37 -0
- data/app/views/tr8n/common/_scripts.html.erb +49 -0
- data/app/views/tr8n/common/_splash_screen.html.erb +9 -0
- data/app/views/tr8n/common/_splash_screen_legacy.html.erb +4 -0
- data/app/views/tr8n/common/_tabs.html.erb +39 -0
- data/app/views/tr8n/common/_translation_votes.html.erb +41 -0
- data/app/views/tr8n/common/_translator_login.html.erb +11 -0
- data/app/views/tr8n/dashboard/_forum.html.erb +25 -0
- data/app/views/tr8n/dashboard/_language_metric.html.erb +49 -0
- data/app/views/tr8n/dashboard/_statistics.html.erb +35 -0
- data/app/views/tr8n/dashboard/_translations.html.erb +24 -0
- data/app/views/tr8n/dashboard/_translator_metric.html.erb +68 -0
- data/app/views/tr8n/dashboard/_votes.html.erb +76 -0
- data/app/views/tr8n/dashboard/index.rhtml +115 -0
- data/app/views/tr8n/forum/_message.html.erb +17 -0
- data/app/views/tr8n/forum/_messages.html.erb +21 -0
- data/app/views/tr8n/forum/_new_message.html.erb +28 -0
- data/app/views/tr8n/forum/_new_topic.html.erb +49 -0
- data/app/views/tr8n/forum/index.html.erb +84 -0
- data/app/views/tr8n/forum/topic.html.erb +36 -0
- data/app/views/tr8n/glossary/index.html.erb +42 -0
- data/app/views/tr8n/help/_navigation.html.erb +127 -0
- data/app/views/tr8n/help/awards.html.erb +13 -0
- data/app/views/tr8n/help/basic_information.html.erb +13 -0
- data/app/views/tr8n/help/context_rules.html.erb +13 -0
- data/app/views/tr8n/help/creating_translations.html.erb +16 -0
- data/app/views/tr8n/help/dashboard.html.erb +13 -0
- data/app/views/tr8n/help/direction.html.erb +13 -0
- data/app/views/tr8n/help/discussions.html.erb +13 -0
- data/app/views/tr8n/help/enter_translation.html.erb +13 -0
- data/app/views/tr8n/help/fallback_language.html.erb +13 -0
- data/app/views/tr8n/help/generate_context_rules.html.erb +17 -0
- data/app/views/tr8n/help/index.html.erb +18 -0
- data/app/views/tr8n/help/inline_translations.html.erb +28 -0
- data/app/views/tr8n/help/language_dashboard.html.erb +21 -0
- data/app/views/tr8n/help/language_phrases.html.erb +17 -0
- data/app/views/tr8n/help/language_selector.html.erb +13 -0
- data/app/views/tr8n/help/language_statistics.html.erb +13 -0
- data/app/views/tr8n/help/lb_credits.html.erb +9 -0
- data/app/views/tr8n/help/lb_shortcuts.html.erb +26 -0
- data/app/views/tr8n/help/manage.html.erb +13 -0
- data/app/views/tr8n/help/manage_language.html.erb +13 -0
- data/app/views/tr8n/help/native_name.html.erb +13 -0
- data/app/views/tr8n/help/original_phrase.html.erb +13 -0
- data/app/views/tr8n/help/other_languages.html.erb +15 -0
- data/app/views/tr8n/help/other_translatable_resources.html.erb +13 -0
- data/app/views/tr8n/help/phrases.html.erb +19 -0
- data/app/views/tr8n/help/phrases_with_translations.html.erb +21 -0
- data/app/views/tr8n/help/phrases_without_translations.html.erb +15 -0
- data/app/views/tr8n/help/prohibited_words.html.erb +13 -0
- data/app/views/tr8n/help/rank.html.erb +13 -0
- data/app/views/tr8n/help/recent_discussions.html.erb +13 -0
- data/app/views/tr8n/help/recent_translation_votes.html.erb +13 -0
- data/app/views/tr8n/help/recent_translations.html.erb +13 -0
- data/app/views/tr8n/help/site_map.html.erb +17 -0
- data/app/views/tr8n/help/site_sections.html.erb +13 -0
- data/app/views/tr8n/help/suggested_translation.html.erb +13 -0
- data/app/views/tr8n/help/translating_inline.html.erb +30 -0
- data/app/views/tr8n/help/translation_context_rules.html.erb +16 -0
- data/app/views/tr8n/help/translation_rank.html.erb +17 -0
- data/app/views/tr8n/help/translation_tokens.html.erb +13 -0
- data/app/views/tr8n/help/translation_tools.html.erb +13 -0
- data/app/views/tr8n/help/translations.html.erb +13 -0
- data/app/views/tr8n/help/user_rank.html.erb +13 -0
- data/app/views/tr8n/help/using_translation_tools.html.erb +13 -0
- data/app/views/tr8n/help/voting_on_translations.html.erb +13 -0
- data/app/views/tr8n/help/your_dashboard.html.erb +17 -0
- data/app/views/tr8n/help/your_languages.html.erb +19 -0
- data/app/views/tr8n/help/your_translations.html.erb +17 -0
- data/app/views/tr8n/home/credits.html.erb +102 -0
- data/app/views/tr8n/home/docs.html.erb +3 -0
- data/app/views/tr8n/home/index.html.erb +37 -0
- data/app/views/tr8n/home/integration.html.erb +564 -0
- data/app/views/tr8n/home/languages.html.erb +7 -0
- data/app/views/tr8n/home/license.html.erb +586 -0
- data/app/views/tr8n/home/rules.html.erb +668 -0
- data/app/views/tr8n/home/tokens.html.erb +324 -0
- data/app/views/tr8n/language/_basic_info.html.erb +53 -0
- data/app/views/tr8n/language/_edit_language_case_rules.html.erb +51 -0
- data/app/views/tr8n/language/_edit_language_cases.html.erb +68 -0
- data/app/views/tr8n/language/_edit_rules.html.erb +46 -0
- data/app/views/tr8n/language/_grammar.html.erb +84 -0
- data/app/views/tr8n/language/_header.html.erb +14 -0
- data/app/views/tr8n/language/_language_cases.html.erb +196 -0
- data/app/views/tr8n/language/_lists.html.erb +56 -0
- data/app/views/tr8n/language/_prohibited_words.html.erb +16 -0
- data/app/views/tr8n/language/_translator_dependencies.html.erb +27 -0
- data/app/views/tr8n/language/_translator_header.html.erb +19 -0
- data/app/views/tr8n/language/_translator_submit.html.erb +141 -0
- data/app/views/tr8n/language/_translator_votes.html.erb +27 -0
- data/app/views/tr8n/language/index.html.erb +54 -0
- data/app/views/tr8n/language/lb_language_case_rule.html.erb +94 -0
- data/app/views/tr8n/language/rules/_date_rule.html.erb +3 -0
- data/app/views/tr8n/language/rules/_gender_list_rule.html.erb +23 -0
- data/app/views/tr8n/language/rules/_gender_rule.html.erb +3 -0
- data/app/views/tr8n/language/rules/_list_rule.html.erb +3 -0
- data/app/views/tr8n/language/rules/_number_rule.html.erb +24 -0
- data/app/views/tr8n/language/rules/_value_rule.html.erb +3 -0
- data/app/views/tr8n/language/select.html.erb +72 -0
- data/app/views/tr8n/language/table.html.erb +32 -0
- data/app/views/tr8n/language/translator.html.erb +18 -0
- data/app/views/tr8n/language_cases/_gender_based.html.erb +32 -0
- data/app/views/tr8n/language_cases/_gender_neutral.html.erb +25 -0
- data/app/views/tr8n/language_cases/_manager_header.html.erb +18 -0
- data/app/views/tr8n/language_cases/index.html.erb +54 -0
- data/app/views/tr8n/language_cases/manager.html.erb +60 -0
- data/app/views/tr8n/login/index.html.erb +33 -0
- data/app/views/tr8n/login/register.html.erb +57 -0
- data/app/views/tr8n/phrases/_breadcrumb.html.erb +11 -0
- data/app/views/tr8n/phrases/_comment.html.erb +17 -0
- data/app/views/tr8n/phrases/_comments_module.html.erb +37 -0
- data/app/views/tr8n/phrases/_dictionary.rhtml +29 -0
- data/app/views/tr8n/phrases/_header.html.erb +24 -0
- data/app/views/tr8n/phrases/_new_comment.html.erb +31 -0
- data/app/views/tr8n/phrases/_permutations_module.html.erb +30 -0
- data/app/views/tr8n/phrases/_tokens.html.erb +122 -0
- data/app/views/tr8n/phrases/_toolbar.html.erb +33 -0
- data/app/views/tr8n/phrases/_translation_module.html.erb +127 -0
- data/app/views/tr8n/phrases/_translations_module.html.erb +70 -0
- data/app/views/tr8n/phrases/index.html.erb +90 -0
- data/app/views/tr8n/phrases/lb_sources.html.erb +51 -0
- data/app/views/tr8n/phrases/map.html.erb +42 -0
- data/app/views/tr8n/phrases/view.html.erb +77 -0
- data/app/views/tr8n/translations/_list.html.erb +71 -0
- data/app/views/tr8n/translations/_original_phrase.html.erb +11 -0
- data/app/views/tr8n/translations/_translation.html.erb +80 -0
- data/app/views/tr8n/translations/index.html.erb +30 -0
- data/app/views/tr8n/translator/_basic_info.html.erb +95 -0
- data/app/views/tr8n/translator/_header.html.erb +12 -0
- data/app/views/tr8n/translator/_header_key_report.html.erb +12 -0
- data/app/views/tr8n/translator/index.html.erb +25 -0
- data/app/views/tr8n/translator/lb_report.html.erb +113 -0
- data/config.ru +4 -0
- data/config/application.rb +65 -0
- data/config/boot.rb +6 -0
- data/config/database.yml +13 -0
- data/config/environment.rb +46 -0
- data/config/environments/development.rb +25 -0
- data/config/environments/test.rb +35 -0
- data/config/routes.rb +47 -0
- data/config/tr8n/config.yml +247 -0
- data/config/tr8n/data/ip_locations.csv +93460 -0
- data/config/tr8n/rules/default_cases.yml +141 -0
- data/config/tr8n/rules/default_date_rules.yml +20 -0
- data/config/tr8n/rules/default_gender_list_rules.yml +82 -0
- data/config/tr8n/rules/default_gender_rules.yml +20 -0
- data/config/tr8n/rules/default_list_rules.yml +19 -0
- data/config/tr8n/rules/default_numeric_rules.yml +42 -0
- data/config/tr8n/rules/default_value_rules.yml +18 -0
- data/config/tr8n/site/default_glossary.yml +18 -0
- data/config/tr8n/site/default_languages.yml +1591 -0
- data/config/tr8n/site/features.yml +111 -0
- data/config/tr8n/site/shortcuts.yml +55 -0
- data/config/tr8n/site/sitemap.json +42 -0
- data/config/tr8n/tokens/data.yml +19 -0
- data/config/tr8n/tokens/decorations.yml +16 -0
- data/config/will_filter/config.yml +97 -0
- data/db/extras/20100511185330_create_test_users.rb +43 -0
- data/db/migrate/20090730070119_create_will_filter_tables.rb +19 -0
- data/db/migrate/20100405201417_create_tr8n_tables.rb +350 -0
- data/db/seeds.rb +7 -0
- data/doc/README_FOR_APP +2 -0
- data/doc/cheat sheet.docx +0 -0
- data/doc/cheat sheet.pdf +0 -0
- data/doc/classes.graffle +12555 -0
- data/doc/classes.pdf +0 -0
- data/doc/client sdk sequence.graffle +2768 -0
- data/doc/integration.doc +0 -0
- data/doc/integration.docx +0 -0
- data/doc/pixel client sdk.graffle +1454 -0
- data/lib/application_controller.rb +38 -0
- data/lib/application_helper.rb +336 -0
- data/lib/core_ext/array.rb +61 -0
- data/lib/core_ext/date.rb +76 -0
- data/lib/core_ext/fixnum.rb +35 -0
- data/lib/core_ext/hash.rb +60 -0
- data/lib/core_ext/string.rb +49 -0
- data/lib/core_ext/time.rb +83 -0
- data/lib/generators/tr8n/templates/create_tr8n_tables.rb +350 -0
- data/lib/generators/tr8n/tr8n_generator.rb +49 -0
- data/lib/tasks/.gitkeep +0 -0
- data/lib/tasks/tr8n_tasks.rake +99 -0
- data/lib/tr8n.rb +3 -0
- data/lib/tr8n/active_dumper.rb +49 -0
- data/lib/tr8n/cache.rb +57 -0
- data/lib/tr8n/common_methods.rb +61 -0
- data/lib/tr8n/config.rb +719 -0
- data/lib/tr8n/controller_methods.rb +112 -0
- data/lib/tr8n/dictionary.rb +53 -0
- data/lib/tr8n/engine.rb +29 -0
- data/lib/tr8n/exception.rb +26 -0
- data/lib/tr8n/extender.rb +34 -0
- data/lib/tr8n/helper_methods.rb +304 -0
- data/lib/tr8n/ip_address.rb +52 -0
- data/lib/tr8n/key_registration_exception.rb +26 -0
- data/lib/tr8n/keyboard_mapping.rb +174 -0
- data/lib/tr8n/logger.rb +60 -0
- data/lib/tr8n/site_map.rb +85 -0
- data/lib/tr8n/site_map_section.rb +108 -0
- data/lib/tr8n/token.rb +438 -0
- data/lib/tr8n/token_exception.rb +26 -0
- data/lib/tr8n/tokenized_label.rb +141 -0
- data/lib/tr8n/tokens/data_token.rb +52 -0
- data/lib/tr8n/tokens/decoration_token.rb +124 -0
- data/lib/tr8n/tokens/hidden_token.rb +87 -0
- data/lib/tr8n/tokens/method_token.rb +60 -0
- data/lib/tr8n/tokens/transform_token.rb +131 -0
- data/public/404.html +26 -0
- data/public/422.html +26 -0
- data/public/500.html +26 -0
- data/public/favicon.ico +0 -0
- data/public/robots.txt +5 -0
- data/public/tr8n/images/accept.png +0 -0
- data/public/tr8n/images/action_tab_bkgd.gif +0 -0
- data/public/tr8n/images/action_tab_white_bkgd.gif +0 -0
- data/public/tr8n/images/add.png +0 -0
- data/public/tr8n/images/arrow_down.gif +0 -0
- data/public/tr8n/images/arrow_down.png +0 -0
- data/public/tr8n/images/arrow_down_grey.png +0 -0
- data/public/tr8n/images/arrow_right.gif +0 -0
- data/public/tr8n/images/arrow_up.png +0 -0
- data/public/tr8n/images/arrow_up_grey.png +0 -0
- data/public/tr8n/images/bullet_go.png +0 -0
- data/public/tr8n/images/buttons.png +0 -0
- data/public/tr8n/images/cancel.png +0 -0
- data/public/tr8n/images/close.gif +0 -0
- data/public/tr8n/images/cross.png +0 -0
- data/public/tr8n/images/delete.png +0 -0
- data/public/tr8n/images/disk.png +0 -0
- data/public/tr8n/images/examples/context_rules_1.png +0 -0
- data/public/tr8n/images/examples/context_rules_2.png +0 -0
- data/public/tr8n/images/examples/date_rules_1.png +0 -0
- data/public/tr8n/images/examples/date_rules_2.png +0 -0
- data/public/tr8n/images/examples/date_rules_3.png +0 -0
- data/public/tr8n/images/examples/gender_rules_1.png +0 -0
- data/public/tr8n/images/examples/gender_rules_2.png +0 -0
- data/public/tr8n/images/examples/gender_rules_3.png +0 -0
- data/public/tr8n/images/examples/language_manager_1.png +0 -0
- data/public/tr8n/images/examples/list_rules_1.png +0 -0
- data/public/tr8n/images/examples/list_rules_2.png +0 -0
- data/public/tr8n/images/examples/list_rules_3.png +0 -0
- data/public/tr8n/images/examples/numeric_rules_1.png +0 -0
- data/public/tr8n/images/examples/numeric_rules_2.png +0 -0
- data/public/tr8n/images/examples/numeric_rules_3.png +0 -0
- data/public/tr8n/images/examples/numeric_rules_4.png +0 -0
- data/public/tr8n/images/exclamation.png +0 -0
- data/public/tr8n/images/eye.png +0 -0
- data/public/tr8n/images/eye_not.png +0 -0
- data/public/tr8n/images/facebook/connect_light_medium_long.gif +0 -0
- data/public/tr8n/images/field_sprite.gif +0 -0
- data/public/tr8n/images/find.png +0 -0
- data/public/tr8n/images/flags/.DS_Store +0 -0
- data/public/tr8n/images/flags/ab.png +0 -0
- data/public/tr8n/images/flags/ach.png +0 -0
- data/public/tr8n/images/flags/af.png +0 -0
- data/public/tr8n/images/flags/ak.png +0 -0
- data/public/tr8n/images/flags/am.png +0 -0
- data/public/tr8n/images/flags/an.png +0 -0
- data/public/tr8n/images/flags/ar-AE.png +0 -0
- data/public/tr8n/images/flags/ar-BH.png +0 -0
- data/public/tr8n/images/flags/ar-DZ.png +0 -0
- data/public/tr8n/images/flags/ar-EG.png +0 -0
- data/public/tr8n/images/flags/ar-IQ.png +0 -0
- data/public/tr8n/images/flags/ar-JO.png +0 -0
- data/public/tr8n/images/flags/ar-KW.png +0 -0
- data/public/tr8n/images/flags/ar-LB.png +0 -0
- data/public/tr8n/images/flags/ar-LY.png +0 -0
- data/public/tr8n/images/flags/ar-MA.png +0 -0
- data/public/tr8n/images/flags/ar-OM.png +0 -0
- data/public/tr8n/images/flags/ar-QA.png +0 -0
- data/public/tr8n/images/flags/ar-SA.png +0 -0
- data/public/tr8n/images/flags/ar-SY.png +0 -0
- data/public/tr8n/images/flags/ar-TN.png +0 -0
- data/public/tr8n/images/flags/ar-YE.png +0 -0
- data/public/tr8n/images/flags/ar.png +0 -0
- data/public/tr8n/images/flags/as.png +0 -0
- data/public/tr8n/images/flags/ast.png +0 -0
- data/public/tr8n/images/flags/ay.png +0 -0
- data/public/tr8n/images/flags/az.png +0 -0
- data/public/tr8n/images/flags/ba.png +0 -0
- data/public/tr8n/images/flags/be.png +0 -0
- data/public/tr8n/images/flags/bg.png +0 -0
- data/public/tr8n/images/flags/bh.png +0 -0
- data/public/tr8n/images/flags/bn.png +0 -0
- data/public/tr8n/images/flags/bo.png +0 -0
- data/public/tr8n/images/flags/br.png +0 -0
- data/public/tr8n/images/flags/bs.png +0 -0
- data/public/tr8n/images/flags/ca.png +0 -0
- data/public/tr8n/images/flags/cb.png +0 -0
- data/public/tr8n/images/flags/ce.png +0 -0
- data/public/tr8n/images/flags/ch.png +0 -0
- data/public/tr8n/images/flags/ck-US.png +0 -0
- data/public/tr8n/images/flags/co.png +0 -0
- data/public/tr8n/images/flags/cr.png +0 -0
- data/public/tr8n/images/flags/cs.png +0 -0
- data/public/tr8n/images/flags/cv.png +0 -0
- data/public/tr8n/images/flags/cy.png +0 -0
- data/public/tr8n/images/flags/da.png +0 -0
- data/public/tr8n/images/flags/de-AT.png +0 -0
- data/public/tr8n/images/flags/de-CH.png +0 -0
- data/public/tr8n/images/flags/de-DE.png +0 -0
- data/public/tr8n/images/flags/de-LI.png +0 -0
- data/public/tr8n/images/flags/de-LU.png +0 -0
- data/public/tr8n/images/flags/de.png +0 -0
- data/public/tr8n/images/flags/el.png +0 -0
- data/public/tr8n/images/flags/en-AU.png +0 -0
- data/public/tr8n/images/flags/en-BZ.png +0 -0
- data/public/tr8n/images/flags/en-CA.png +0 -0
- data/public/tr8n/images/flags/en-IE.png +0 -0
- data/public/tr8n/images/flags/en-JM.png +0 -0
- data/public/tr8n/images/flags/en-NZ.png +0 -0
- data/public/tr8n/images/flags/en-PH.png +0 -0
- data/public/tr8n/images/flags/en-PI.png +0 -0
- data/public/tr8n/images/flags/en-SC.png +0 -0
- data/public/tr8n/images/flags/en-UK.png +0 -0
- data/public/tr8n/images/flags/en-US.png +0 -0
- data/public/tr8n/images/flags/en-ZA.png +0 -0
- data/public/tr8n/images/flags/en-ZW.png +0 -0
- data/public/tr8n/images/flags/en.png +0 -0
- data/public/tr8n/images/flags/eo.png +0 -0
- data/public/tr8n/images/flags/es-AR.png +0 -0
- data/public/tr8n/images/flags/es-BO.png +0 -0
- data/public/tr8n/images/flags/es-CL.png +0 -0
- data/public/tr8n/images/flags/es-CO.png +0 -0
- data/public/tr8n/images/flags/es-CR.png +0 -0
- data/public/tr8n/images/flags/es-DO.png +0 -0
- data/public/tr8n/images/flags/es-EC.png +0 -0
- data/public/tr8n/images/flags/es-ES.png +0 -0
- data/public/tr8n/images/flags/es-GT.png +0 -0
- data/public/tr8n/images/flags/es-HN.png +0 -0
- data/public/tr8n/images/flags/es-MX.png +0 -0
- data/public/tr8n/images/flags/es-NI.png +0 -0
- data/public/tr8n/images/flags/es-PA.png +0 -0
- data/public/tr8n/images/flags/es-PE.png +0 -0
- data/public/tr8n/images/flags/es-PR.png +0 -0
- data/public/tr8n/images/flags/es-PY.png +0 -0
- data/public/tr8n/images/flags/es-SV.png +0 -0
- data/public/tr8n/images/flags/es-UY.png +0 -0
- data/public/tr8n/images/flags/es-VE.png +0 -0
- data/public/tr8n/images/flags/es.png +0 -0
- data/public/tr8n/images/flags/et.png +0 -0
- data/public/tr8n/images/flags/eu.png +0 -0
- data/public/tr8n/images/flags/fa-IR.png +0 -0
- data/public/tr8n/images/flags/fa.png +0 -0
- data/public/tr8n/images/flags/fb-LT.png +0 -0
- data/public/tr8n/images/flags/fi.png +0 -0
- data/public/tr8n/images/flags/fj.png +0 -0
- data/public/tr8n/images/flags/fo.png +0 -0
- data/public/tr8n/images/flags/fr-BE.png +0 -0
- data/public/tr8n/images/flags/fr-CA.png +0 -0
- data/public/tr8n/images/flags/fr-CH.png +0 -0
- data/public/tr8n/images/flags/fr-FR.png +0 -0
- data/public/tr8n/images/flags/fr-LU.png +0 -0
- data/public/tr8n/images/flags/fr-MC.png +0 -0
- data/public/tr8n/images/flags/fr.png +0 -0
- data/public/tr8n/images/flags/fur.png +0 -0
- data/public/tr8n/images/flags/fy.png +0 -0
- data/public/tr8n/images/flags/ga.png +0 -0
- data/public/tr8n/images/flags/gd.png +0 -0
- data/public/tr8n/images/flags/gl.png +0 -0
- data/public/tr8n/images/flags/gn.png +0 -0
- data/public/tr8n/images/flags/gu.png +0 -0
- data/public/tr8n/images/flags/gv.png +0 -0
- data/public/tr8n/images/flags/ha.png +0 -0
- data/public/tr8n/images/flags/haw.png +0 -0
- data/public/tr8n/images/flags/he.png +0 -0
- data/public/tr8n/images/flags/hi.png +0 -0
- data/public/tr8n/images/flags/hr.png +0 -0
- data/public/tr8n/images/flags/hsb.png +0 -0
- data/public/tr8n/images/flags/ht.png +0 -0
- data/public/tr8n/images/flags/hu.png +0 -0
- data/public/tr8n/images/flags/hy.png +0 -0
- data/public/tr8n/images/flags/ia.png +0 -0
- data/public/tr8n/images/flags/id.png +0 -0
- data/public/tr8n/images/flags/ie.png +0 -0
- data/public/tr8n/images/flags/ig.png +0 -0
- data/public/tr8n/images/flags/is.png +0 -0
- data/public/tr8n/images/flags/it-CH.png +0 -0
- data/public/tr8n/images/flags/it.png +0 -0
- data/public/tr8n/images/flags/iu.png +0 -0
- data/public/tr8n/images/flags/ja.png +0 -0
- data/public/tr8n/images/flags/jw.png +0 -0
- data/public/tr8n/images/flags/ka.png +0 -0
- data/public/tr8n/images/flags/kk.png +0 -0
- data/public/tr8n/images/flags/kl.png +0 -0
- data/public/tr8n/images/flags/km.png +0 -0
- data/public/tr8n/images/flags/kn.png +0 -0
- data/public/tr8n/images/flags/ko-KP.png +0 -0
- data/public/tr8n/images/flags/ko-KR.png +0 -0
- data/public/tr8n/images/flags/ko.png +0 -0
- data/public/tr8n/images/flags/kok.png +0 -0
- data/public/tr8n/images/flags/ks.png +0 -0
- data/public/tr8n/images/flags/ku.png +0 -0
- data/public/tr8n/images/flags/ky.png +0 -0
- data/public/tr8n/images/flags/la.png +0 -0
- data/public/tr8n/images/flags/lb.png +0 -0
- data/public/tr8n/images/flags/lg.png +0 -0
- data/public/tr8n/images/flags/li-NL.png +0 -0
- data/public/tr8n/images/flags/ln.png +0 -0
- data/public/tr8n/images/flags/lo.png +0 -0
- data/public/tr8n/images/flags/lt.png +0 -0
- data/public/tr8n/images/flags/lv.png +0 -0
- data/public/tr8n/images/flags/md.png +0 -0
- data/public/tr8n/images/flags/mfe.png +0 -0
- data/public/tr8n/images/flags/mg.png +0 -0
- data/public/tr8n/images/flags/mh.png +0 -0
- data/public/tr8n/images/flags/mi.png +0 -0
- data/public/tr8n/images/flags/mk.png +0 -0
- data/public/tr8n/images/flags/ml.png +0 -0
- data/public/tr8n/images/flags/mn.png +0 -0
- data/public/tr8n/images/flags/mo.png +0 -0
- data/public/tr8n/images/flags/mr.png +0 -0
- data/public/tr8n/images/flags/ms.png +0 -0
- data/public/tr8n/images/flags/mt.png +0 -0
- data/public/tr8n/images/flags/my.png +0 -0
- data/public/tr8n/images/flags/na.png +0 -0
- data/public/tr8n/images/flags/nb.png +0 -0
- data/public/tr8n/images/flags/nd.png +0 -0
- data/public/tr8n/images/flags/ne.png +0 -0
- data/public/tr8n/images/flags/ng.png +0 -0
- data/public/tr8n/images/flags/nl-NE.png +0 -0
- data/public/tr8n/images/flags/nl.png +0 -0
- data/public/tr8n/images/flags/nn.png +0 -0
- data/public/tr8n/images/flags/no.png +0 -0
- data/public/tr8n/images/flags/nr.png +0 -0
- data/public/tr8n/images/flags/nso.png +0 -0
- data/public/tr8n/images/flags/nv.png +0 -0
- data/public/tr8n/images/flags/ny.png +0 -0
- data/public/tr8n/images/flags/nyn.png +0 -0
- data/public/tr8n/images/flags/oc.png +0 -0
- data/public/tr8n/images/flags/om.png +0 -0
- data/public/tr8n/images/flags/or.png +0 -0
- data/public/tr8n/images/flags/pa-IN.png +0 -0
- data/public/tr8n/images/flags/pa-PK.png +0 -0
- data/public/tr8n/images/flags/pa.png +0 -0
- data/public/tr8n/images/flags/pf.png +0 -0
- data/public/tr8n/images/flags/pl.png +0 -0
- data/public/tr8n/images/flags/pp.png +0 -0
- data/public/tr8n/images/flags/ps.png +0 -0
- data/public/tr8n/images/flags/pt-BZ.png +0 -0
- data/public/tr8n/images/flags/pt.png +0 -0
- data/public/tr8n/images/flags/qu-PE.png +0 -0
- data/public/tr8n/images/flags/qu.png +0 -0
- data/public/tr8n/images/flags/rj.png +0 -0
- data/public/tr8n/images/flags/rm.png +0 -0
- data/public/tr8n/images/flags/rn.png +0 -0
- data/public/tr8n/images/flags/ro-MD.png +0 -0
- data/public/tr8n/images/flags/ro-RO.png +0 -0
- data/public/tr8n/images/flags/ro.png +0 -0
- data/public/tr8n/images/flags/ru.png +0 -0
- data/public/tr8n/images/flags/rw.png +0 -0
- data/public/tr8n/images/flags/sa.png +0 -0
- data/public/tr8n/images/flags/sc.png +0 -0
- data/public/tr8n/images/flags/sd.png +0 -0
- data/public/tr8n/images/flags/se-NO.png +0 -0
- data/public/tr8n/images/flags/sg.png +0 -0
- data/public/tr8n/images/flags/sh.png +0 -0
- data/public/tr8n/images/flags/si.png +0 -0
- data/public/tr8n/images/flags/sk.png +0 -0
- data/public/tr8n/images/flags/sl.png +0 -0
- data/public/tr8n/images/flags/sm.png +0 -0
- data/public/tr8n/images/flags/sn.png +0 -0
- data/public/tr8n/images/flags/so.png +0 -0
- data/public/tr8n/images/flags/sq.png +0 -0
- data/public/tr8n/images/flags/sr-me.png +0 -0
- data/public/tr8n/images/flags/sr.png +0 -0
- data/public/tr8n/images/flags/ss.png +0 -0
- data/public/tr8n/images/flags/st.png +0 -0
- data/public/tr8n/images/flags/su.png +0 -0
- data/public/tr8n/images/flags/sv-FI.png +0 -0
- data/public/tr8n/images/flags/sv-SE.png +0 -0
- data/public/tr8n/images/flags/sv.png +0 -0
- data/public/tr8n/images/flags/sw.png +0 -0
- data/public/tr8n/images/flags/ta.png +0 -0
- data/public/tr8n/images/flags/te.png +0 -0
- data/public/tr8n/images/flags/tg.png +0 -0
- data/public/tr8n/images/flags/th.png +0 -0
- data/public/tr8n/images/flags/ti.png +0 -0
- data/public/tr8n/images/flags/tig.png +0 -0
- data/public/tr8n/images/flags/tk.png +0 -0
- data/public/tr8n/images/flags/tl.png +0 -0
- data/public/tr8n/images/flags/tlh.png +0 -0
- data/public/tr8n/images/flags/tn.png +0 -0
- data/public/tr8n/images/flags/to.png +0 -0
- data/public/tr8n/images/flags/tr.png +0 -0
- data/public/tr8n/images/flags/ts.png +0 -0
- data/public/tr8n/images/flags/tt.png +0 -0
- data/public/tr8n/images/flags/tw.png +0 -0
- data/public/tr8n/images/flags/ug.png +0 -0
- data/public/tr8n/images/flags/uk.png +0 -0
- data/public/tr8n/images/flags/ur.png +0 -0
- data/public/tr8n/images/flags/uz.png +0 -0
- data/public/tr8n/images/flags/ve.png +0 -0
- data/public/tr8n/images/flags/vi.png +0 -0
- data/public/tr8n/images/flags/vo.png +0 -0
- data/public/tr8n/images/flags/wa.png +0 -0
- data/public/tr8n/images/flags/wo.png +0 -0
- data/public/tr8n/images/flags/xh.png +0 -0
- data/public/tr8n/images/flags/yi.png +0 -0
- data/public/tr8n/images/flags/yo.png +0 -0
- data/public/tr8n/images/flags/zh-CN.png +0 -0
- data/public/tr8n/images/flags/zh-HK.png +0 -0
- data/public/tr8n/images/flags/zh-SG.png +0 -0
- data/public/tr8n/images/flags/zh-TW.png +0 -0
- data/public/tr8n/images/flags/zh.png +0 -0
- data/public/tr8n/images/flags/zu.png +0 -0
- data/public/tr8n/images/globe.gif +0 -0
- data/public/tr8n/images/help.png +0 -0
- data/public/tr8n/images/help/color_coding.png +0 -0
- data/public/tr8n/images/help/language_selector.png +0 -0
- data/public/tr8n/images/help/language_selector_default.png +0 -0
- data/public/tr8n/images/help/languages_disabled.png +0 -0
- data/public/tr8n/images/help/translator.png +0 -0
- data/public/tr8n/images/help2.png +0 -0
- data/public/tr8n/images/information.png +0 -0
- data/public/tr8n/images/keyboard.png +0 -0
- data/public/tr8n/images/language_selector_arrow.gif +0 -0
- data/public/tr8n/images/left_quote.png +0 -0
- data/public/tr8n/images/lightning.png +0 -0
- data/public/tr8n/images/loading.gif +0 -0
- data/public/tr8n/images/loading2.gif +0 -0
- data/public/tr8n/images/loading3.gif +0 -0
- data/public/tr8n/images/loading_large.gif +0 -0
- data/public/tr8n/images/lock.png +0 -0
- data/public/tr8n/images/lock_add.png +0 -0
- data/public/tr8n/images/lock_delete.png +0 -0
- data/public/tr8n/images/lock_open.png +0 -0
- data/public/tr8n/images/medals/bronze.png +0 -0
- data/public/tr8n/images/medals/gold.png +0 -0
- data/public/tr8n/images/medals/runner.png +0 -0
- data/public/tr8n/images/medals/silver.png +0 -0
- data/public/tr8n/images/pencil.png +0 -0
- data/public/tr8n/images/photo_silhouette.gif +0 -0
- data/public/tr8n/images/plus.png +0 -0
- data/public/tr8n/images/random.png +0 -0
- data/public/tr8n/images/random2.png +0 -0
- data/public/tr8n/images/rating_star0.png +0 -0
- data/public/tr8n/images/rating_star05.png +0 -0
- data/public/tr8n/images/rating_star1.png +0 -0
- data/public/tr8n/images/rating_stars.gif +0 -0
- data/public/tr8n/images/rating_stars.psd +0 -0
- data/public/tr8n/images/reply.png +0 -0
- data/public/tr8n/images/right_quote.png +0 -0
- data/public/tr8n/images/rotating_world.gif +0 -0
- data/public/tr8n/images/script.png +0 -0
- data/public/tr8n/images/script_edit.png +0 -0
- data/public/tr8n/images/script_gear.png +0 -0
- data/public/tr8n/images/site_sprite.gif +0 -0
- data/public/tr8n/images/spinner.gif +0 -0
- data/public/tr8n/images/star.png +0 -0
- data/public/tr8n/images/table_edit.png +0 -0
- data/public/tr8n/images/table_gear.png +0 -0
- data/public/tr8n/images/table_multiple.png +0 -0
- data/public/tr8n/images/thumb_down.png +0 -0
- data/public/tr8n/images/thumb_up.png +0 -0
- data/public/tr8n/images/toolbar_bg.gif +0 -0
- data/public/tr8n/images/top_left_stem.png +0 -0
- data/public/tr8n/images/top_right_stem.png +0 -0
- data/public/tr8n/images/tr8n_loading.gif +0 -0
- data/public/tr8n/images/tr8n_logo.jpg +0 -0
- data/public/tr8n/images/tr8n_logo.png +0 -0
- data/public/tr8n/images/tr8n_logo2.gif +0 -0
- data/public/tr8n/images/tr8n_logo2.png +0 -0
- data/public/tr8n/images/tr8n_logo_wiki.png +0 -0
- data/public/tr8n/images/tr8n_logo_wiki2.png +0 -0
- data/public/tr8n/images/translate_icn.gif +0 -0
- data/public/tr8n/images/wizard.png +0 -0
- data/public/tr8n/javascripts/jsDraw2D.js +24 -0
- data/public/tr8n/javascripts/keyboard_1_36.js +1214 -0
- data/public/tr8n/javascripts/keyboard_1_44.js +1735 -0
- data/public/tr8n/javascripts/shortcut.js +223 -0
- data/public/tr8n/javascripts/tr8n.js +904 -0
- data/public/tr8n/javascripts/tr8n_client_sdk.js +1182 -0
- data/public/tr8n/javascripts/tr8n_prototype_effects.js +65 -0
- data/public/tr8n/stylesheets/components.css +208 -0
- data/public/tr8n/stylesheets/keyboard_1_36.css +185 -0
- data/public/tr8n/stylesheets/keyboard_1_44.css +268 -0
- data/public/tr8n/stylesheets/layout.css +119 -0
- data/public/tr8n/stylesheets/tr8n.css +201 -0
- data/rails/init.rb +53 -0
- data/script/rails +6 -0
- data/test/performance/browsing_test.rb +9 -0
- data/test/test_helper.rb +13 -0
- data/tr8n.gemspec +40 -0
- metadata +865 -0
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
#--
|
|
2
|
+
# Copyright (c) 2010-2011 Michael Berkovich
|
|
3
|
+
#
|
|
4
|
+
# Permission is hereby granted, free of charge, to any person obtaining
|
|
5
|
+
# a copy of this software and associated documentation files (the
|
|
6
|
+
# "Software"), to deal in the Software without restriction, including
|
|
7
|
+
# without limitation the rights to use, copy, modify, merge, publish,
|
|
8
|
+
# distribute, sublicense, and/or sell copies of the Software, and to
|
|
9
|
+
# permit persons to whom the Software is furnished to do so, subject to
|
|
10
|
+
# the following conditions:
|
|
11
|
+
#
|
|
12
|
+
# The above copyright notice and this permission notice shall be
|
|
13
|
+
# included in all copies or substantial portions of the Software.
|
|
14
|
+
#
|
|
15
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
16
|
+
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
17
|
+
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
18
|
+
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
|
19
|
+
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
|
20
|
+
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
|
21
|
+
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
22
|
+
#++
|
|
23
|
+
|
|
24
|
+
require 'rails/generators'
|
|
25
|
+
require 'rails/generators/migration'
|
|
26
|
+
|
|
27
|
+
class Tr8nGenerator < Rails::Generators::Base
|
|
28
|
+
include Rails::Generators::Migration
|
|
29
|
+
|
|
30
|
+
def self.source_root
|
|
31
|
+
@source_root ||= File.expand_path('../templates', __FILE__)
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
# Implement the required interface for Rails::Generators::Migration.
|
|
35
|
+
def self.next_migration_number(dirname)
|
|
36
|
+
if ActiveRecord::Base.timestamped_migrations
|
|
37
|
+
Time.now.utc.strftime("%Y%m%d%H%M%S")
|
|
38
|
+
else
|
|
39
|
+
"%.3d" % (current_migration_number(dirname) + 1)
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def create_migration_file
|
|
44
|
+
migration_template 'create_tr8n_tables.rb', 'db/migrate/create_tr8n_tables.rb'
|
|
45
|
+
source = File.expand_path('../../../../config/tr8n', __FILE__)
|
|
46
|
+
target = "#{Rails.root}/config"
|
|
47
|
+
system "rsync -ruv #{source} #{target}"
|
|
48
|
+
end
|
|
49
|
+
end
|
data/lib/tasks/.gitkeep
ADDED
|
File without changes
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
#--
|
|
2
|
+
# Copyright (c) 2010-2011 Michael Berkovich
|
|
3
|
+
#
|
|
4
|
+
# Permission is hereby granted, free of charge, to any person obtaining
|
|
5
|
+
# a copy of this software and associated documentation files (the
|
|
6
|
+
# "Software"), to deal in the Software without restriction, including
|
|
7
|
+
# without limitation the rights to use, copy, modify, merge, publish,
|
|
8
|
+
# distribute, sublicense, and/or sell copies of the Software, and to
|
|
9
|
+
# permit persons to whom the Software is furnished to do so, subject to
|
|
10
|
+
# the following conditions:
|
|
11
|
+
#
|
|
12
|
+
# The above copyright notice and this permission notice shall be
|
|
13
|
+
# included in all copies or substantial portions of the Software.
|
|
14
|
+
#
|
|
15
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
16
|
+
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
17
|
+
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
18
|
+
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
|
19
|
+
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
|
20
|
+
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
|
21
|
+
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
22
|
+
#++
|
|
23
|
+
|
|
24
|
+
namespace :tr8n do
|
|
25
|
+
desc "Sync config and db migrations for tr8n plugin."
|
|
26
|
+
task :sync do
|
|
27
|
+
system "rsync -ruv vendor/plugins/tr8n/config/tr8n ./config"
|
|
28
|
+
system "rsync -ruv vendor/plugins/tr8n/db/migrate ./db"
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
desc "Sync db migrations for tr8n plugin."
|
|
32
|
+
task :sync_db do
|
|
33
|
+
system "rsync -ruv vendor/plugins/tr8n/db/migrate ./db"
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
desc "Initializes all of the tables with default data"
|
|
37
|
+
task :init => :environment do
|
|
38
|
+
raise "This action is prohibited in this environment" if ['production', 'stage', 'staging'].include?(Rails.env) and env('force') != 'true'
|
|
39
|
+
Tr8n::Config.reset_all!
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
desc "Resets all metrics"
|
|
43
|
+
task :reset_metrics => :environment do
|
|
44
|
+
Tr8n::LanguageMetric.reset_metrics
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
desc "Calculates metrics"
|
|
48
|
+
task :metrics => :environment do
|
|
49
|
+
Tr8n::LanguageMetric.calculate_language_metrics
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
desc "Initializes default language cases"
|
|
53
|
+
task :language_cases => :environment do
|
|
54
|
+
Tr8n::Language.all.each do |lang|
|
|
55
|
+
lang.reset_language_cases!
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
desc "Creates featured languages"
|
|
60
|
+
task :featured_languages => :environment do
|
|
61
|
+
Tr8n::Config.config[:featured_languages].each_with_index do |locale, index|
|
|
62
|
+
lang = Tr8n::Language.for(locale)
|
|
63
|
+
lang.featured_index = 10000 - (index * 100)
|
|
64
|
+
lang.save
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
# will delete all keys that have not been verified in the last 2 weeks
|
|
69
|
+
task :delete_unverified_keys => :environment do
|
|
70
|
+
date = env('before') || (Date.today - 2.weeks)
|
|
71
|
+
|
|
72
|
+
puts "Running key destruction process..."
|
|
73
|
+
t0 = Time.now
|
|
74
|
+
|
|
75
|
+
puts "All keys not verified after #{date} will be destroyed!"
|
|
76
|
+
unverified_keys = Tr8n::TranslationKey.find(:all, :conditions => ["verified_at is null or verified_at < ?", date])
|
|
77
|
+
|
|
78
|
+
puts "There are #{unverified_keys.size} keys to be destroyed."
|
|
79
|
+
puts "Destroying unverified keys..." if unverified_keys.size > 0
|
|
80
|
+
|
|
81
|
+
destroy_count = 0
|
|
82
|
+
unverified_keys.each do |tkey|
|
|
83
|
+
tkey.destroy
|
|
84
|
+
destroy_count += 1
|
|
85
|
+
puts "Destroyed #{destroy_count} keys..." if destroy_count % 100 == 0
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
t1 = Time.now
|
|
89
|
+
|
|
90
|
+
puts "Destroyed #{destroy_count} keys"
|
|
91
|
+
puts "Destruction process took #{t1-t0} mls"
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
desc 'Update IP to Location table (file=<file|config/tr8n/data/ip_locations.csv>)'
|
|
95
|
+
task :import_ip_locations => :environment do
|
|
96
|
+
Tr8n::IpLocation.import_from_file('config/tr8n/data/ip_locations.csv', :verbose => true)
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
end
|
data/lib/tr8n.rb
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
#--
|
|
2
|
+
# Copyright (c) 2010-2011 Justin Balthrop
|
|
3
|
+
#
|
|
4
|
+
# Permission is hereby granted, free of charge, to any person obtaining
|
|
5
|
+
# a copy of this software and associated documentation files (the
|
|
6
|
+
# "Software"), to deal in the Software without restriction, including
|
|
7
|
+
# without limitation the rights to use, copy, modify, merge, publish,
|
|
8
|
+
# distribute, sublicense, and/or sell copies of the Software, and to
|
|
9
|
+
# permit persons to whom the Software is furnished to do so, subject to
|
|
10
|
+
# the following conditions:
|
|
11
|
+
#
|
|
12
|
+
# The above copyright notice and this permission notice shall be
|
|
13
|
+
# included in all copies or substantial portions of the Software.
|
|
14
|
+
#
|
|
15
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
16
|
+
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
17
|
+
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
18
|
+
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
|
19
|
+
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
|
20
|
+
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
|
21
|
+
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
22
|
+
#++
|
|
23
|
+
|
|
24
|
+
require File.expand_path(File.dirname(__FILE__) + "/extender")
|
|
25
|
+
|
|
26
|
+
class Tr8n::DumperException < StandardError; end
|
|
27
|
+
module Tr8n::ActiveDumper
|
|
28
|
+
extend Tr8n::Extender
|
|
29
|
+
|
|
30
|
+
module InstanceMethods
|
|
31
|
+
def _dump(ignored)
|
|
32
|
+
data = {:attributes => @attributes, :new_record => @new_record}
|
|
33
|
+
Marshal.dump(data)
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
module ClassMethods
|
|
38
|
+
def _load(str)
|
|
39
|
+
data = Marshal.load(str)
|
|
40
|
+
|
|
41
|
+
raise Tr8n::DumperException, 'invalid format' if not data.kind_of?(Hash) or data.keys.to_set != [:attributes, :new_record].to_set
|
|
42
|
+
|
|
43
|
+
instance = new
|
|
44
|
+
instance.instance_variable_set(:@attributes, data[:attributes])
|
|
45
|
+
instance.instance_variable_set(:@new_record, data[:new_record])
|
|
46
|
+
instance
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
end
|
data/lib/tr8n/cache.rb
ADDED
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
#--
|
|
2
|
+
# Copyright (c) 2010-2011 Michael Berkovich
|
|
3
|
+
#
|
|
4
|
+
# Permission is hereby granted, free of charge, to any person obtaining
|
|
5
|
+
# a copy of this software and associated documentation files (the
|
|
6
|
+
# "Software"), to deal in the Software without restriction, including
|
|
7
|
+
# without limitation the rights to use, copy, modify, merge, publish,
|
|
8
|
+
# distribute, sublicense, and/or sell copies of the Software, and to
|
|
9
|
+
# permit persons to whom the Software is furnished to do so, subject to
|
|
10
|
+
# the following conditions:
|
|
11
|
+
#
|
|
12
|
+
# The above copyright notice and this permission notice shall be
|
|
13
|
+
# included in all copies or substantial portions of the Software.
|
|
14
|
+
#
|
|
15
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
16
|
+
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
17
|
+
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
18
|
+
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
|
19
|
+
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
|
20
|
+
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
|
21
|
+
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
22
|
+
#++
|
|
23
|
+
|
|
24
|
+
class Tr8n::Cache
|
|
25
|
+
def self.cache
|
|
26
|
+
@cache ||= begin
|
|
27
|
+
if Tr8n::Config.cache_adapter == 'ActiveSupport::Cache'
|
|
28
|
+
store_params = [Tr8n::Config.cache_store].flatten
|
|
29
|
+
store_params[0] = store_params[0].to_sym
|
|
30
|
+
ActiveSupport::Cache.lookup_store(*store_params)
|
|
31
|
+
else
|
|
32
|
+
eval(Tr8n::Config.cache_adapter)
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def self.enabled?
|
|
38
|
+
Tr8n::Config.enable_caching?
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def self.versioned_key(key)
|
|
42
|
+
"#{Tr8n::Config.cache_version}_#{key}"
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def self.fetch(key, options = {})
|
|
46
|
+
return yield unless enabled?
|
|
47
|
+
cache.fetch(versioned_key(key), options) do
|
|
48
|
+
yield
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def self.delete(key, options = nil)
|
|
53
|
+
return unless enabled?
|
|
54
|
+
cache.delete(versioned_key(key), options)
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
end
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
#--
|
|
2
|
+
# Copyright (c) 2010-2011 Michael Berkovich
|
|
3
|
+
#
|
|
4
|
+
# Permission is hereby granted, free of charge, to any person obtaining
|
|
5
|
+
# a copy of this software and associated documentation files (the
|
|
6
|
+
# "Software"), to deal in the Software without restriction, including
|
|
7
|
+
# without limitation the rights to use, copy, modify, merge, publish,
|
|
8
|
+
# distribute, sublicense, and/or sell copies of the Software, and to
|
|
9
|
+
# permit persons to whom the Software is furnished to do so, subject to
|
|
10
|
+
# the following conditions:
|
|
11
|
+
#
|
|
12
|
+
# The above copyright notice and this permission notice shall be
|
|
13
|
+
# included in all copies or substantial portions of the Software.
|
|
14
|
+
#
|
|
15
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
16
|
+
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
17
|
+
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
18
|
+
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
|
19
|
+
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
|
20
|
+
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
|
21
|
+
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
22
|
+
#++
|
|
23
|
+
|
|
24
|
+
module Tr8n::CommonMethods
|
|
25
|
+
|
|
26
|
+
# translation functions
|
|
27
|
+
def tr(label, desc = "", tokens = {}, options = {})
|
|
28
|
+
unless desc.nil? or desc.is_a?(String)
|
|
29
|
+
raise Tr8n::Exception.new("The second parameter of the tr function must be a description")
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
begin
|
|
33
|
+
url = request.url
|
|
34
|
+
host = request.env['HTTP_HOST']
|
|
35
|
+
source = "#{controller.class.name.underscore.gsub("_controller", "")}/#{controller.action_name}"
|
|
36
|
+
rescue Exception => ex
|
|
37
|
+
source = self.class.name
|
|
38
|
+
url = nil
|
|
39
|
+
host = 'localhost'
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
options.merge!(:source => source) unless options[:source]
|
|
43
|
+
options.merge!(:caller => caller)
|
|
44
|
+
options.merge!(:url => url)
|
|
45
|
+
options.merge!(:host => host)
|
|
46
|
+
|
|
47
|
+
# pp [source, options[:source], url]
|
|
48
|
+
|
|
49
|
+
unless Tr8n::Config.enabled?
|
|
50
|
+
return Tr8n::TranslationKey.substitute_tokens(label, tokens, options)
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
Tr8n::Config.current_language.translate(label, desc, tokens, options)
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
# for translating labels
|
|
57
|
+
def trl(label, desc = "", tokens = {}, options = {})
|
|
58
|
+
tr(label, desc, tokens, options.merge(:skip_decorations => true))
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
end
|
data/lib/tr8n/config.rb
ADDED
|
@@ -0,0 +1,719 @@
|
|
|
1
|
+
#--
|
|
2
|
+
# Copyright (c) 2010-2011 Michael Berkovich
|
|
3
|
+
#
|
|
4
|
+
# Permission is hereby granted, free of charge, to any person obtaining
|
|
5
|
+
# a copy of this software and associated documentation files (the
|
|
6
|
+
# "Software"), to deal in the Software without restriction, including
|
|
7
|
+
# without limitation the rights to use, copy, modify, merge, publish,
|
|
8
|
+
# distribute, sublicense, and/or sell copies of the Software, and to
|
|
9
|
+
# permit persons to whom the Software is furnished to do so, subject to
|
|
10
|
+
# the following conditions:
|
|
11
|
+
#
|
|
12
|
+
# The above copyright notice and this permission notice shall be
|
|
13
|
+
# included in all copies or substantial portions of the Software.
|
|
14
|
+
#
|
|
15
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
16
|
+
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
17
|
+
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
18
|
+
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
|
19
|
+
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
|
20
|
+
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
|
21
|
+
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
22
|
+
#++
|
|
23
|
+
|
|
24
|
+
require 'json'
|
|
25
|
+
|
|
26
|
+
class Tr8n::Config
|
|
27
|
+
|
|
28
|
+
#########################################################
|
|
29
|
+
# Basic Stuff
|
|
30
|
+
|
|
31
|
+
# initializes language, user and translator
|
|
32
|
+
# the variables are kept in a thread safe form throughout the request
|
|
33
|
+
def self.init(locale, site_current_user)
|
|
34
|
+
Thread.current[:tr8n_current_language] = Tr8n::Language.for(locale) || default_language
|
|
35
|
+
Thread.current[:tr8n_current_user] = site_current_user
|
|
36
|
+
Thread.current[:tr8n_current_translator] = Tr8n::Translator.for(site_current_user)
|
|
37
|
+
Thread.current[:tr8n_block_options] = {}
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def self.current_user
|
|
41
|
+
Thread.current[:tr8n_current_user]
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def self.current_language
|
|
45
|
+
Thread.current[:tr8n_current_language] ||= default_language
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def self.current_user_is_translator?
|
|
49
|
+
Thread.current[:tr8n_current_translator] != nil
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def self.block_options
|
|
53
|
+
Thread.current[:tr8n_block_options] ||= {}
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
# when this method is called, we create the translator record right away
|
|
57
|
+
# and from this point on, will track the user
|
|
58
|
+
# this can happen any time user tries to translate something or enables inline translations
|
|
59
|
+
def self.current_translator
|
|
60
|
+
Thread.current[:tr8n_current_translator] ||= Tr8n::Translator.register
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
def self.default_language
|
|
64
|
+
return Tr8n::Language.new(:locale => default_locale) if disabled?
|
|
65
|
+
@default_language ||= Tr8n::Language.for(default_locale) || Tr8n::Language.new(:locale => default_locale)
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def self.reset!
|
|
69
|
+
# thread based variables
|
|
70
|
+
Thread.current[:tr8n_current_language] = nil
|
|
71
|
+
Thread.current[:tr8n_current_user] = nil
|
|
72
|
+
Thread.current[:tr8n_current_translator] = nil
|
|
73
|
+
Thread.current[:tr8n_block_options] = nil
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
def self.models
|
|
77
|
+
[
|
|
78
|
+
Tr8n::LanguageRule, Tr8n::LanguageUser, Tr8n::Language, Tr8n::LanguageMetric,
|
|
79
|
+
Tr8n::LanguageCase, Tr8n::LanguageCaseValueMap, Tr8n::LanguageCaseRule,
|
|
80
|
+
Tr8n::TranslationKey, Tr8n::TranslationKeySource, Tr8n::TranslationKeyComment, Tr8n::TranslationKeyLock,
|
|
81
|
+
Tr8n::TranslationSource, Tr8n::TranslationDomain,
|
|
82
|
+
Tr8n::Translation, Tr8n::TranslationVote,
|
|
83
|
+
Tr8n::Translator, Tr8n::TranslatorLog, Tr8n::TranslatorMetric,
|
|
84
|
+
Tr8n::TranslatorFollowing, Tr8n::TranslatorReport,
|
|
85
|
+
Tr8n::LanguageForumTopic, Tr8n::LanguageForumMessage, Tr8n::LanguageForumAbuseReport,
|
|
86
|
+
Tr8n::Glossary, Tr8n::IpLocation
|
|
87
|
+
]
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
# will clean all tables and initialize default values
|
|
91
|
+
# never ever do it on live !!!
|
|
92
|
+
def self.reset_all!
|
|
93
|
+
puts "Resetting tr8n tables..."
|
|
94
|
+
models.each do |cls|
|
|
95
|
+
puts ">> Resetting #{cls.name}..."
|
|
96
|
+
cls.delete_all
|
|
97
|
+
end
|
|
98
|
+
puts "Done."
|
|
99
|
+
|
|
100
|
+
init_default_languages
|
|
101
|
+
init_glossary
|
|
102
|
+
|
|
103
|
+
puts "Done."
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
def self.init_default_languages
|
|
107
|
+
puts "Initializing default languages..."
|
|
108
|
+
default_languages.each do |locale, info|
|
|
109
|
+
puts ">> Initializing #{info[:english_name]}..."
|
|
110
|
+
lang = Tr8n::Language.find_or_create(locale, info[:english_name])
|
|
111
|
+
info[:right_to_left] = false if info[:right_to_left].nil?
|
|
112
|
+
fallback_key = info.delete(:fallback_key)
|
|
113
|
+
lang.update_attributes(info)
|
|
114
|
+
lang.reset!
|
|
115
|
+
end
|
|
116
|
+
puts "Created #{default_languages.size} languages."
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
def self.init_glossary
|
|
120
|
+
puts "Initializing default glossary..."
|
|
121
|
+
default_glossary.each do |keyword, description|
|
|
122
|
+
Tr8n::Glossary.create(:keyword => keyword, :description => description)
|
|
123
|
+
end
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
def self.root
|
|
127
|
+
Rails.root
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
def self.env
|
|
131
|
+
Rails.env
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
# json support
|
|
135
|
+
def self.load_json(file_path)
|
|
136
|
+
json = JSON.parse(File.read("#{root}#{file_path}"))
|
|
137
|
+
return HashWithIndifferentAccess.new(json) if json.is_a?(Hash)
|
|
138
|
+
map = {"map" => json}
|
|
139
|
+
HashWithIndifferentAccess.new(map)[:map]
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
def self.load_yml(file_path, for_env = env)
|
|
143
|
+
yml = YAML.load_file("#{root}#{file_path}")
|
|
144
|
+
yml = yml[for_env] unless for_env.nil?
|
|
145
|
+
HashWithIndifferentAccess.new(yml)
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
def self.dump_config
|
|
149
|
+
save_to_yaml("config.yaml", config)
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
def self.config
|
|
153
|
+
@config ||= load_yml("/config/tr8n/config.yml")
|
|
154
|
+
end
|
|
155
|
+
|
|
156
|
+
def self.default_languages
|
|
157
|
+
@default_languages ||= load_yml("/config/tr8n/site/default_languages.yml", nil)
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
def self.default_decoration_tokens
|
|
161
|
+
@default_decoration_tokens ||= load_yml("/config/tr8n/tokens/decorations.yml", nil)
|
|
162
|
+
end
|
|
163
|
+
|
|
164
|
+
def self.default_data_tokens
|
|
165
|
+
@default_data_tokens ||= load_yml("/config/tr8n/tokens/data.yml", nil)
|
|
166
|
+
end
|
|
167
|
+
|
|
168
|
+
def self.default_glossary
|
|
169
|
+
@default_glossary ||= load_yml("/config/tr8n/site/default_glossary.yml", nil)
|
|
170
|
+
end
|
|
171
|
+
|
|
172
|
+
def self.features
|
|
173
|
+
@features ||= begin
|
|
174
|
+
defs = load_yml("/config/tr8n/site/features.yml")
|
|
175
|
+
feats = []
|
|
176
|
+
defs[:enabled_features].each do |key|
|
|
177
|
+
defs[key][:key] = key
|
|
178
|
+
feats << defs[key]
|
|
179
|
+
end
|
|
180
|
+
feats
|
|
181
|
+
end
|
|
182
|
+
end
|
|
183
|
+
|
|
184
|
+
def self.enabled?
|
|
185
|
+
config[:enable_tr8n]
|
|
186
|
+
end
|
|
187
|
+
|
|
188
|
+
def self.disabled?
|
|
189
|
+
not enabled?
|
|
190
|
+
end
|
|
191
|
+
|
|
192
|
+
def self.enable_software_keyboard?
|
|
193
|
+
config[:enable_software_keyboard]
|
|
194
|
+
end
|
|
195
|
+
|
|
196
|
+
def self.enable_keyboard_shortcuts?
|
|
197
|
+
config[:enable_keyboard_shortcuts]
|
|
198
|
+
end
|
|
199
|
+
|
|
200
|
+
def self.default_shortcuts
|
|
201
|
+
@default_shortcuts ||= load_yml("/config/tr8n/site/shortcuts.yml", nil)
|
|
202
|
+
end
|
|
203
|
+
|
|
204
|
+
def self.enable_inline_translations?
|
|
205
|
+
config[:enable_inline_translations]
|
|
206
|
+
end
|
|
207
|
+
|
|
208
|
+
def self.enable_language_cases?
|
|
209
|
+
config[:enable_language_cases]
|
|
210
|
+
end
|
|
211
|
+
|
|
212
|
+
def self.enable_key_source_tracking?
|
|
213
|
+
config[:enable_key_source_tracking]
|
|
214
|
+
end
|
|
215
|
+
|
|
216
|
+
def self.enable_key_caller_tracking?
|
|
217
|
+
config[:enable_key_caller_tracking]
|
|
218
|
+
end
|
|
219
|
+
|
|
220
|
+
def self.enable_google_suggestions?
|
|
221
|
+
config[:enable_google_suggestions]
|
|
222
|
+
end
|
|
223
|
+
|
|
224
|
+
def self.enable_glossary_hints?
|
|
225
|
+
config[:enable_glossary_hints]
|
|
226
|
+
end
|
|
227
|
+
|
|
228
|
+
def self.enable_dictionary_lookup?
|
|
229
|
+
config[:enable_dictionary_lookup]
|
|
230
|
+
end
|
|
231
|
+
|
|
232
|
+
def self.enable_language_flags?
|
|
233
|
+
config[:enable_language_flags]
|
|
234
|
+
end
|
|
235
|
+
|
|
236
|
+
def self.enable_language_stats?
|
|
237
|
+
config[:enable_language_stats]
|
|
238
|
+
end
|
|
239
|
+
|
|
240
|
+
def self.open_registration_mode?
|
|
241
|
+
config[:open_registration_mode]
|
|
242
|
+
end
|
|
243
|
+
|
|
244
|
+
def self.enable_fallback_languages?
|
|
245
|
+
config[:enable_fallback_languages]
|
|
246
|
+
end
|
|
247
|
+
|
|
248
|
+
def self.enable_translator_language?
|
|
249
|
+
config[:enable_translator_language]
|
|
250
|
+
end
|
|
251
|
+
|
|
252
|
+
def self.enable_admin_translations?
|
|
253
|
+
config[:enable_admin_translations]
|
|
254
|
+
end
|
|
255
|
+
|
|
256
|
+
def self.enable_admin_inline_mode?
|
|
257
|
+
config[:enable_admin_inline_mode]
|
|
258
|
+
end
|
|
259
|
+
|
|
260
|
+
def self.enable_country_tracking?
|
|
261
|
+
config[:enable_country_tracking]
|
|
262
|
+
end
|
|
263
|
+
|
|
264
|
+
#########################################################
|
|
265
|
+
# Config Sections
|
|
266
|
+
def self.caching
|
|
267
|
+
config[:caching]
|
|
268
|
+
end
|
|
269
|
+
|
|
270
|
+
def self.logger
|
|
271
|
+
config[:logger]
|
|
272
|
+
end
|
|
273
|
+
|
|
274
|
+
def self.site_info
|
|
275
|
+
config[:site_info]
|
|
276
|
+
end
|
|
277
|
+
|
|
278
|
+
def self.rules_engine
|
|
279
|
+
config[:rules_engine]
|
|
280
|
+
end
|
|
281
|
+
|
|
282
|
+
def self.localization
|
|
283
|
+
config[:localization]
|
|
284
|
+
end
|
|
285
|
+
|
|
286
|
+
def self.api
|
|
287
|
+
config[:api]
|
|
288
|
+
end
|
|
289
|
+
|
|
290
|
+
#########################################################
|
|
291
|
+
# Caching
|
|
292
|
+
def self.enable_caching?
|
|
293
|
+
caching[:enabled]
|
|
294
|
+
end
|
|
295
|
+
|
|
296
|
+
def self.cache_adapter
|
|
297
|
+
caching[:adapter]
|
|
298
|
+
end
|
|
299
|
+
|
|
300
|
+
def self.cache_store
|
|
301
|
+
caching[:store]
|
|
302
|
+
end
|
|
303
|
+
|
|
304
|
+
def self.cache_version
|
|
305
|
+
caching[:version]
|
|
306
|
+
end
|
|
307
|
+
#########################################################
|
|
308
|
+
|
|
309
|
+
#########################################################
|
|
310
|
+
# Logger
|
|
311
|
+
def self.enable_logger?
|
|
312
|
+
logger[:enabled]
|
|
313
|
+
end
|
|
314
|
+
|
|
315
|
+
def self.log_path
|
|
316
|
+
logger[:log_path]
|
|
317
|
+
end
|
|
318
|
+
|
|
319
|
+
def self.enable_paranoia_mode?
|
|
320
|
+
logger[:enable_paranoia_mode]
|
|
321
|
+
end
|
|
322
|
+
#########################################################
|
|
323
|
+
|
|
324
|
+
#########################################################
|
|
325
|
+
# Site Info
|
|
326
|
+
def self.site_title
|
|
327
|
+
site_info[:title]
|
|
328
|
+
end
|
|
329
|
+
|
|
330
|
+
def self.splash_screen
|
|
331
|
+
site_info[:splash_screen]
|
|
332
|
+
end
|
|
333
|
+
|
|
334
|
+
def self.default_locale
|
|
335
|
+
return block_options[:default_locale] if block_options[:default_locale]
|
|
336
|
+
site_info[:default_locale]
|
|
337
|
+
end
|
|
338
|
+
|
|
339
|
+
def self.multiple_base_languages?
|
|
340
|
+
'en-US' == default_locale
|
|
341
|
+
end
|
|
342
|
+
|
|
343
|
+
def self.default_url
|
|
344
|
+
site_info[:default_url]
|
|
345
|
+
end
|
|
346
|
+
|
|
347
|
+
def self.current_locale_method
|
|
348
|
+
site_info[:current_locale_method]
|
|
349
|
+
end
|
|
350
|
+
|
|
351
|
+
def self.enable_tr8n_method
|
|
352
|
+
site_info[:enable_tr8n_method]
|
|
353
|
+
end
|
|
354
|
+
|
|
355
|
+
def self.sitemap_sections
|
|
356
|
+
@sitemap_sections ||= load_json(site_info[:sitemap_path])
|
|
357
|
+
end
|
|
358
|
+
|
|
359
|
+
def self.effects_library_path
|
|
360
|
+
site_info[:effects_library_path]
|
|
361
|
+
end
|
|
362
|
+
|
|
363
|
+
def self.enable_effects?
|
|
364
|
+
site_info[:enable_effects]
|
|
365
|
+
end
|
|
366
|
+
|
|
367
|
+
def self.tr8n_helpers
|
|
368
|
+
return [] unless site_info[:tr8n_helpers]
|
|
369
|
+
@tr8n_helpers ||= site_info[:tr8n_helpers].collect{|helper| helper.to_sym}
|
|
370
|
+
end
|
|
371
|
+
|
|
372
|
+
def self.admin_helpers
|
|
373
|
+
return [] unless site_info[:admin_helpers]
|
|
374
|
+
@admin_helpers ||= site_info[:admin_helpers].collect{|helper| helper.to_sym}
|
|
375
|
+
end
|
|
376
|
+
|
|
377
|
+
def self.skip_before_filters
|
|
378
|
+
return [] unless site_info[:skip_before_filters]
|
|
379
|
+
@skip_before_filters ||= site_info[:skip_before_filters].collect{|filter| filter.to_sym}
|
|
380
|
+
end
|
|
381
|
+
|
|
382
|
+
def self.before_filters
|
|
383
|
+
return [] unless site_info[:before_filters]
|
|
384
|
+
@before_filters ||= site_info[:before_filters].collect{|filter| filter.to_sym}
|
|
385
|
+
end
|
|
386
|
+
|
|
387
|
+
def self.after_filters
|
|
388
|
+
return [] unless site_info[:after_filters]
|
|
389
|
+
@after_filters ||= site_info[:after_filters].collect{|filter| filter.to_sym}
|
|
390
|
+
end
|
|
391
|
+
|
|
392
|
+
#########################################################
|
|
393
|
+
# site user info
|
|
394
|
+
# The following methods could be overloaded in the initializer
|
|
395
|
+
#########################################################
|
|
396
|
+
def self.site_user_info
|
|
397
|
+
site_info[:user_info]
|
|
398
|
+
end
|
|
399
|
+
|
|
400
|
+
def self.current_user_method
|
|
401
|
+
site_user_info[:current_user_method]
|
|
402
|
+
end
|
|
403
|
+
|
|
404
|
+
def self.site_user_info_enabled?
|
|
405
|
+
site_user_info[:enabled].nil? ? true : site_user_info[:enabled]
|
|
406
|
+
end
|
|
407
|
+
|
|
408
|
+
def self.site_user_info_disabled?
|
|
409
|
+
!site_user_info_enabled?
|
|
410
|
+
end
|
|
411
|
+
|
|
412
|
+
def self.user_class_name
|
|
413
|
+
return site_user_info[:class_name] if site_user_info_enabled?
|
|
414
|
+
"Tr8n::Translator"
|
|
415
|
+
end
|
|
416
|
+
|
|
417
|
+
def self.user_class
|
|
418
|
+
user_class_name.constantize
|
|
419
|
+
end
|
|
420
|
+
|
|
421
|
+
def self.user_id(user)
|
|
422
|
+
begin
|
|
423
|
+
user.send(site_user_info[:methods][:id])
|
|
424
|
+
rescue Exception => ex
|
|
425
|
+
Tr8n::Logger.error("Failed to fetch user id: #{ex.to_s}")
|
|
426
|
+
return 0
|
|
427
|
+
end
|
|
428
|
+
end
|
|
429
|
+
|
|
430
|
+
def self.user_name(user)
|
|
431
|
+
begin
|
|
432
|
+
user.send(site_user_info[:methods][:name])
|
|
433
|
+
rescue Exception => ex
|
|
434
|
+
Tr8n::Logger.error("Failed to fetch #{user_class_name} name: #{ex.to_s}")
|
|
435
|
+
return "Unknown user"
|
|
436
|
+
end
|
|
437
|
+
end
|
|
438
|
+
|
|
439
|
+
def self.user_gender(user)
|
|
440
|
+
begin
|
|
441
|
+
user.send(site_user_info[:methods][:gender])
|
|
442
|
+
rescue Exception => ex
|
|
443
|
+
Tr8n::Logger.error("Failed to fetch #{user_class_name} name: #{ex.to_s}")
|
|
444
|
+
return "unknown"
|
|
445
|
+
end
|
|
446
|
+
end
|
|
447
|
+
|
|
448
|
+
def self.user_mugshot(user)
|
|
449
|
+
begin
|
|
450
|
+
user.send(site_user_info[:methods][:mugshot])
|
|
451
|
+
rescue Exception => ex
|
|
452
|
+
Tr8n::Logger.error("Failed to fetch #{user_class_name} image: #{ex.to_s}")
|
|
453
|
+
return silhouette_image
|
|
454
|
+
end
|
|
455
|
+
end
|
|
456
|
+
|
|
457
|
+
def self.user_link(user)
|
|
458
|
+
begin
|
|
459
|
+
user.send(site_user_info[:methods][:link])
|
|
460
|
+
rescue Exception => ex
|
|
461
|
+
Tr8n::Logger.error("Failed to fetch #{user_class_name} link: #{ex.to_s}")
|
|
462
|
+
return "/tr8n"
|
|
463
|
+
end
|
|
464
|
+
end
|
|
465
|
+
|
|
466
|
+
def self.user_locale(user)
|
|
467
|
+
begin
|
|
468
|
+
user.send(site_user_info[:methods][:locale])
|
|
469
|
+
rescue Exception => ex
|
|
470
|
+
Tr8n::Logger.error("Failed to fetch #{user_class_name} locale: #{ex.to_s}")
|
|
471
|
+
return default_locale
|
|
472
|
+
end
|
|
473
|
+
end
|
|
474
|
+
|
|
475
|
+
def self.admin_user?(user = current_user)
|
|
476
|
+
begin
|
|
477
|
+
user.send(site_user_info[:methods][:admin])
|
|
478
|
+
rescue Exception => ex
|
|
479
|
+
Tr8n::Logger.error("Failed to fetch #{user_class_name} admin flag: #{ex.to_s}")
|
|
480
|
+
return false
|
|
481
|
+
end
|
|
482
|
+
end
|
|
483
|
+
|
|
484
|
+
def self.current_user_is_admin?
|
|
485
|
+
admin_user?
|
|
486
|
+
end
|
|
487
|
+
|
|
488
|
+
def self.guest_user?(user = current_user)
|
|
489
|
+
return true unless user
|
|
490
|
+
begin
|
|
491
|
+
user.send(site_user_info[:methods][:guest])
|
|
492
|
+
rescue Exception => ex
|
|
493
|
+
Tr8n::Logger.error("Failed to fetch #{user_class_name} guest flag: #{ex.to_s}")
|
|
494
|
+
return true
|
|
495
|
+
end
|
|
496
|
+
end
|
|
497
|
+
|
|
498
|
+
def self.current_user_is_guest?
|
|
499
|
+
guest_user?
|
|
500
|
+
end
|
|
501
|
+
|
|
502
|
+
def self.silhouette_image
|
|
503
|
+
"/tr8n/images/photo_silhouette.gif"
|
|
504
|
+
end
|
|
505
|
+
|
|
506
|
+
#########################################################
|
|
507
|
+
# rules engine
|
|
508
|
+
|
|
509
|
+
def self.language_rule_classes
|
|
510
|
+
@language_rule_classes ||= rules_engine[:language_rule_classes].collect{|lrc| lrc.constantize}
|
|
511
|
+
end
|
|
512
|
+
|
|
513
|
+
def self.language_rule_dependencies
|
|
514
|
+
@language_rule_dependencies ||= begin
|
|
515
|
+
depts = {}
|
|
516
|
+
language_rule_classes.each do |cls|
|
|
517
|
+
if depts[cls.dependency]
|
|
518
|
+
raise Tr8n::Exception.new("The same dependency key #{cls.dependency} has been registered for multiple rules. This is not allowed.")
|
|
519
|
+
end
|
|
520
|
+
depts[cls.dependency] = cls
|
|
521
|
+
end
|
|
522
|
+
depts
|
|
523
|
+
end
|
|
524
|
+
end
|
|
525
|
+
|
|
526
|
+
def self.universal_language_rules
|
|
527
|
+
@universal_language_rules ||= begin
|
|
528
|
+
urs = []
|
|
529
|
+
language_rule_classes.each do |cls|
|
|
530
|
+
next unless cls.suffixes.is_a?(String)
|
|
531
|
+
urs << cls if cls.suffixes == "*"
|
|
532
|
+
end
|
|
533
|
+
urs
|
|
534
|
+
end
|
|
535
|
+
end
|
|
536
|
+
|
|
537
|
+
def self.language_rule_suffixes
|
|
538
|
+
@language_rule_suffixes ||= begin
|
|
539
|
+
sfx = {}
|
|
540
|
+
language_rule_classes.each do |cls|
|
|
541
|
+
next unless cls.suffixes.is_a?(Array)
|
|
542
|
+
cls.suffixes.each do |suffix|
|
|
543
|
+
if suffix.index("_")
|
|
544
|
+
raise Tr8n::Exception.new("Incorrect rule suffix: #{suffix}. Suffix may not have '_' in it.")
|
|
545
|
+
end
|
|
546
|
+
sfx[suffix] ||= []
|
|
547
|
+
sfx[suffix] << cls
|
|
548
|
+
end
|
|
549
|
+
end
|
|
550
|
+
sfx
|
|
551
|
+
end
|
|
552
|
+
end
|
|
553
|
+
|
|
554
|
+
def self.language_rules_for_suffix(suffix)
|
|
555
|
+
suffix_rules = language_rule_suffixes[suffix] || []
|
|
556
|
+
suffix_rules + universal_language_rules
|
|
557
|
+
end
|
|
558
|
+
|
|
559
|
+
def self.allow_nil_token_values?
|
|
560
|
+
rules_engine[:allow_nil_token_values]
|
|
561
|
+
end
|
|
562
|
+
|
|
563
|
+
def self.data_token_classes
|
|
564
|
+
@data_token_classes ||= rules_engine[:data_token_classes].collect{|tc| tc.constantize}
|
|
565
|
+
end
|
|
566
|
+
|
|
567
|
+
def self.decoration_token_classes
|
|
568
|
+
@decoration_token_classes ||= rules_engine[:decoration_token_classes].collect{|tc| tc.constantize}
|
|
569
|
+
end
|
|
570
|
+
|
|
571
|
+
def self.viewing_user_token_for(label)
|
|
572
|
+
Tr8n::Tokens::DataToken.new(label, "{#{rules_engine[:viewing_user_token]}:gender}")
|
|
573
|
+
end
|
|
574
|
+
|
|
575
|
+
def self.translation_threshold
|
|
576
|
+
rules_engine[:translation_threshold]
|
|
577
|
+
end
|
|
578
|
+
|
|
579
|
+
def self.default_rank_styles
|
|
580
|
+
@default_rank_styles ||= begin
|
|
581
|
+
styles = {}
|
|
582
|
+
rules_engine[:translation_rank_styles].each do |key, value|
|
|
583
|
+
range = Range.new(*(key.to_s.split("..").map{|v| v.to_i}))
|
|
584
|
+
styles[range] = value
|
|
585
|
+
end
|
|
586
|
+
styles
|
|
587
|
+
end
|
|
588
|
+
end
|
|
589
|
+
|
|
590
|
+
# get rules for specified locale, or get default language rules
|
|
591
|
+
def self.load_default_rules(rules_type, locale = default_locale)
|
|
592
|
+
@default_rules ||= {}
|
|
593
|
+
@default_rules[rules_type] ||= load_yml("/config/tr8n/rules/default_#{rules_type}_rules.yml", nil)
|
|
594
|
+
rules_for_locale = @default_rules[rules_type][locale.to_s]
|
|
595
|
+
|
|
596
|
+
return rules_for_locale.values unless rules_for_locale.nil?
|
|
597
|
+
return [] if @default_rules[rules_type][default_locale].nil?
|
|
598
|
+
@default_rules[rules_type][default_locale].values
|
|
599
|
+
end
|
|
600
|
+
|
|
601
|
+
def self.default_gender_rules(locale = default_locale)
|
|
602
|
+
load_default_rules("gender", locale)
|
|
603
|
+
end
|
|
604
|
+
|
|
605
|
+
def self.default_gender_list_rules(locale = default_locale)
|
|
606
|
+
load_default_rules("gender_list", locale)
|
|
607
|
+
end
|
|
608
|
+
|
|
609
|
+
def self.default_list_rules(locale = default_locale)
|
|
610
|
+
load_default_rules("list", locale)
|
|
611
|
+
end
|
|
612
|
+
|
|
613
|
+
def self.default_numeric_rules(locale = default_locale)
|
|
614
|
+
load_default_rules("numeric", locale)
|
|
615
|
+
end
|
|
616
|
+
|
|
617
|
+
def self.default_date_rules(locale = default_locale)
|
|
618
|
+
load_default_rules("date", locale)
|
|
619
|
+
end
|
|
620
|
+
|
|
621
|
+
def self.default_value_rules(locale = default_locale)
|
|
622
|
+
load_default_rules("value", locale)
|
|
623
|
+
end
|
|
624
|
+
|
|
625
|
+
def self.default_cases_for(locale = default_locale)
|
|
626
|
+
@default_cases ||= load_yml("/config/tr8n/rules/default_cases.yml", nil)
|
|
627
|
+
return [] unless @default_cases[locale.to_s]
|
|
628
|
+
@default_cases[locale.to_s].values
|
|
629
|
+
end
|
|
630
|
+
|
|
631
|
+
#########################################################
|
|
632
|
+
# localization
|
|
633
|
+
#########################################################
|
|
634
|
+
|
|
635
|
+
def self.strftime_symbol_to_token(symbol)
|
|
636
|
+
{
|
|
637
|
+
"%a" => "{short_week_day_name}",
|
|
638
|
+
"%A" => "{week_day_name}",
|
|
639
|
+
"%b" => "{short_month_name}",
|
|
640
|
+
"%B" => "{month_name}",
|
|
641
|
+
"%p" => "{am_pm}",
|
|
642
|
+
"%d" => "{days}",
|
|
643
|
+
"%e" => "{day_of_month}",
|
|
644
|
+
"%j" => "{year_days}",
|
|
645
|
+
"%m" => "{months}",
|
|
646
|
+
"%W" => "{week_num}",
|
|
647
|
+
"%w" => "{week_days}",
|
|
648
|
+
"%y" => "{short_years}",
|
|
649
|
+
"%Y" => "{years}",
|
|
650
|
+
"%l" => "{trimed_hour}",
|
|
651
|
+
"%H" => "{full_hours}",
|
|
652
|
+
"%I" => "{short_hours}",
|
|
653
|
+
"%M" => "{minutes}",
|
|
654
|
+
"%S" => "{seconds}",
|
|
655
|
+
"%s" => "{since_epoch}"
|
|
656
|
+
}[symbol]
|
|
657
|
+
end
|
|
658
|
+
|
|
659
|
+
def self.default_day_names
|
|
660
|
+
localization[:default_day_names]
|
|
661
|
+
end
|
|
662
|
+
|
|
663
|
+
def self.default_abbr_day_names
|
|
664
|
+
localization[:default_abbr_day_names]
|
|
665
|
+
end
|
|
666
|
+
|
|
667
|
+
def self.default_month_names
|
|
668
|
+
localization[:default_month_names]
|
|
669
|
+
end
|
|
670
|
+
|
|
671
|
+
def self.default_abbr_month_names
|
|
672
|
+
localization[:default_abbr_month_names]
|
|
673
|
+
end
|
|
674
|
+
|
|
675
|
+
def self.default_date_formats
|
|
676
|
+
localization[:custom_date_formats]
|
|
677
|
+
end
|
|
678
|
+
|
|
679
|
+
#########################################################
|
|
680
|
+
# Translator Roles and Levels
|
|
681
|
+
#########################################################
|
|
682
|
+
def self.translator_roles
|
|
683
|
+
config[:translator_roles]
|
|
684
|
+
end
|
|
685
|
+
|
|
686
|
+
def self.translator_levels
|
|
687
|
+
@translator_levels ||= begin
|
|
688
|
+
levels = HashWithIndifferentAccess.new
|
|
689
|
+
translator_roles.each do |key, val|
|
|
690
|
+
levels[val] = key
|
|
691
|
+
end
|
|
692
|
+
levels
|
|
693
|
+
end
|
|
694
|
+
end
|
|
695
|
+
|
|
696
|
+
def self.manager_level
|
|
697
|
+
1000
|
|
698
|
+
end
|
|
699
|
+
|
|
700
|
+
def self.admin_level
|
|
701
|
+
10000
|
|
702
|
+
end
|
|
703
|
+
|
|
704
|
+
def self.default_translation_key_level
|
|
705
|
+
config[:default_translation_key_level] || 0
|
|
706
|
+
end
|
|
707
|
+
|
|
708
|
+
#########################################################
|
|
709
|
+
# API
|
|
710
|
+
#########################################################
|
|
711
|
+
def self.enable_api?
|
|
712
|
+
api[:enabled]
|
|
713
|
+
end
|
|
714
|
+
|
|
715
|
+
def self.enable_client_sdk?
|
|
716
|
+
config[:enable_client_sdk]
|
|
717
|
+
end
|
|
718
|
+
|
|
719
|
+
end
|