diff options
Diffstat (limited to 'lib/twine/formatters')
-rw-r--r-- | lib/twine/formatters/abstract.rb | 20 | ||||
-rw-r--r-- | lib/twine/formatters/android.rb | 7 | ||||
-rw-r--r-- | lib/twine/formatters/apple.rb | 4 | ||||
-rw-r--r-- | lib/twine/formatters/apple_plural.rb | 68 |
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 |