diff options
author | Bob Van Landuyt <bob@vanlanduyt.co> | 2017-08-30 10:34:13 +0300 |
---|---|---|
committer | Bob Van Landuyt <bob@vanlanduyt.co> | 2017-08-31 21:13:01 +0200 |
commit | f35a5d0d9919810b14d95808f099a3c652fb17b9 (patch) | |
tree | 201faad250e2103bcef0239d32ee7758bf6dba29 /lib/gitlab/i18n | |
parent | c6d969949ef98f1b4aebf38ca7f3ed1e59791d48 (diff) | |
download | gitlab-ce-f35a5d0d9919810b14d95808f099a3c652fb17b9.tar.gz |
Split translation & metadata entries into classes
Diffstat (limited to 'lib/gitlab/i18n')
-rw-r--r-- | lib/gitlab/i18n/metadata_entry.rb | 24 | ||||
-rw-r--r-- | lib/gitlab/i18n/po_entry.rb | 94 | ||||
-rw-r--r-- | lib/gitlab/i18n/po_linter.rb | 24 | ||||
-rw-r--r-- | lib/gitlab/i18n/translation_entry.rb | 68 |
4 files changed, 114 insertions, 96 deletions
diff --git a/lib/gitlab/i18n/metadata_entry.rb b/lib/gitlab/i18n/metadata_entry.rb new file mode 100644 index 00000000000..3f9cbae62c8 --- /dev/null +++ b/lib/gitlab/i18n/metadata_entry.rb @@ -0,0 +1,24 @@ +module Gitlab + module I18n + class MetadataEntry < PoEntry + def expected_plurals + return nil unless plural_information + + nplurals = plural_information['nplurals'].to_i + if nplurals > 0 + nplurals + end + end + + private + + def plural_information + return @plural_information if defined?(@plural_information) + + if plural_line = entry_data[:msgstr].detect { |metadata_line| metadata_line.starts_with?('Plural-Forms: ') } + @plural_information = Hash[plural_line.scan(/(\w+)=([^;\n]+)/)] + end + end + end + end +end diff --git a/lib/gitlab/i18n/po_entry.rb b/lib/gitlab/i18n/po_entry.rb index f2a4bfbd1cd..014043cfdd6 100644 --- a/lib/gitlab/i18n/po_entry.rb +++ b/lib/gitlab/i18n/po_entry.rb @@ -1,96 +1,18 @@ module Gitlab module I18n class PoEntry - attr_reader :entry_data - - def initialize(entry_data) - @entry_data = entry_data - end - - def msgid - entry_data[:msgid] - end - - def metadata? - msgid.empty? - end - - def plural_id - entry_data[:msgid_plural] - end - - def plural? - plural_id.present? - end - - def singular_translation - plural? ? entry_data['msgstr[0]'] : entry_data[:msgstr] - end - - def all_translations - @all_translations ||= entry_data.fetch_values(*translation_keys).reject(&:empty?) - end - - def translated? - all_translations.any? - end - - def plural_translations - return [] unless plural? - return [] unless translated? - - # The singular translation is used if there's only translation. This is - # the case for languages without plurals. - return all_translations if all_translations.size == 1 - - entry_data.fetch_values(*plural_translation_keys) - end - - def flag - entry_data[:flag] - end - - def expected_plurals - return nil unless metadata? - return nil unless plural_information - - nplurals = plural_information['nplurals'].to_i - if nplurals > 0 - nplurals + def self.build(entry_data) + if entry_data[:msgid].empty? + MetadataEntry.new(entry_data) + else + TranslationEntry.new(entry_data) end end - # When a translation is a plural, but only has 1 translation, we could be - # talking about a language in which plural and singular is the same thing. - # In which case we always translate as a plural. - def has_singular? - !plural? || all_translations.size > 1 - end - - private - - def plural_information - return nil unless metadata? - return @plural_information if defined?(@plural_information) - - if plural_line = entry_data[:msgstr].detect { |metadata_line| metadata_line.starts_with?('Plural-Forms: ') } - @plural_information = Hash[plural_line.scan(/(\w+)=([^;\n]+)/)] - end - end - - def plural_translation_keys - @plural_translation_keys ||= translation_keys.select do |key| - plural_index = key.scan(/\d+/).first.to_i - plural_index > 0 - end - end + attr_reader :entry_data - def translation_keys - @translation_keys ||= if plural? - entry_data.keys.select { |key| key =~ /msgstr\[\d+\]/ } - else - [:msgstr] - end + def initialize(entry_data) + @entry_data = entry_data end end end diff --git a/lib/gitlab/i18n/po_linter.rb b/lib/gitlab/i18n/po_linter.rb index e7c92be1383..0dc96ac7b9b 100644 --- a/lib/gitlab/i18n/po_linter.rb +++ b/lib/gitlab/i18n/po_linter.rb @@ -3,7 +3,7 @@ require 'simple_po_parser' module Gitlab module I18n class PoLinter - attr_reader :po_path, :entries, :metadata, :locale + attr_reader :po_path, :translation_entries, :metadata_entry, :locale VARIABLE_REGEX = /%{\w*}|%[a-z]/.freeze @@ -25,20 +25,23 @@ module Gitlab end def parse_po - @entries = SimplePoParser.parse(po_path).map { |data| Gitlab::I18n::PoEntry.new(data) } - @metadata = @entries.detect { |entry| entry.metadata? } + entries = SimplePoParser.parse(po_path).map { |data| Gitlab::I18n::PoEntry.build(data) } + + # The first entry is the metadata entry if there is one. + # This is an entry when empty `msgid` + @metadata_entry = entries.shift if entries.first.is_a?(Gitlab::I18n::MetadataEntry) + @translation_entries = entries + nil rescue SimplePoParser::ParserError => e - @entries = [] + @translation_entries = [] e.message end def validate_entries errors = {} - entries.each do |entry| - next if entry.metadata? - + translation_entries.each do |entry| errors_for_entry = validate_entry(entry) errors[join_message(entry.msgid)] = errors_for_entry if errors_for_entry.any? end @@ -58,11 +61,12 @@ module Gitlab end def validate_number_of_plurals(errors, entry) - return unless metadata&.expected_plurals + return unless metadata_entry&.expected_plurals return unless entry.translated? - if entry.plural? && entry.all_translations.size != metadata.expected_plurals - errors << "should have #{metadata.expected_plurals} #{'translations'.pluralize(metadata.expected_plurals)}" + if entry.plural? && entry.all_translations.size != metadata_entry.expected_plurals + errors << "should have #{metadata_entry.expected_plurals} "\ + "#{'translations'.pluralize(metadata_entry.expected_plurals)}" end end diff --git a/lib/gitlab/i18n/translation_entry.rb b/lib/gitlab/i18n/translation_entry.rb new file mode 100644 index 00000000000..98095177994 --- /dev/null +++ b/lib/gitlab/i18n/translation_entry.rb @@ -0,0 +1,68 @@ +module Gitlab + module I18n + class TranslationEntry < PoEntry + def msgid + entry_data[:msgid] + end + + def plural_id + entry_data[:msgid_plural] + end + + def plural? + plural_id.present? + end + + def singular_translation + plural? ? entry_data['msgstr[0]'] : entry_data[:msgstr] + end + + def all_translations + @all_translations ||= entry_data.fetch_values(*translation_keys).reject(&:empty?) + end + + def translated? + all_translations.any? + end + + def plural_translations + return [] unless plural? + return [] unless translated? + + # The singular translation is used if there's only translation. This is + # the case for languages without plurals. + return all_translations if all_translations.size == 1 + + entry_data.fetch_values(*plural_translation_keys) + end + + def flag + entry_data[:flag] + end + + # When a translation is a plural, but only has 1 translation, we could be + # talking about a language in which plural and singular is the same thing. + # In which case we always translate as a plural. + def has_singular? + !plural? || all_translations.size > 1 + end + + private + + def plural_translation_keys + @plural_translation_keys ||= translation_keys.select do |key| + plural_index = key.scan(/\d+/).first.to_i + plural_index > 0 + end + end + + def translation_keys + @translation_keys ||= if plural? + entry_data.keys.select { |key| key =~ /msgstr\[\d+\]/ } + else + [:msgstr] + end + end + end + end +end |