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 @@ |
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 | 127 | |
128 | 128 | # TODO: move this logic somewhere else (Domain class?) |
129 | 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 | 133 | @domain = Domain.find_by_name(request.host) |
131 | 134 | if @domain.nil? |
132 | 135 | @environment = Environment.default | ... | ... |
app/models/domain.rb
... | ... | @@ -92,4 +92,11 @@ class Domain < ActiveRecord::Base |
92 | 92 | @hosting = {} |
93 | 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 | 102 | end | ... | ... |
lib/noosfero/i18n.rb
... | ... | @@ -9,7 +9,8 @@ class Object |
9 | 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 | 14 | repos = [] |
14 | 15 | if File.exists?(custom_locale_dir) |
15 | 16 | repos << FastGettext::TranslationRepository.build('environment', :type => 'po', :path => custom_locale_dir) |
... | ... | @@ -29,3 +30,15 @@ end |
29 | 30 | |
30 | 31 | FastGettext.add_text_domain 'noosfero', :type => :chain, :chain => repos |
31 | 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 | ... | ... |