ixtlan-gettext 0.1.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.
- data/Gemfile +2 -0
- data/README.md +75 -0
- data/agpl-3.0.txt +661 -0
- data/lib/fast_gettext/translation_repository/ixtlan.rb +65 -0
- data/lib/fast_gettext/translation_repository/ixtlan.rb~ +61 -0
- data/lib/ixtlan-gettext.rb +22 -0
- data/lib/ixtlan-gettext.rb~ +4 -0
- data/lib/ixtlan/gettext.rb +22 -0
- data/lib/ixtlan/gettext.rb~ +4 -0
- data/lib/ixtlan/gettext/controller.rb +17 -0
- data/lib/ixtlan/gettext/controller.rb~ +16 -0
- data/lib/ixtlan/gettext/crawler.rb +61 -0
- data/lib/ixtlan/gettext/crawler.rb~ +69 -0
- data/lib/ixtlan/gettext/locale.rb~ +71 -0
- data/lib/ixtlan/gettext/locale_resource.rb +46 -0
- data/lib/ixtlan/gettext/locale_resource.rb~ +20 -0
- data/lib/ixtlan/gettext/locale_serializer.rb +16 -0
- data/lib/ixtlan/gettext/manager.rb +57 -0
- data/lib/ixtlan/gettext/manager.rb~ +61 -0
- data/lib/ixtlan/gettext/models.rb +90 -0
- data/lib/ixtlan/gettext/models.rb~ +57 -0
- data/lib/ixtlan/gettext/rails_controller.rb~ +10 -0
- data/lib/ixtlan/gettext/railtie.rb +33 -0
- data/lib/ixtlan/gettext/railtie.rb~ +15 -0
- data/lib/ixtlan/gettext/translation.rake +37 -0
- data/lib/ixtlan/gettext/translation.rake~ +23 -0
- data/lib/ixtlan/gettext/translation_models.rb~ +71 -0
- data/lib/ixtlan/railtie.rb~ +17 -0
- data/spec/manager_spec.rb +120 -0
- data/spec/manager_spec.rb~ +68 -0
- data/spec/sync_spec.rb~ +83 -0
- metadata +236 -0
@@ -0,0 +1,20 @@
|
|
1
|
+
module Ixtlan
|
2
|
+
module Gettext
|
3
|
+
class Locale
|
4
|
+
include DataMapper::Resource
|
5
|
+
|
6
|
+
def self.storage_name(arg)
|
7
|
+
'gettext_locales'
|
8
|
+
end
|
9
|
+
|
10
|
+
property :id, Serial
|
11
|
+
property :code, String, :unique=>true, :required => true, :format => /^[a-z][a-z](_[A-Z][A-Z])?$/, :length => 5
|
12
|
+
|
13
|
+
property :updated_at, DateTime, :required => true, :lazy => true
|
14
|
+
|
15
|
+
# do not record timestamps since they are set from outside
|
16
|
+
def set_timestamps_on_save
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
#
|
2
|
+
# ixtlan_gettext - helper to use fast_gettext with datamapper/ixtlan
|
3
|
+
# Copyright (C) 2012 Christian Meier
|
4
|
+
#
|
5
|
+
# This file is part of ixtlan_gettext.
|
6
|
+
#
|
7
|
+
# ixtlan_gettext is free software: you can redistribute it and/or modify
|
8
|
+
# it under the terms of the GNU Affero General Public License as
|
9
|
+
# published by the Free Software Foundation, either version 3 of the
|
10
|
+
# License, or (at your option) any later version.
|
11
|
+
#
|
12
|
+
# ixtlan_gettext is distributed in the hope that it will be useful,
|
13
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
14
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
15
|
+
# GNU Affero General Public License for more details.
|
16
|
+
#
|
17
|
+
# You should have received a copy of the GNU Affero General Public License
|
18
|
+
# along with ixtlan_gettext. If not, see <http://www.gnu.org/licenses/>.
|
19
|
+
#
|
20
|
+
require 'fast_gettext'
|
21
|
+
module Ixtlan
|
22
|
+
module Gettext
|
23
|
+
class Manager
|
24
|
+
|
25
|
+
DEFAULT = 'default'
|
26
|
+
|
27
|
+
def initialize
|
28
|
+
@default_repo = build( DEFAULT )
|
29
|
+
FastGettext.default_text_domain = DEFAULT
|
30
|
+
FastGettext.add_text_domain DEFAULT, :type => :ixtlan
|
31
|
+
end
|
32
|
+
|
33
|
+
def use( locale, name = DEFAULT )
|
34
|
+
unless FastGettext.translation_repositories.key?( name )
|
35
|
+
repos = [ build( "#{name}" ), @default_repo ]
|
36
|
+
FastGettext.add_text_domain name, :type=>:chain, :chain=> repos
|
37
|
+
end
|
38
|
+
FastGettext.set_locale(locale)
|
39
|
+
FastGettext.text_domain = name
|
40
|
+
end
|
41
|
+
|
42
|
+
def flush_caches(text_domain = nil)
|
43
|
+
if text_domain
|
44
|
+
(FastGettext.caches[text_domain] || {}).clear
|
45
|
+
else
|
46
|
+
FastGettext.caches.clear
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
private
|
51
|
+
|
52
|
+
def build( name )
|
53
|
+
FastGettext::TranslationRepository.build( name, :type => :ixtlan )
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
module Ixtlan
|
2
|
+
module Gettext
|
3
|
+
class Repository
|
4
|
+
|
5
|
+
def initialize(name,options={})
|
6
|
+
@domain = Ixtlan::UserManagement::Domain.first( :name => name )
|
7
|
+
raise "domain not found: #{name}" unless @domain
|
8
|
+
end
|
9
|
+
|
10
|
+
@@seperator = '||||' # string that seperates multiple plurals
|
11
|
+
def self.seperator=(sep);@@seperator = sep;end
|
12
|
+
def self.seperator;@@seperator;end
|
13
|
+
|
14
|
+
def available_locales
|
15
|
+
[]
|
16
|
+
end
|
17
|
+
|
18
|
+
def pluralisation_rule
|
19
|
+
nil
|
20
|
+
end
|
21
|
+
|
22
|
+
def [](key)
|
23
|
+
Translation.first(TranslationKey.name => key, Locale.code => FastGettext.locale, :domain => @domain)
|
24
|
+
end
|
25
|
+
|
26
|
+
def plural(*args)
|
27
|
+
if translation = self[ args*self.class.seperator ]
|
28
|
+
translation.to_s.split(self.class.seperator)
|
29
|
+
else
|
30
|
+
[]
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
class Manager
|
36
|
+
|
37
|
+
DEFAULT = 'default'
|
38
|
+
|
39
|
+
def initialize
|
40
|
+
FastGettext.default_text_domain = DEFAULT
|
41
|
+
@default_repo = build( DEFAULT )
|
42
|
+
end
|
43
|
+
|
44
|
+
def use( locale, name = DEFAULT )
|
45
|
+
unless FastGettext.translation_repositories.key?( name )
|
46
|
+
repos = [ build( "#{name}-overlay" ), @default_repo ]
|
47
|
+
FastGettext.add_text_domain name, :type=>:chain, :chain=> repos
|
48
|
+
end
|
49
|
+
FastGettext.set_locale(locale)
|
50
|
+
FastGettext.text_domain = name
|
51
|
+
end
|
52
|
+
|
53
|
+
private
|
54
|
+
|
55
|
+
def build( name )
|
56
|
+
FastGettext::TranslationRepository.build( name,
|
57
|
+
:type => Manager.to_s )
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
@@ -0,0 +1,90 @@
|
|
1
|
+
#
|
2
|
+
# ixtlan_gettext - helper to use fast_gettext with datamapper/ixtlan
|
3
|
+
# Copyright (C) 2012 Christian Meier
|
4
|
+
#
|
5
|
+
# This file is part of ixtlan_gettext.
|
6
|
+
#
|
7
|
+
# ixtlan_gettext is free software: you can redistribute it and/or modify
|
8
|
+
# it under the terms of the GNU Affero General Public License as
|
9
|
+
# published by the Free Software Foundation, either version 3 of the
|
10
|
+
# License, or (at your option) any later version.
|
11
|
+
#
|
12
|
+
# ixtlan_gettext is distributed in the hope that it will be useful,
|
13
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
14
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
15
|
+
# GNU Affero General Public License for more details.
|
16
|
+
#
|
17
|
+
# You should have received a copy of the GNU Affero General Public License
|
18
|
+
# along with ixtlan_gettext. If not, see <http://www.gnu.org/licenses/>.
|
19
|
+
#
|
20
|
+
require 'ixtlan/gettext/locale_resource'
|
21
|
+
require 'ixtlan/user_management/domain_resource'
|
22
|
+
|
23
|
+
module Ixtlan
|
24
|
+
module Gettext
|
25
|
+
class TranslationKey
|
26
|
+
include DataMapper::Resource
|
27
|
+
|
28
|
+
def self.storage_name(arg)
|
29
|
+
'gettext_keys'
|
30
|
+
end
|
31
|
+
|
32
|
+
property :id, Serial
|
33
|
+
property :name, Text, :unique=>true, :required => true, :length => 4096
|
34
|
+
|
35
|
+
property :updated_at, DateTime, :required => true, :lazy => true
|
36
|
+
|
37
|
+
def self.update_all(keys)
|
38
|
+
ids = keys.collect do |k|
|
39
|
+
k.save
|
40
|
+
k.id
|
41
|
+
end
|
42
|
+
all(:id.not => ids).destroy!
|
43
|
+
end
|
44
|
+
|
45
|
+
def self.translation(key, locale)
|
46
|
+
Translation.first(TranslationKey.name => key, Locale.code => locale)
|
47
|
+
end
|
48
|
+
|
49
|
+
def self.available_locales
|
50
|
+
Translation.all(:fields => [:locale_id], :unique => true).collect do |t|
|
51
|
+
t.locale
|
52
|
+
end
|
53
|
+
end
|
54
|
+
# do not record timestamps since they are set from outside
|
55
|
+
def set_timestamps_on_save
|
56
|
+
end
|
57
|
+
end
|
58
|
+
class Translation
|
59
|
+
include DataMapper::Resource
|
60
|
+
|
61
|
+
def self.storage_name(arg)
|
62
|
+
'gettext_texts'
|
63
|
+
end
|
64
|
+
|
65
|
+
belongs_to :translation_key, TranslationKey.to_s, :key => true
|
66
|
+
belongs_to :locale, Locale.to_s,:key => true
|
67
|
+
belongs_to :domain, Ixtlan::UserManagement::Domain.to_s, :required => false, :key => true
|
68
|
+
|
69
|
+
property :text, Text, :length => 4096
|
70
|
+
|
71
|
+
property :updated_at, DateTime, :required => true, :lazy => true
|
72
|
+
|
73
|
+
# do not record timestamps since they are set from outside
|
74
|
+
def set_timestamps_on_save
|
75
|
+
end
|
76
|
+
end
|
77
|
+
class Flush
|
78
|
+
# used local flush service
|
79
|
+
|
80
|
+
def self.trigger(rest)
|
81
|
+
begin
|
82
|
+
rest.retrieve( self.class )
|
83
|
+
rescue => e
|
84
|
+
warn "error sending flush trigger for gettext #{e.message}"
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
require 'ixtlan/gettext/locale'
|
2
|
+
|
3
|
+
module Ixtlan
|
4
|
+
module Gettext
|
5
|
+
class TranslationKey
|
6
|
+
include DataMapper::Resource
|
7
|
+
|
8
|
+
def self.storage_name(arg)
|
9
|
+
'gettext_keys'
|
10
|
+
end
|
11
|
+
|
12
|
+
property :id, Serial
|
13
|
+
property :name, String, :unique=>true, :required => true
|
14
|
+
|
15
|
+
property :updated_at, DateTime, :required => true, :lazy => true
|
16
|
+
|
17
|
+
def self.update_all(keys)
|
18
|
+
ids = keys.collect do |k|
|
19
|
+
k.save
|
20
|
+
k.id
|
21
|
+
end
|
22
|
+
all(:id.not => ids).destroy!
|
23
|
+
end
|
24
|
+
|
25
|
+
def self.translation(key, locale)
|
26
|
+
TranslationText.first(TranslationKey.name => key, Locale.code => locale)
|
27
|
+
end
|
28
|
+
|
29
|
+
def self.available_locales
|
30
|
+
Translation.all(:fields => [:locale_id], :unique => true).collect do |t|
|
31
|
+
t.locale
|
32
|
+
end
|
33
|
+
end
|
34
|
+
# do not record timestamps since they are set from outside
|
35
|
+
def set_timestamps_on_save
|
36
|
+
end
|
37
|
+
end
|
38
|
+
class TranslationText
|
39
|
+
include DataMapper::Resource
|
40
|
+
|
41
|
+
def self.storage_name(arg)
|
42
|
+
'gettext_texts'
|
43
|
+
end
|
44
|
+
|
45
|
+
belongs_to :locale, Locale.to_s,:key => true
|
46
|
+
belongs_to :translation_key, TranslationKey.to_s, :key => true
|
47
|
+
|
48
|
+
property :text, String, :required => true
|
49
|
+
|
50
|
+
property :updated_at, DateTime, :required => true, :lazy => true
|
51
|
+
|
52
|
+
# do not record timestamps since they are set from outside
|
53
|
+
def set_timestamps_on_save
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
#
|
2
|
+
# ixtlan_gettext - helper to use fast_gettext with datamapper/ixtlan
|
3
|
+
# Copyright (C) 2012 Christian Meier
|
4
|
+
#
|
5
|
+
# This file is part of ixtlan_gettext.
|
6
|
+
#
|
7
|
+
# ixtlan_gettext is free software: you can redistribute it and/or modify
|
8
|
+
# it under the terms of the GNU Affero General Public License as
|
9
|
+
# published by the Free Software Foundation, either version 3 of the
|
10
|
+
# License, or (at your option) any later version.
|
11
|
+
#
|
12
|
+
# ixtlan_gettext is distributed in the hope that it will be useful,
|
13
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
14
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
15
|
+
# GNU Affero General Public License for more details.
|
16
|
+
#
|
17
|
+
# You should have received a copy of the GNU Affero General Public License
|
18
|
+
# along with ixtlan_gettext. If not, see <http://www.gnu.org/licenses/>.
|
19
|
+
#
|
20
|
+
require 'ixtlan/gettext/manager'
|
21
|
+
module Ixtlan
|
22
|
+
module Gettext
|
23
|
+
class Railtie < Rails::Railtie
|
24
|
+
|
25
|
+
config.gettext = Ixtlan::Gettext::Manager.new
|
26
|
+
|
27
|
+
rake_tasks do
|
28
|
+
load 'ixtlan/gettext/translation.rake'
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'ixtlan/remote/rest'
|
2
|
+
require 'ixtlan/gettext/manager'
|
3
|
+
module Ixtlan
|
4
|
+
|
5
|
+
class RemoteGettextRailtie < Rails::Railtie
|
6
|
+
|
7
|
+
config.rest = Ixtlan::Remote::Rest.new
|
8
|
+
|
9
|
+
config.gettext = Ixtlan::Gettext::Manager.new
|
10
|
+
|
11
|
+
rake_tasks do
|
12
|
+
load 'ixtlan/gettext/translation.rake'
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
# -*- mode: ruby -*-
|
2
|
+
|
3
|
+
require 'ixtlan/gettext/crawler'
|
4
|
+
|
5
|
+
namespace :ixtlan do
|
6
|
+
|
7
|
+
namespace :gettext do
|
8
|
+
desc 'crawls the local filesystem for _(...) method calls and dumps them to the console'
|
9
|
+
task :keys => :environment do
|
10
|
+
print "\t"
|
11
|
+
puts Ixtlan::Gettext::Crawler.crawl.join( "\n\t" )
|
12
|
+
end
|
13
|
+
|
14
|
+
task :update => :environment do
|
15
|
+
puts 'crawling files . . .'
|
16
|
+
data = {:translation_keys => Ixtlan::Gettext::Crawler.crawl }
|
17
|
+
puts "sending #{data[:translation_keys].size} keys to gettext server . . ."
|
18
|
+
keys = Rails.application.config.rest.update(Ixtlan::Gettext::TranslationKey, data)
|
19
|
+
puts "updating local database with #{keys.size} keys . . ."
|
20
|
+
Ixtlan::Gettext::TranslationKey.update_all(keys)
|
21
|
+
end
|
22
|
+
|
23
|
+
task :commit => :environment do
|
24
|
+
keys = Rails.application.config.rest.update(Ixtlan::Gettext::TranslationKey, :commit, nil)
|
25
|
+
puts "updating local database with #{keys.size} keys . . ."
|
26
|
+
Ixtlan::Gettext::TranslationKey.update_all(keys)
|
27
|
+
end
|
28
|
+
|
29
|
+
task :rollback => :environment do
|
30
|
+
keys = Rails.application.config.rest.update(Ixtlan::Gettext::TranslationKey, :rollback, nil)
|
31
|
+
puts "updating local database with #{keys.size} keys . . ."
|
32
|
+
Ixtlan::Gettext::TranslationKey.update_all(keys)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
37
|
+
# vim: syntax=Ruby
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# --*-- ruby-mode --*--
|
2
|
+
namespace :ixtlan do
|
3
|
+
|
4
|
+
namespace :translations do
|
5
|
+
desc 'crawls the local filesystem for _(...) method calls and sends the collected translation keys to the remote service'
|
6
|
+
task :update => :environment do
|
7
|
+
data = {:translation_keys => ENV['KEYS'].split(/,/)}
|
8
|
+
keys = Rails.application.config.restserver.update(data)
|
9
|
+
Ixtlan::Gettext::TranslationKey.update_all(keys)
|
10
|
+
end
|
11
|
+
|
12
|
+
task :commit => :environment do
|
13
|
+
keys = Rails.application.config.restserver.update(:translation_keys, :commit)
|
14
|
+
Ixtlan::Gettext::TranslationKey.update_all(keys)
|
15
|
+
end
|
16
|
+
|
17
|
+
task :rollback => :environment do
|
18
|
+
keys = Rails.application.config.restserver.update(:translation_keys, :rollback)
|
19
|
+
Ixtlan::Gettext::TranslationKey.update_all(keys)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
module Ixtlan
|
2
|
+
module Gettext
|
3
|
+
class TranslationKey
|
4
|
+
include DataMapper::Resource
|
5
|
+
|
6
|
+
def self.storage_name(arg)
|
7
|
+
'gettext_keys'
|
8
|
+
end
|
9
|
+
|
10
|
+
property :id, Serial
|
11
|
+
property :name, String, :unique=>true, :required => true
|
12
|
+
|
13
|
+
property :updated_at, DateTime, :required => true, :lazy => true
|
14
|
+
|
15
|
+
def self.update_all(keys)
|
16
|
+
ids = keys.collect do |k|
|
17
|
+
k.save
|
18
|
+
k.id
|
19
|
+
end
|
20
|
+
all(:id.not => ids).destroy!
|
21
|
+
end
|
22
|
+
|
23
|
+
def self.translation(key, locale)
|
24
|
+
TranslationText.first(TranslationKey.name => key, Locale.code => locale)
|
25
|
+
end
|
26
|
+
|
27
|
+
def self.available_locales
|
28
|
+
Translation.all(:fields => [:locale_id], :unique => true).collect do |t|
|
29
|
+
t.locale
|
30
|
+
end
|
31
|
+
end
|
32
|
+
# do not record timestamps since they are set from outside
|
33
|
+
def set_timestamps_on_save
|
34
|
+
end
|
35
|
+
end
|
36
|
+
class TranslationText
|
37
|
+
include DataMapper::Resource
|
38
|
+
|
39
|
+
def self.storage_name(arg)
|
40
|
+
'gettext_texts'
|
41
|
+
end
|
42
|
+
|
43
|
+
belongs_to :locale, Locale.to_s,:key => true
|
44
|
+
belongs_to :translation_key, TranslationKey.to_s, :key => true
|
45
|
+
|
46
|
+
property :text, String, :required => true
|
47
|
+
|
48
|
+
property :updated_at, DateTime, :required => true, :lazy => true
|
49
|
+
|
50
|
+
# do not record timestamps since they are set from outside
|
51
|
+
def set_timestamps_on_save
|
52
|
+
end
|
53
|
+
end
|
54
|
+
class Locale
|
55
|
+
include DataMapper::Resource
|
56
|
+
|
57
|
+
def self.storage_name(arg)
|
58
|
+
'gettext_locales'
|
59
|
+
end
|
60
|
+
|
61
|
+
property :id, Serial
|
62
|
+
property :code, String, :unique=>true, :required => true, :format => /^[a-z][a-z](_[A-Z][A-Z])?$/, :length => 5
|
63
|
+
|
64
|
+
property :updated_at, DateTime, :required => true, :lazy => true
|
65
|
+
|
66
|
+
# do not record timestamps since they are set from outside
|
67
|
+
def set_timestamps_on_save
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|