Class: Gitlab::I18n::TranslationEntry

Inherits:
Object
  • Object
show all
Defined in:
lib/gitlab/i18n/translation_entry.rb

Constant Summary collapse

PERCENT_REGEX =
/(?:^|[^%])%(?!{\w*}|[a-z%])/
ANGLE_BRACKET_REGEX =
/[<>]/
NAMESPACE_REGEX =
/^((?u)\w+|\s)*\|/
SPACE_REGEX =
/[\p{Separator}\u0009-\u000d\u001c-\u001f\u0085\u180e]/
MULTIPLE_CONSECUTIVE_SPACES_REGEX =
/#{SPACE_REGEX}{2,}/o

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(entry_data:, nplurals:) ⇒ TranslationEntry

Returns a new instance of TranslationEntry.



14
15
16
17
# File 'lib/gitlab/i18n/translation_entry.rb', line 14

def initialize(entry_data:, nplurals:)
  @entry_data = entry_data
  @nplurals = nplurals
end

Instance Attribute Details

#entry_dataObject (readonly)

Returns the value of attribute entry_data.



12
13
14
# File 'lib/gitlab/i18n/translation_entry.rb', line 12

def entry_data
  @entry_data
end

#npluralsObject (readonly)

Returns the value of attribute nplurals.



12
13
14
# File 'lib/gitlab/i18n/translation_entry.rb', line 12

def nplurals
  @nplurals
end

Instance Method Details

#all_translationsObject



39
40
41
# File 'lib/gitlab/i18n/translation_entry.rb', line 39

def all_translations
  @all_translations ||= translation_entries.map { |translation| Array(translation).join }
end

#contains_leading_space?(translation) ⇒ Boolean

Returns:

  • (Boolean)


90
91
92
# File 'lib/gitlab/i18n/translation_entry.rb', line 90

