merb_global 0.0.3.1 → 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
data/HISTORY CHANGED
@@ -1,3 +1,7 @@
1
+ === 0.0.4
2
+ * Changed database format (to allow importing/exporting)
3
+ * Added importing/exporting (EXPERIMENTAL)
4
+
1
5
  === 0.0.3
2
6
  * New Plural engine
3
7
 
data/Rakefile CHANGED
@@ -5,7 +5,7 @@ require 'spec/rake/spectask'
5
5
 
6
6
  PLUGIN = "merb_global"
7
7
  NAME = "merb_global"
8
- GEM_VERSION = "0.0.3.1"
8
+ GEM_VERSION = "0.0.4"
9
9
  AUTHORS = ["Alex Coles", "Maciej Piechotka"]
10
10
  EMAIL = "alex@alexcolesportfolio.com"
11
11
  HOMEPAGE = "http://trac.ikonoklastik.com/merb_global/"
@@ -42,7 +42,7 @@ end
42
42
 
43
43
  desc "Install merb_global"
44
44
  task :install => [:package] do
45
- sh %{#{SUDO} gem install pkg/#{NAME}-#{VERSION}}
45
+ sh %{#{SUDO} gem install pkg/#{NAME}-#{GEM_VERSION}}
46
46
  end
47
47
 
48
48
  Rake::RDocTask.new do |rd|
@@ -5,6 +5,7 @@ class AddTranslationsMigration < ActiveRecord::Migration
5
5
  def self.up
6
6
  create_table :merb_global_languages do |t|
7
7
  t.string :name, :limit => 16
8
+ t.integer :nplural
8
9
  t.string :plural, :size => 128
9
10
  end
10
11
  add_index :merb_global_languages, :name, :unique => true
@@ -13,9 +14,10 @@ class AddTranslationsMigration < ActiveRecord::Migration
13
14
  :msgid_hash,
14
15
  :msgstr_index] do |t|
15
16
  t.integer :language_id, :null => false
16
- t.integer :msgid_hash, :null => false
17
+ t.text :msgid, :null => false
18
+ t.text :msgid_plural
17
19
  t.text :msgstr, :null => false
18
- t.integer :msgstr_index, :null => false
20
+ t.integer :msgstr_index, :null => true
19
21
  end
20
22
  end
21
23
  def self.down
data/lib/merb_global.rb CHANGED
@@ -4,5 +4,5 @@ if defined? Merb::Plugins
4
4
  require Pathname(__FILE__).dirname.expand_path + 'merb_global/base'
5
5
  require Pathname(__FILE__).dirname.expand_path + 'merb_global/controller'
6
6
 
7
- Merb::Plugins.add_rakefiles 'merb_global/rake'
7
+ Merb::Plugins.add_rakefiles(Pathname(__FILE__).dirname.expand_path + 'merb_global/merbrake')
8
8
  end
@@ -2,6 +2,7 @@ require 'merb_global/config'
2
2
  require 'merb_global/plural'
3
3
  require 'merb_global/provider'
4
4
  require 'merb_global/providers'
5
+ require 'merb_global/transfer'
5
6
 
6
7
  module Merb
7
8
  module Global
@@ -7,4 +7,18 @@ namespace :merb_global do
7
7
  task :migration => :merb_start do
8
8
  Merb::Global::Providers.provider.create!
9
9
  end
10
+ desc 'Transfer the translations from one provider to another'
11
+ task :transfer => :merb_start do
12
+ from = Merb::Global.config 'source', 'gettext'
13
+ into = Merb::Global.config 'provider', 'gettext'
14
+ if from == 'gettext' and into == 'gettext'
15
+ # Change po into mo files
16
+ elsif from == into
17
+ Merb.logger.error 'Tried transfer from and into the same provider'
18
+ else
19
+ from = Merb::Global::Providers[from]
20
+ into = Merb::Global::Providers[into]
21
+ Merb::Global::Provider.transfer from, into
22
+ end
23
+ end
10
24
  end
@@ -3,7 +3,11 @@ module Merb
3
3
  # Merb-global is able to store the translations in different types of
4
4
  # storage. An interface betwean merb-global and those storages are
5
5
  # providers.
6
- class Provider
6
+ #
7
+ # Please note that it is not required to include this module - despite it
8
+ # is recomended both as a documentation part and the more customized
9
+ # error messages.
10
+ module Provider
7
11
  # call-seq:
8
12
  # translate_to(singular, plural, opts) => translated
9
13
  #
@@ -1,12 +1,22 @@
1
1
  module Merb
2
2
  module Global
3
3
  module Providers
4
- @@provider_name = lambda do
5
- Merb::Global.config :provider, 'gettext'
4
+ @@providers = {}
5
+ ##
6
+ # Creates a provider and/or returns already created one
7
+ #
8
+ # ==== Parames
9
+ # provider<~to_s,~to_sym>:: A name of provider
10
+ #
11
+ # ==== Returns
12
+ # provider<Provider>:: A new provider
13
+ def self.[](provider)
14
+ unless @@providers.include? provider.to_sym
15
+ require 'merb_global/providers/' + provider
16
+ klass = "Merb::Global::Providers::#{provider.camel_case}"
17
+ @@providers[provider.to_sym] = eval "#{klass}.new"
6
18
  end
7
- @@provider_loading = lambda do |provider|
8
- require 'merb_global/providers/' + provider
9
- @@provider = eval "Merb::Global::Providers::#{provider.camel_case}.new"
19
+ @@providers[provider.to_sym]
10
20
  end
11
21
 
12
22
  # call-seq:
@@ -35,7 +45,7 @@ module Merb
35
45
  # ==== Returns
36
46
  # provider<Provider>:: Returns provider
37
47
  def self.provider
38
- @@provider ||= @@provider_loading.call @@provider_name.call
48
+ @@provider ||= self[Merb::Global.config(:provider, 'gettext')]
39
49
  end
40
50
  end
41
51
  end
@@ -8,13 +8,21 @@ require 'merb_global/plural'
8
8
  module Merb
9
9
  module Global
10
10
  module Providers
11
- class ActiveRecord < Merb::Global::Provider #:nodoc: all
11
+ class ActiveRecord #:nodoc: all
12
+ include Merb::Global::Provider
13
+ include Merb::Global::Provider::Importer
14
+ include Merb::Global::Provider::Exporter
15
+
12
16
  def translate_to(singular, plural, opts)
13
17
  language = Language.find :first,
14
18
  :conditions => {:name => opts[:lang]}
15
19
  unless language.nil?
16
- n = Plural.which_form opts[:n], language.plural
17
- translation = Translation.find [language.id, singular.hash, n]
20
+ unless plural.nil?
21
+ n = Plural.which_form opts[:n], language.plural
22
+ translation = Translation.find [language.id, singular, n]
23
+ else
24
+ translation = Translation.find [language.id, singular, nil]
25
+ end
18
26
  return translation.msgstr
19
27
  end rescue nil
20
28
  return opts[:n] > 1 ? plural : singular # Fallback if not in database
@@ -49,13 +57,59 @@ module Merb
49
57
  # "(#{except.join(',')})"])
50
58
  end
51
59
 
60
+ def import(exporter, export_data)
61
+ Language.transaction do
62
+ Translation.transaction do
63
+ Language.find(:all).each do |language|
64
+ exporter.export_language export_data, language.name,
65
+ language.nplural,
66
+ language.plural do |lang|
67
+ language.translations.each do |translation|
68
+ exporter.export_string lang, translation.msgid,
69
+ translation.msgid_plural,
70
+ translation.msgstr_index,
71
+ translation.msgstr
72
+ end
73
+ end
74
+ end
75
+ end
76
+ end
77
+ end
78
+
79
+ def export
80
+ Language.transaction do
81
+ Translation.transaction do
82
+ Language.delete_all
83
+ Translation.delete_all
84
+ yield nil
85
+ end
86
+ end
87
+ end
88
+
89
+ def export_language(export_data, language, nplural, plural)
90
+ yield Language.create!(:language => language, :nplural => nplural,
91
+ :plural => plural).id
92
+ end
93
+
94
+ def export_string(language_id, msgid, msgid_plural,
95
+ msgstr, msgstr_index)
96
+ Translation.create! :language_id => language_id,
97
+ :msgid => msgid,
98
+ :msgid_plural => msgid_plural,
99
+ :msgstr => msgstr,
100
+ :msgstr_index => msgstr_index
101
+ end
102
+
52
103
  class Language < ::ActiveRecord::Base
53
104
  set_table_name :merb_global_languages
105
+ has_many :translations,
106
+ :class_name =>
107
+ "::Merb::Global::Providers::ActiveRecord::Translation"
54
108
  end
55
109
 
56
110
  class Translation < ::ActiveRecord::Base
57
111
  set_table_name :merb_global_translations
58
- set_primary_keys :language_id, :msgid_hash, :msgstr_index
112
+ set_primary_keys :language_id, :msgid, :msgstr_index
59
113
  end
60
114
  end
61
115
  end
@@ -6,14 +6,24 @@ module Merb
6
6
  module Global
7
7
  module Providers
8
8
  class DataMapper #:nodoc: all
9
+ include Merb::Global::Provider
10
+ include Merb::Global::Provider::Importer
11
+ include Merb::Global::Provider::Exporter
12
+
9
13
  def translate_to(singular, plural, opts)
10
14
  # I hope it's from MemCache
11
15
  language = Language.first :name => opts[:lang]
12
16
  unless language.nil?
13
- n = Plural.which_form opts[:n], language.plural
14
- translation = Translation.first :language_id => language.id,
15
- :msgid_hash => singular.hash,
16
- :msgstr_index => n
17
+ unless plural.nil?
18
+ n = Plural.which_form opts[:n], language.plural
19
+ translation = Translation.first :language_id => language.id,
20
+ :msgid => singular,
21
+ :msgstr_index => n
22
+ else
23
+ translation = Translation.first :language_id => language.id,
24
+ :msgid => singular,
25
+ :msgstr_index => nil
26
+ end
17
27
  return translation.msgstr unless translation.nil?
18
28
  end
19
29
  # Fallback if not in database
@@ -33,14 +43,62 @@ module Merb
33
43
  Language.first(:name.not => except).name
34
44
  end
35
45
 
46
+ def import(exporter, export_data)
47
+ ::DataMapper::Transaction.new(Language, Translation) do
48
+ Language.all.each do |language|
49
+ exporter.export_language export_data, language.name,
50
+ language.nplural,
51
+ language.plural do |lang|
52
+ language.translations.each do |translation|
53
+ exporter.export_string lang, translation.msgid,
54
+ translation.msgid_plural,
55
+ translation.msgstr_index,
56
+ translation.msgstr
57
+ end
58
+ end
59
+ end
60
+ end
61
+ end
62
+
63
+ def export
64
+ ::DataMapper::Transaction.new(Language, Translation) do
65
+ Language.all.each {|language| language.destroy}
66
+ Translation.all.each {|translation| translation.destroy}
67
+ yield nil
68
+ end
69
+ end
70
+
71
+ def export_language(export_data, language, nplural, plural)
72
+ lang = Language.new :language => language, :nplural => nplural,
73
+ :plural => plural
74
+ lang.save
75
+ raise if lang.new_record?
76
+ yield lang.id
77
+ end
78
+
79
+ def export_string(language_id, msgid, msgid_plural,
80
+ msgstr, msgstr_index)
81
+ trans = Translation.new :language_id => language_id,
82
+ :msgid => msgid,
83
+ :msgid_plural => msgid_plural,
84
+ :msgstr => msgstr,
85
+ :msgstr_index => msgstr_index
86
+ trans.save
87
+ raise if lang.new_record?
88
+ end
89
+
36
90
  # When table structure becomes stable it *should* be documented
37
91
  class Language
38
92
  include ::DataMapper::Resource
39
93
  storage_names[:default] = 'merb_global_languages'
40
94
  property :id, Integer, :serial => true
41
95
  property :name, String, :unique_index => true
96
+ property :nplural, Integer
42
97
  property :plural, Text, :lazy => false
43
98
  # validates_is_unique :name
99
+ has n, :translations,
100
+ :class_name => "Merb::Global::Providers::DataMapper::Translation",
101
+ :child_key => [:language_id]
44
102
  end
45
103
 
46
104
  class Translation
@@ -53,10 +111,11 @@ module Merb
53
111
  # - it may be wrong optimalisation
54
112
  # As far I'll leave it in this form. If anybody could measure the
55
113
  # speed of both methods it will be appreciate.
56
- property :msgid_hash, Integer, :nullable => false, :key => true
114
+ property :msgid, Text, :nullable => false, :key => true
115
+ property :msgid_plural, Text, :lazy => true
57
116
  property :msgstr, Text, :nullable => false, :lazy => false
58
- property :msgstr_index, Integer, :nullable => false, :key => true
59
- #belongs_to :language
117
+ property :msgstr_index, Integer, :nullable => true, :key => true
118
+ belongs_to :language, :class_name => Language.name
60
119
  end
61
120
  end
62
121
  end
@@ -1,4 +1,6 @@
1
1
  require 'gettext'
2
+ require 'treetop'
3
+ require 'pathname'
2
4
 
3
5
  # I'm not sure if it is the correct way of doing it.
4
6
  # As far it seems to be simpler.
@@ -11,7 +13,10 @@ end
11
13
  module Merb
12
14
  module Global
13
15
  module Providers
14
- class Gettext < Merb::Global::Provider #:nodoc: all
16
+ class Gettext #:nodoc: all
17
+ include Merb::Global::Provider
18
+ include Merb::Global::Provider::Importer
19
+
15
20
  def translate_to(singular, plural, opts)
16
21
  context = Thread.current.gettext_context
17
22
  context.set_locale opts[:lang], true
@@ -39,6 +44,40 @@ module Merb
39
44
  dir.first
40
45
  end
41
46
 
47
+ def import(exporter, export_data)
48
+ Treetop.load(Pathname(__FILE__).dirname.expand_path.to_s +
49
+ '/gettext')
50
+ parser = Merb::Global::Providers::GetTextParser.new
51
+ Dir[Merb::Global::Providers.localedir + '/*.po'].each do |file|
52
+ lang_name = File.basename file, '.po'
53
+ lang_tree = nil
54
+ open file do |data|
55
+ lang_tree = parser.parse data.read
56
+ end
57
+ opts = (lang_tree.to_hash)[''].split("\n")
58
+ plural_line = nil
59
+ for l in opts
60
+ if l[0..."Plural-Forms:".length] == "Plural-Forms:"
61
+ plural_line = l
62
+ break
63
+ end
64
+ end
65
+ plural_line =
66
+ plural_line["Plural-Forms:".length...plural_line.length]
67
+ plural_line = plural_line[0...plural_line.length-1]
68
+ plural_line = plural_line.gsub(/[[:space:]]/, '').split(/[=;]/, 4)
69
+ plural_line = Hash[*plural_line]
70
+ exporter.export_language export_data, lang_name,
71
+ plural_line['nplurals'].to_i,
72
+ plural_line['plural'] do |lang_data|
73
+ lang_tree.visit do |msgid, msgid_plural, msgstr, index|
74
+ exporter.export_string lang_data, msgid, msgid_plural,
75
+ index, msgstr
76
+ end
77
+ end
78
+ end
79
+ end
80
+
42
81
  class GettextContext
43
82
  include ::GetText
44
83
  bindtextdomain Merb::Global.config([:gettext, :domain], 'merbapp'),
@@ -0,0 +1,74 @@
1
+ module Merb
2
+ module Global
3
+ module Providers
4
+ grammar GetText
5
+ rule po_file
6
+ entry* {
7
+ def to_hash
8
+ hash = {}
9
+ elements.each {|entry| hash.merge! entry.to_hash}
10
+ hash
11
+ end
12
+ def visit &block
13
+ elements.each {|elem| elem.visit &block}
14
+ end
15
+ }
16
+ end
17
+
18
+ rule entry
19
+ whitespaces*
20
+ "msgid" whitespaces msgid:strings
21
+ "msgstr" whitespaces msgstr:strings {
22
+ def to_hash
23
+ {msgid.to_string => msgstr.to_string}
24
+ end
25
+ def visit &block
26
+ unless msgid.to_string.empty? or msgstr.to_string.empty?
27
+ yield msgid.to_string, nil, msgstr.to_string, nil
28
+ end
29
+ end
30
+ }
31
+ /
32
+ whitespaces*
33
+ "msgid" whitespaces msgid:strings
34
+ "msgid_plural" whitespaces msgid_plural:strings
35
+ msgstrs:("msgstr[" number:[0-9]+ "]" whitespaces strings)+ {
36
+ def to_hash
37
+ hash = {:plural => msgid_plural.to_string}
38
+ msgstrs.elements.each do |msgstr|
39
+ hash[msgstr.number.text_value.to_i] = msgstr.strings.to_string
40
+ end
41
+ {msgid.to_string => hash}
42
+ end
43
+ def visit &block
44
+ msgstrs.elements.each do |msgstr|
45
+ yield msgid.to_string, msgid_plural.to_string,
46
+ msgstr.strings.to_string, msgstr.number.text_value.to_i
47
+ end
48
+ end
49
+ }
50
+ end
51
+
52
+ rule strings
53
+ (string whitespaces?)+ {
54
+ def to_string
55
+ elements.collect {|element| element.string.to_string}.join
56
+ end
57
+ }
58
+ end
59
+
60
+ rule string
61
+ '"' content:((!'"' ('\"' / .))*) '"' {
62
+ def to_string
63
+ content.text_value.gsub(/\\n/, "\n")
64
+ end
65
+ }
66
+ end
67
+
68
+ rule whitespaces
69
+ (" " / "\t" / "\n" / ('#' (!"\n" .)* "\n") )+
70
+ end
71
+ end
72
+ end
73
+ end
74
+ end
@@ -1,7 +1,9 @@
1
1
  module Merb
2
2
  module Global
3
3
  module Providers
4
- class Mock < Merb::Global::Provider #:nodoc:
4
+ class Mock #:nodoc:
5
+ include Merb::Global::Provider
6
+
5
7
  def translate_to(singular, plural, opts)
6
8
  opts[:n] > 1 ? plural : singular
7
9
  end
@@ -4,12 +4,20 @@ require 'merb_global/plural'
4
4
  module Merb
5
5
  module Global
6
6
  module Providers
7
- class Sequel < Merb::Global::Provider #:nodoc: all
7
+ class Sequel #:nodoc: all
8
+ include Merb::Global::Provider
9
+ include Merb::Global::Provider::Importer
10
+ include Merb::Global::Provider::Exporter
11
+
8
12
  def translate_to(singular, plural, opts)
9
13
  language = Language[:name => opts[:lang]] # I hope it's from MemCache
10
14
  unless language.nil?
11
- n = Plural.which_form opts[:n], language[:plural]
12
- translation = Translation[language.pk, singular.hash, n]
15
+ unless plural.nil?
16
+ n = Plural.which_form opts[:n], language[:plural]
17
+ translation = Translation[language.pk, singular, n]
18
+ else
19
+ translation = Translation[language.pk, singular, nil]
20
+ end
13
21
  return translation[:msgstr] unless translation.nil?
14
22
  end
15
23
  return opts[:n] > 1 ? plural : singular # Fallback if not in database
@@ -32,14 +40,59 @@ module Merb
32
40
  end
33
41
 
34
42
  def choose(except)
35
- Language.filter {:name != except}.first[:name]
43
+ Language.filter(~{:name => except}).first[:name]
44
+ end
45
+
46
+ def import(exporter, export_data)
47
+ DB.transaction do
48
+ Language.each do |language|
49
+ exporter.export_language export_data, language[:name],
50
+ language[:nplural],
51
+ language[:plural] do |lang|
52
+ language.translations.each do |translation|
53
+ exporter.export_string lang,
54
+ translation[:msgid],
55
+ translation[:msgid_plural],
56
+ translation[:msgstr_index],
57
+ translation[:msgstr]
58
+ end
59
+ end
60
+ end
61
+ end
62
+ end
63
+
64
+ def export
65
+ DB.transaction do
66
+ Language.delete_all
67
+ Translation.delete_all
68
+ yield nil
69
+ end
70
+ end
71
+
72
+ def export_language(export_data, language, nplural, plural)
73
+ lang = Language.create :name => language, :nplural => nplural,
74
+ :plural => plural
75
+ raise unless lang
76
+ yield lang
77
+ end
78
+
79
+ def export_string(language_id, msgid, msgid_plural,
80
+ msgstr, msgstr_index)
81
+ Translation.create(:language_id => language_id,
82
+ :msgid => msgid,
83
+ :msgid_plural => msgid_plural,
84
+ :msgstr => msgstr,
85
+ :msgstr_index => msgstr_index) or raise
36
86
  end
37
87
 
38
88
  class Language < ::Sequel::Model(:merb_global_languages)
89
+ has_many :translations,
90
+ :class => "Merb::Global::Providers::Sequel::Translation",
91
+ :key => :language_id
39
92
  end
40
93
 
41
94
  class Translation < ::Sequel::Model(:merb_global_translations)
42
- set_primary_key :language_id, :msgid_hash, :msgstr_index
95
+ set_primary_key :language_id, :msgid, :msgstr_index
43
96
  end
44
97
  end
45
98
  end
@@ -1,9 +1,14 @@
1
1
  require 'yaml'
2
+ require 'fileutils'
2
3
 
3
4
  module Merb
4
5
  module Global
5
6
  module Providers
6
- class Yaml < Merb::Global::Provider #:nodoc:
7
+ class Yaml #:nodoc:
8
+ include Merb::Global::Provider
9
+ include Merb::Global::Provider::Importer
10
+ include Merb::Global::Provider::Exporter
11
+
7
12
  def initialize
8
13
  # Not synchronized - make GC do it's work (may be not optimal
9
14
  # but I don't think that some problem will occure).
@@ -45,8 +50,7 @@ module Merb
45
50
  end
46
51
 
47
52
  def create!
48
- require 'ftools'
49
- File.mkdirs Merb::Global::Providers.localedir
53
+ FileUtils.mkdir_p Merb::Global::Providers.localedir
50
54
  end
51
55
 
52
56
  def choose(except)
@@ -55,6 +59,55 @@ module Merb
55
59
  dir.reject! {|lang| except.include? lang}
56
60
  dir.first
57
61
  end
62
+
63
+ def import(exporter, export_data)
64
+ Dir[Merb::Global::Providers.localedir + '/*.yaml'].each do |file|
65
+ lang_name = File.basename file, '.yaml'
66
+ lang = YAML.load_file file
67
+ exporter.export_language export_data,
68
+ lang_name,
69
+ lang[:nplural],
70
+ lang[:plural] do |lang_data|
71
+ lang.each do |msgid, msgstr|
72
+ if msgid.is_a? String
73
+ if msgstr.is_a? Hash
74
+ msgid_plural = msgstr[:plural]
75
+ msgstr.each do |msgstr_index, msgstr|
76
+ if msgstr_index.is_a? Fixnum
77
+ exporter.export_string lang_data, msgid, msgid_plural,
78
+ msgstr_index, msgstr
79
+ end
80
+ end
81
+ else
82
+ exporter.export_string lang_data, msgid, nil, nil, msgstr
83
+ end
84
+ end
85
+ end
86
+ end
87
+ end
88
+ end
89
+
90
+ def export
91
+ yield nil
92
+ end
93
+
94
+ def export_language(export_data, language, nplural, plural)
95
+ lang = {:nplural => nplural, :plural => plural}
96
+ yield lang
97
+ file = "#{Merb::Global::Providers.localedir}/#{language}.yaml"
98
+ open file, 'w+' do |out|
99
+ YAML.dump lang, out
100
+ end
101
+ end
102
+
103
+ def export_string(language, msgid, msgstr, msgstr_index)
104
+ if no.nil?
105
+ language[msgid] = msgstr
106
+ else
107
+ language[msgid] ||= {}
108
+ language[msgid][no] = msgstr
109
+ end
110
+ end
58
111
  end
59
112
  end
60
113
  end
@@ -0,0 +1,79 @@
1
+ module Merb
2
+ module Global
3
+ module Provider
4
+ ##
5
+ # Transfer data from importer into exporter
6
+ #
7
+ # ==== Parameters
8
+ # importer<Importer>:: The provider providing the information
9
+ # exporter<Exporter>:: The provider receiving the information
10
+ def self.transfer(importer, exporter)
11
+ exporter.export do |export_data|
12
+ importer.import(exporter, export_data)
13
+ end
14
+ end
15
+ ##
16
+ # Importer is a provider through which one can iterate.
17
+ # Therefore it is possible to import data from this source
18
+ module Importer
19
+ ##
20
+ # This method iterates through the data and calles the export method
21
+ # of exporter
22
+ #
23
+ # ==== Parameters
24
+ # exporter<Exporter>:: Exporter to which it should be exported
25
+ # export_data:: Data to pass in calles
26
+ #
27
+ # ==== Raises
28
+ # NoMethodError:: Raised by default implementation.
29
+ # Should not be thrown.
30
+ def import(exporter, export_data)
31
+ raise NoMethodError.new('method import has not been implemented')
32
+ end
33
+ end
34
+
35
+ ##
36
+ # Some sources are not only read-only but one can write to them.
37
+ # The provider is exporter if it handles this sort of source.
38
+ module Exporter
39
+ ##
40
+ # This method handles all transaction stuff that is needed.
41
+ # It also should do a initialization and/or cleanup of all resources
42
+ # needed specificly to the transfer as well as the final
43
+ # flush of changes.
44
+ # ==== Yields
45
+ # exported:: A data needed for transfer
46
+ def export # Better name needed
47
+ Merb.logger.error('No transaction has been set by exporter')
48
+ yield nil
49
+ end
50
+ ##
51
+ # This method exports a single message. Please note that the calles
52
+ # may be not in any particular order.
53
+ # ==== Parameters
54
+ # language:: Language data (yielded by Language call)
55
+ # msgid<String>:: Orginal string
56
+ # msgid_plural<String>:: Orginal plural string
57
+ # msgstr<String>:: The translation
58
+ # msgstr_index<Integer>:: The number of form (nil if only singular)
59
+ def export_string(language, msgid, msgid_plural, msgstr, msgstr_index)
60
+ raise NoMethodError.new('method export has not been implemented')
61
+ end
62
+ ##
63
+ # This method export an language. It is guaranteed to be called
64
+ # before any of the messages will be exported.
65
+ #
66
+ # ==== Parameters
67
+ # export_data:: Data given from transfer
68
+ # language<String>:: Language call
69
+ # nplural<Integer>:: Number of forms
70
+ # plural<String>:: Format of plural
71
+ # ==== Yields
72
+ # language:: The data about language
73
+ def export_language(export_data, language, nplural, plural)
74
+ raise NoMethodError.new('method export has not been implemented')
75
+ end
76
+ end
77
+ end
78
+ end
79
+ end
@@ -7,13 +7,16 @@ class AddTranslationsMigration < Sequel::Migration
7
7
  create_table :merb_global_languages do
8
8
  primary_key :id
9
9
  varchar :name, :size => 16, :unique => true
10
+ integer :nplural
10
11
  varchar :plural, :size => 128
11
12
  end
12
13
  create_table :merb_global_translations do
13
- foreign_key :language_id, :null => false, :key => true
14
- integer :msgid_hash, :null => false, :key => true
14
+ primary_key [:language_id, :msgid_hash, :msgstr_index]
15
+ foreign_key :language_id, :null => false
16
+ text :msgid, :null => false
17
+ text :msgid_plural
15
18
  text :msgstr, :null => false
16
- integer :msgstr_index, :null => false, :key => true
19
+ integer :msgstr_index, :null => true
17
20
  end
18
21
  end
19
22
  def down
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: merb_global
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3.1
4
+ version: 0.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alex Coles
@@ -10,7 +10,7 @@ autorequire: merb_global
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2008-06-14 00:00:00 +02:00
13
+ date: 2008-06-23 00:00:00 +02:00
14
14
  default_executable:
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
@@ -55,6 +55,7 @@ files:
55
55
  - lib/merb_global/plural.treetop
56
56
  - lib/merb_global/config.rb
57
57
  - lib/merb_global/controller.rb
58
+ - lib/merb_global/transfer.rb
58
59
  - lib/merb_global/base.rb
59
60
  - lib/merb_global/merbrake.rb
60
61
  - lib/merb_global/providers
@@ -64,6 +65,7 @@ files:
64
65
  - lib/merb_global/providers/data_mapper.rb
65
66
  - lib/merb_global/providers/mock.rb
66
67
  - lib/merb_global/providers/active_record.rb
68
+ - lib/merb_global/providers/gettext.treetop
67
69
  - lib/merb_global.rb
68
70
  - sequel_generators/translations_migration
69
71
  - sequel_generators/translations_migration/USAGE