diff --git a/lib/twine/formatters/abstract.rb b/lib/twine/formatters/abstract.rb old mode 100644 new mode 100755 index 37c5f15f..43790367 --- a/lib/twine/formatters/abstract.rb +++ b/lib/twine/formatters/abstract.rb @@ -61,6 +61,39 @@ def set_translation_for_key(key, lang, value) @twine_file.add_language_code(lang) end end + + def set_plural_translation_for_key(key, lang, plural_hash) + if @twine_file.definitions_by_key.include?(key) + definition = @twine_file.definitions_by_key[key] + reference = @twine_file.definitions_by_key[definition.reference_key] if definition.reference_key + + if !reference or value != reference.plural_translations[lang] + definition.plural_translations[lang] = value + end + elsif @options[:consume_all] + Twine::stderr.puts "Adding new plural definition '#{key}' to twine file." + current_section = @twine_file.sections.find { |s| s.name == 'Uncategorized' } + unless current_section + current_section = TwineSection.new('Uncategorized') + @twine_file.sections.insert(0, current_section) + end + current_definition = TwineDefinition.new(key) + current_definition.plural_translations[lang] = plural_hash + current_section.definitions << current_definition + + if @options[:tags] && @options[:tags].length > 0 + current_definition.tags = @options[:tags] + end + + @twine_file.definitions_by_key[key] = current_definition + else + Twine::stderr.puts "Warning: '#{key}' not found in twine file." + end + + if !@twine_file.language_codes.include?(lang) + @twine_file.add_language_code(lang) + end + end def set_comment_for_key(key, comment) return unless @options[:consume_comments] diff --git a/lib/twine/formatters/android.rb b/lib/twine/formatters/android.rb old mode 100644 new mode 100755 index 5ad23ab6..008c1f6c --- a/lib/twine/formatters/android.rb +++ b/lib/twine/formatters/android.rb @@ -31,6 +31,12 @@ def can_handle_directory?(path) def default_file_name 'strings.xml' end + + def iosify_substitutions(str) + # use "@" instead of "s" for substituting strings + str.gsub!(/%([0-9\$]*)s/, '%\1@') + return str + end def determine_language_given_path(path) path_arr = path.split(File::SEPARATOR) @@ -57,6 +63,24 @@ def output_path_for_language(lang) end def set_translation_for_key(key, lang, value) + ref_regex = /@\w+\/(\w+)/ + + value.gsub!(/\r\s*/," ") + value.gsub!(/\n\s*/," ") + value.gsub!(/\r\n\s*/," ") + value.gsub!(/>\s*\n<") + + ref_match = ref_regex.match(value) + + if ref_match + ref = ref_match[1] + if @twine_file.definitions_by_key.include?(ref) + value = @twine_file.definitions_by_key[ref].translations[lang] + else + value = "" + end + end + value = CGI.unescapeHTML(value) value.gsub!('\\\'', '\'') value.gsub!('\\"', '"') @@ -75,13 +99,32 @@ def read(io, lang) content = child.string.strip comment = content if content.length > 0 and not content.start_with?("SECTION:") elsif child.is_a? REXML::Element - next unless child.name == 'string' + next unless ['plurals', 'string', 'color'].include? child.name key = child.attributes['name'] - - set_translation_for_key(key, lang, child.text) + value = child.text + value = "" if value.nil? + + if child.name == 'plurals' + plurals_hash = Hash.new + + child.children.each do |pluralitem| + if pluralitem.is_a? REXML::Element + next unless pluralitem.name == 'item' + + quantity = pluralitem.attributes['quantity'] + pluraltext = pluralitem.text + + plurals_hash[quantity] = pluraltext + end + end + + set_plural_translation_for_key(key, lang, plurals_hash) + else + set_translation_for_key(key, lang, value) + end + set_comment_for_key(key, comment) if comment - comment = nil end end diff --git a/lib/twine/twine_file.rb b/lib/twine/twine_file.rb index 4ffca5e6..8b531988 100644 --- a/lib/twine/twine_file.rb +++ b/lib/twine/twine_file.rb @@ -215,7 +215,12 @@ def write(path) section.definitions.each do |definition| f.puts "\t[#{definition.key}]" - value = write_value(definition, dev_lang, f) + if definition.is_plural? + value = write_plural_value(definition, dev_lang, f) + else + value = write_value(definition, dev_lang, f) + end + if !value && !definition.reference_key puts "Warning: #{definition.key} does not exist in developer language '#{dev_lang}'" end @@ -252,5 +257,19 @@ def write_value(definition, language, file) return value end + def write_plural_value(definition, language, file) + pluralvalue = definition.plural_translations[language] + return nil unless pluralvalue + + pluralvalue.each do |pluralkey, value| + if value[0] == ' ' || value[-1] == ' ' || (value[0] == '`' && value[-1] == '`') + value = '`' + value + '`' + end + + file.puts "\t\t#{language} :#{pluralkey} = #{value}" + end + + return pluralvalue + end end end