def contains_leading_space?(translation)
  translation.match?(/\A,?#{SPACE_REGEX}/o) && !msgid_without_namespace.match?(/\A,?#{SPACE_REGEX}/o)
end

#contains_multiple_spaces?(translation) ⇒ Boolean

Returns:

  • (Boolean)


106
107
108
109
110
# File 'lib/gitlab/i18n/translation_entry.rb', line 106

def contains_multiple_spaces?(translation)
  msgid_matches = msgid_without_namespace.scan(MULTIPLE_CONSECUTIVE_SPACES_REGEX)
  translation_matches = translation.scan(MULTIPLE_CONSECUTIVE_SPACES_REGEX)
  msgid_matches.sort != translation_matches.sort
end

#contains_namespace?(string) ⇒ Boolean

Returns:

  • (Boolean)


82
83
84
# File 'lib/gitlab/i18n/translation_entry.rb', line 82

def contains_namespace?(string)
  string =~ NAMESPACE_REGEX
end

#contains_trailing_space?(translation) ⇒ Boolean

Returns:

  • (Boolean)


98
99
100
# File 'lib/gitlab/i18n/translation_entry.rb', line 98

def contains_trailing_space?(translation)
  translation.match?(/#{SPACE_REGEX}\Z/o) && !msgid_without_namespace.match?(/#{SPACE_REGEX}\Z/o)
end

#contains_unescaped_chars?(string) ⇒ Boolean

Returns:

  • (Boolean)


124
125
126
# File 'lib/gitlab/i18n/translation_entry.rb', line 124

def contains_unescaped_chars?(string)
  string =~ PERCENT_REGEX
end

#flagObject



58
59
60
# File 'lib/gitlab/i18n/translation_entry.rb', line 58

def flag
  entry_data[:flag]
end

#has_plural?Boolean

Returns:

  • (Boolean)


31
32
33
# File 'lib/gitlab/i18n/translation_entry.rb', line 31

def has_plural?
  plural_id.present?
end

#has_singular_translation?Boolean

Returns:

  • (Boolean)


62
63
64
# File 'lib/gitlab/i18n/translation_entry.rb', line 62

def has_singular_translation?
  nplurals > 1 || !has_plural?
end

#msgidObject



19
20
21
# File 'lib/gitlab/i18n/translation_entry.rb', line 19

def msgid
  @msgid ||= Array(entry_data[:msgid]).join
end

#msgid_contains_potential_html?Boolean

Returns:

  • (Boolean)


128
129
130
# File 'lib/gitlab/i18n/translation_entry.rb', line 128

def msgid_contains_potential_html?
  contains_angle_brackets?(msgid)
end

#msgid_contains_unescaped_chars?Boolean

Returns:

  • (Boolean)


112
113
114
# File 'lib/gitlab/i18n/translation_entry.rb', line 112

def msgid_contains_unescaped_chars?
  contains_unescaped_chars?(msgid)
end

#msgid_has_multiple_lines?Boolean

Returns:

  • (Boolean)


66
67
68
# File 'lib/gitlab/i18n/translation_entry.rb', line 66

def msgid_has_multiple_lines?
  entry_data[:msgid].is_a?(Array)
end

#msgid_without_namespaceObject



27
28
29
# File 'lib/gitlab/i18n/translation_entry.rb', line 27

def msgid_without_namespace
  @msgid_without_namespace ||= msgid.sub(NAMESPACE_REGEX, '')
end

#plural_idObject



23
24
25
# File 'lib/gitlab/i18n/translation_entry.rb', line 23

def plural_id
  @plural_id ||= Array(entry_data[:msgid_plural]).join
end

#plural_id_contains_potential_html?Boolean

Returns:

  • (Boolean)


132
133
134
# File 'lib/gitlab/i18n/translation_entry.rb', line 132

def plural_id_contains_potential_html?
  contains_angle_brackets?(plural_id)
end

#plural_id_contains_unescaped_chars?Boolean

Returns:

  • (Boolean)


116
117
118
# File 'lib/gitlab/i18n/translation_entry.rb', line 116

def plural_id_contains_unescaped_chars?
  contains_unescaped_chars?(plural_id)
end

#plural_id_has_multiple_lines?Boolean

Returns:

  • (Boolean)


70
71
72
# File 'lib/gitlab/i18n/translation_entry.rb', line 70

def plural_id_has_multiple_lines?
  entry_data[:msgid_plural].is_a?(Array)
end

#plural_translationsObject



47
48
49
50
51
52
53
54
55
56
# File 'lib/gitlab/i18n/translation_entry.rb', line 47

def plural_translations
  return [] unless has_plural?
  return [] unless translated?

  @plural_translations ||= if has_singular_translation?
                             all_translations.drop(1)
                           else
                             all_translations
                           end
end

#singular_translationObject



35
36
37
# File 'lib/gitlab/i18n/translation_entry.rb', line 35

def singular_translation
  all_translations.first.to_s if has_singular_translation?
end

#translated?Boolean

Returns:

  • (Boolean)


43
44
45
# File 'lib/gitlab/i18n/translation_entry.rb', line 43

def translated?
  all_translations.any?
end

#translations_contain_leading_space?Boolean

Returns:

  • (Boolean)


86
87
88
# File 'lib/gitlab/i18n/translation_entry.rb', line 86

def translations_contain_leading_space?
  all_translations.any? { |translation| contains_leading_space?(translation) }
end

#translations_contain_multiple_spaces?Boolean

Returns:

  • (Boolean)


102
103
104
# File 'lib/gitlab/i18n/translation_entry.rb', line 102

def translations_contain_multiple_spaces?
  all_translations.any? { |translation| contains_multiple_spaces?(translation) }
end

#translations_contain_namespace?Boolean

Returns:

  • (Boolean)


78
79
80
# File 'lib/gitlab/i18n/translation_entry.rb', line 78

def translations_contain_namespace?
  all_translations.any? { |translation| contains_namespace?(translation) }
end

#translations_contain_potential_html?Boolean

Returns:

  • (Boolean)


136
137
138
# File 'lib/gitlab/i18n/translation_entry.rb', line 136

def translations_contain_potential_html?
  all_translations.any? { |translation| contains_angle_brackets?(translation) }
end

#translations_contain_trailing_space?Boolean

Returns:

  • (Boolean)


94
95
96
# File 'lib/gitlab/i18n/translation_entry.rb', line 94

def translations_contain_trailing_space?
  all_translations.any? { |translation| contains_trailing_space?(translation) }
end

#translations_contain_unescaped_chars?Boolean

Returns:

  • (Boolean)


120
121
122
# File 'lib/gitlab/i18n/translation_entry.rb', line 120

def translations_contain_unescaped_chars?
  all_translations.any? { |translation| contains_unescaped_chars?(translation) }
end

#translations_have_multiple_lines?Boolean

Returns:

  • (Boolean)


74
75
76
# File 'lib/gitlab/i18n/translation_entry.rb', line 74

def translations_have_multiple_lines?
  translation_entries.any?(Array)
end