Commit 342be5f0702f4f297b2a4894ad51fba1452328a3
Exists in
master
and in
29 other branches
Merge branch 'patch-custom-locales' into 'master'
Custom locales for personalized internationalization Support for custom locales for hosted environments using the multitenancy support and noosfero domains. There was a previous commit for custom locales based on environment (see AI3113 and MR195), but we also need it to work with a multitenancy system. See merge request !376
Showing
4 changed files
with
53 additions
and
1 deletions
Show diff stats
@@ -0,0 +1,29 @@ | @@ -0,0 +1,29 @@ | ||
1 | +Using custom locales | ||
2 | +==================== | ||
3 | + | ||
4 | +Personalized translations go into the `config/custom_locales/` directory. | ||
5 | +Custom locales can be identified by the rails environment, schema name in a | ||
6 | +multitenancy setup or domain name until the first dot (e.g env1.coop.br for the | ||
7 | +example below). | ||
8 | + | ||
9 | +Currently, the only filename prefix for the localization file which is | ||
10 | +processed is "environment". For instance, a POT file would be called | ||
11 | +"environment.pot". | ||
12 | + | ||
13 | +The structure of an environment named env1 with custom translations for both | ||
14 | +Portuguese and Spanish and an environment named env2 with custom Russian | ||
15 | +translation would be: | ||
16 | + | ||
17 | + config/ | ||
18 | + custom_locales/ | ||
19 | + env1/ | ||
20 | + environment.pot | ||
21 | + pt/ | ||
22 | + environment.po | ||
23 | + es/ | ||
24 | + environment.po | ||
25 | + env2/ | ||
26 | + environment.pot | ||
27 | + ru/ | ||
28 | + environment.po | ||
29 | + |
app/controllers/application_controller.rb
@@ -127,6 +127,9 @@ class ApplicationController < ActionController::Base | @@ -127,6 +127,9 @@ class ApplicationController < ActionController::Base | ||
127 | 127 | ||
128 | # TODO: move this logic somewhere else (Domain class?) | 128 | # TODO: move this logic somewhere else (Domain class?) |
129 | def detect_stuff_by_domain | 129 | def detect_stuff_by_domain |
130 | + # Sets text domain based on request host for custom internationalization | ||
131 | + FastGettext.text_domain = Domain.custom_locale(request.host) | ||
132 | + | ||
130 | @domain = Domain.find_by_name(request.host) | 133 | @domain = Domain.find_by_name(request.host) |
131 | if @domain.nil? | 134 | if @domain.nil? |
132 | @environment = Environment.default | 135 | @environment = Environment.default |
app/models/domain.rb
@@ -92,4 +92,11 @@ class Domain < ActiveRecord::Base | @@ -92,4 +92,11 @@ class Domain < ActiveRecord::Base | ||
92 | @hosting = {} | 92 | @hosting = {} |
93 | end | 93 | end |
94 | 94 | ||
95 | + # Detects a domain's custom text domain chain if available based on a domain | ||
96 | + # served on multitenancy configuration or a registered domain. | ||
97 | + def self.custom_locale(domainname) | ||
98 | + domain = Noosfero::MultiTenancy.mapping[domainname] || domainname[/(.*?)\./,1] | ||
99 | + FastGettext.translation_repositories.keys.include?(domain) ? domain : FastGettext.default_text_domain | ||
100 | + end | ||
101 | + | ||
95 | end | 102 | end |
lib/noosfero/i18n.rb
@@ -9,7 +9,8 @@ class Object | @@ -9,7 +9,8 @@ class Object | ||
9 | end | 9 | end |
10 | 10 | ||
11 | 11 | ||
12 | -custom_locale_dir = Rails.root.join('custom_locales', Rails.env) | 12 | +# Adds custom locales for a whole environment |
13 | +custom_locale_dir = Rails.root.join('config', 'custom_locales', Rails.env) | ||
13 | repos = [] | 14 | repos = [] |
14 | if File.exists?(custom_locale_dir) | 15 | if File.exists?(custom_locale_dir) |
15 | repos << FastGettext::TranslationRepository.build('environment', :type => 'po', :path => custom_locale_dir) | 16 | repos << FastGettext::TranslationRepository.build('environment', :type => 'po', :path => custom_locale_dir) |
@@ -29,3 +30,15 @@ end | @@ -29,3 +30,15 @@ end | ||
29 | 30 | ||
30 | FastGettext.add_text_domain 'noosfero', :type => :chain, :chain => repos | 31 | FastGettext.add_text_domain 'noosfero', :type => :chain, :chain => repos |
31 | FastGettext.default_text_domain = 'noosfero' | 32 | FastGettext.default_text_domain = 'noosfero' |
33 | + | ||
34 | +# Adds custom locales for specific domains; Domains are identified by the | ||
35 | +# sequence before the first dot, while tenants are identified by schema name | ||
36 | +hosted_environments = Noosfero::MultiTenancy.mapping.values | ||
37 | +hosted_environments += Domain.all.map { |domain| domain.name[/(.*?)\./,1] } if Domain.table_exists? | ||
38 | + | ||
39 | +hosted_environments.uniq.each do |env| | ||
40 | + custom_locale_dir = Rails.root.join('config', 'custom_locales', env) | ||
41 | + if File.exists?(custom_locale_dir) | ||
42 | + FastGettext.add_text_domain(env, :type => :chain, :chain => [FastGettext::TranslationRepository.build('environment', :type => 'po', :path => custom_locale_dir)] + repos) | ||
43 | + end | ||
44 | +end |