Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mapsme/twine.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'lib/twine/formatters')
-rw-r--r--lib/twine/formatters/abstract.rb20
-rw-r--r--lib/twine/formatters/android.rb7
-rw-r--r--lib/twine/formatters/apple.rb4
-rw-r--r--lib/twine/formatters/apple_plural.rb68
4 files changed, 98 insertions, 1 deletions
diff --git a/lib/twine/formatters/abstract.rb b/lib/twine/formatters/abstract.rb
index 4bd8c09..37c5f15 100644
--- a/lib/twine/formatters/abstract.rb
+++ b/lib/twine/formatters/abstract.rb
@@ -3,6 +3,7 @@ require 'fileutils'
module Twine
module Formatters
class Abstract
+ SUPPORTS_PLURAL = false
attr_accessor :twine_file
attr_accessor :options
@@ -132,7 +133,13 @@ module Twine
end
def format_definition(definition, lang)
- [format_comment(definition, lang), format_key_value(definition, lang)].compact.join
+ formatted_definition = [format_comment(definition, lang)]
+ if self.class::SUPPORTS_PLURAL && definition.is_plural?
+ formatted_definition << format_plural(definition, lang)
+ else
+ formatted_definition << format_key_value(definition, lang)
+ end
+ formatted_definition.compact.join
end
def format_comment(definition, lang)
@@ -143,10 +150,21 @@ module Twine
key_value_pattern % { key: format_key(definition.key.dup), value: format_value(value.dup) }
end
+ def format_plural(definition, lang)
+ plural_hash = definition.plural_translation_for_lang(lang)
+ if plural_hash
+ format_plural_keys(definition.key.dup, plural_hash)
+ end
+ end
+
def key_value_pattern
raise NotImplementedError.new("You must implement key_value_pattern in your formatter class.")
end
+ def format_plural_keys(key, plural_hash)
+ raise NotImplementedError.new("You must implement format_plural_keys in your formatter class.")
+ end
+
def format_key(key)
key
end
diff --git a/lib/twine/formatters/android.rb b/lib/twine/formatters/android.rb
index e8f0642..5ad23ab 100644
--- a/lib/twine/formatters/android.rb
+++ b/lib/twine/formatters/android.rb
@@ -7,6 +7,7 @@ module Twine
class Android < Abstract
include Twine::Placeholders
+ SUPPORTS_PLURAL = true
LANG_CODES = Hash[
'zh' => 'zh-Hans',
'zh-CN' => 'zh-Hans',
@@ -110,6 +111,12 @@ module Twine
"\t<string name=\"%{key}\">%{value}</string>"
end
+ def format_plural_keys(key, plural_hash)
+ result = "\t<plurals name=\"#{key}\">\n"
+ result += plural_hash.map{|quantity,value| "\t#{' ' * 2}<item quantity=\"#{quantity}\">#{value}</item>"}.join("\n")
+ result += "\n\t</plurals>"
+ end
+
def gsub_unless(text, pattern, replacement)
text.gsub(pattern) do |match|
match_start_position = Regexp.last_match.offset(0)[0]
diff --git a/lib/twine/formatters/apple.rb b/lib/twine/formatters/apple.rb
index 5233cb1..5a655df 100644
--- a/lib/twine/formatters/apple.rb
+++ b/lib/twine/formatters/apple.rb
@@ -86,6 +86,10 @@ module Twine
def format_value(value)
escape_quotes(value)
end
+
+ def should_include_definition(definition, lang)
+ return !definition.is_plural? && super
+ end
end
end
end
diff --git a/lib/twine/formatters/apple_plural.rb b/lib/twine/formatters/apple_plural.rb
new file mode 100644
index 0000000..c53f02b
--- /dev/null
+++ b/lib/twine/formatters/apple_plural.rb
@@ -0,0 +1,68 @@
+module Twine
+ module Formatters
+ class ApplePlural < Apple
+ SUPPORTS_PLURAL = true
+
+ def format_name
+ 'apple-plural'
+ end
+
+ def extension
+ '.stringsdict'
+ end
+
+ def default_file_name
+ 'Localizable.stringsdict'
+ end
+
+ def format_footer(lang)
+ footer = "</dict>\n</plist>"
+ end
+
+ def format_file(lang)
+ result = super
+ result += format_footer(lang)
+ end
+
+ def format_header(lang)
+ header = "<!--\n * Apple Stringsdict File\n * Generated by Twine #{Twine::VERSION}\n * Language: #{lang} -->\n"
+ header += "<\?xml version=\"1.0\" encoding=\"UTF-8\"\?>\n"
+ header += "<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n"
+ header += "<plist version=\"1.0\">\n<dict>"
+ end
+
+ def format_section_header(section)
+ "<!-- ********** #{section.name} **********/ -->\n"
+ end
+
+ def format_plural_keys(key, plural_hash)
+ result = "#{tab(2)}<key>#{key}</key>\n"
+ result += "#{tab(2)}<dict>\n"
+ result += "#{tab(4)}<key>NSStringLocalizedFormatKey</key>\n#{tab(4)}<string>\%\#@value@</string>\n"
+ result += "#{tab(4)}<key>value</key>\n#{tab(4)}<dict>\n"
+ result += "#{tab(6)}<key>NSStringFormatSpecTypeKey</key>\n#{tab(6)}<string>NSStringPluralRuleType</string>\n"
+ result += "#{tab(6)}<key>NSStringFormatValueTypeKey</key>\n#{tab(6)}<string>d</string>\n"
+ result += plural_hash.map{|quantity,value| "#{tab(6)}<key>#{quantity}</key>\n#{tab(6)}<string>#{value}</string>"}.join("\n")
+ result += "\n#{tab(4)}</dict>\n#{tab(2)}</dict>\n"
+ end
+
+ def format_comment(definition, lang)
+ "<!-- #{definition.comment.gsub('--', '—')} -->\n" if definition.comment
+ end
+
+ def read(io, lang)
+ raise NotImplementedError.new("Reading \".stringdict\" files not implemented yet")
+ end
+
+ def tab(level)
+ ' ' * level
+ end
+
+ def should_include_definition(definition, lang)
+ return definition.is_plural? && definition.plural_translation_for_lang(lang)
+ end
+ end
+ end
+end
+
+Twine::Formatters.formatters << Twine::Formatters::ApplePlural.new