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

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBob Van Landuyt <bob@vanlanduyt.co>2017-08-30 10:34:13 +0300
committerBob Van Landuyt <bob@vanlanduyt.co>2017-08-31 22:13:01 +0300
commitf35a5d0d9919810b14d95808f099a3c652fb17b9 (patch)
tree201faad250e2103bcef0239d32ee7758bf6dba29 /lib/gitlab/i18n
parentc6d969949ef98f1b4aebf38ca7f3ed1e59791d48 (diff)
Split translation & metadata entries into classes
Diffstat (limited to 'lib/gitlab/i18n')
-rw-r--r--lib/gitlab/i18n/metadata_entry.rb24
-rw-r--r--lib/gitlab/i18n/po_entry.rb94
-rw-r--r--lib/gitlab/i18n/po_linter.rb24
-rw-r--r--lib/gitlab/i18n/translation_entry.rb68
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