translatomatic 0.1.3 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (139) hide show
  1. checksums.yaml +5 -5
  2. data/.gitattributes +20 -20
  3. data/.gitignore +19 -15
  4. data/.rspec +3 -3
  5. data/.rubocop.yml +28 -0
  6. data/.translatomatic/config.yml +4 -0
  7. data/.travis.yml +4 -6
  8. data/.yardopts +9 -9
  9. data/Gemfile +8 -4
  10. data/Guardfile +4 -5
  11. data/README.de.md +55 -50
  12. data/README.en.md +177 -0
  13. data/README.es.md +53 -48
  14. data/README.fr.md +53 -48
  15. data/README.it.md +54 -49
  16. data/README.ja.md +63 -58
  17. data/README.ko.md +59 -54
  18. data/README.md +17 -13
  19. data/README.ms.md +50 -45
  20. data/README.pt.md +54 -49
  21. data/README.ru.md +57 -52
  22. data/README.sv.md +51 -46
  23. data/README.zh.md +60 -55
  24. data/Rakefile +3 -3
  25. data/TODO.txt +6 -0
  26. data/bin/console +3 -3
  27. data/bin/translatomatic +4 -2
  28. data/config/i18n-tasks.yml +130 -0
  29. data/config/locales/translatomatic/de.yml +141 -99
  30. data/config/locales/translatomatic/en.yml +129 -89
  31. data/config/locales/translatomatic/es.yml +136 -99
  32. data/config/locales/translatomatic/fr.yml +139 -100
  33. data/config/locales/translatomatic/it.yml +135 -97
  34. data/config/locales/translatomatic/ja.yml +137 -98
  35. data/config/locales/translatomatic/ko.yml +138 -98
  36. data/config/locales/translatomatic/ms.yml +138 -100
  37. data/config/locales/translatomatic/pt.yml +137 -101
  38. data/config/locales/translatomatic/ru.yml +136 -98
  39. data/config/locales/translatomatic/sv.yml +134 -96
  40. data/config/locales/translatomatic/zh.yml +136 -97
  41. data/db/migrate/201712170000_initial.rb +2 -3
  42. data/lib/translatomatic.rb +40 -25
  43. data/lib/translatomatic/cli.rb +5 -1
  44. data/lib/translatomatic/cli/base.rb +61 -58
  45. data/lib/translatomatic/cli/common_options.rb +14 -11
  46. data/lib/translatomatic/cli/config.rb +96 -91
  47. data/lib/translatomatic/cli/database.rb +85 -23
  48. data/lib/translatomatic/cli/main.rb +158 -104
  49. data/lib/translatomatic/cli/thor.rb +29 -0
  50. data/lib/translatomatic/cli/translate.rb +134 -157
  51. data/lib/translatomatic/config.rb +10 -301
  52. data/lib/translatomatic/config/display.rb +78 -0
  53. data/lib/translatomatic/config/files.rb +60 -0
  54. data/lib/translatomatic/config/location_settings.rb +133 -0
  55. data/lib/translatomatic/config/options.rb +68 -0
  56. data/lib/translatomatic/config/selector.rb +127 -0
  57. data/lib/translatomatic/config/settings.rb +148 -0
  58. data/lib/translatomatic/converter.rb +40 -28
  59. data/lib/translatomatic/database.rb +127 -110
  60. data/lib/translatomatic/define_options.rb +4 -5
  61. data/lib/translatomatic/escaped_unicode.rb +86 -76
  62. data/lib/translatomatic/extractor.rb +5 -2
  63. data/lib/translatomatic/extractor/base.rb +12 -12
  64. data/lib/translatomatic/extractor/ruby.rb +7 -6
  65. data/lib/translatomatic/file_translator.rb +101 -244
  66. data/lib/translatomatic/flattenation.rb +39 -0
  67. data/lib/translatomatic/http.rb +13 -0
  68. data/lib/translatomatic/http/client.rb +144 -0
  69. data/lib/translatomatic/http/exception.rb +43 -0
  70. data/lib/translatomatic/http/file_param.rb +27 -0
  71. data/lib/translatomatic/http/param.rb +37 -0
  72. data/lib/translatomatic/http/request.rb +91 -0
  73. data/lib/translatomatic/i18n.rb +43 -0
  74. data/lib/translatomatic/locale.rb +71 -59
  75. data/lib/translatomatic/logger.rb +43 -28
  76. data/lib/translatomatic/metadata.rb +58 -0
  77. data/lib/translatomatic/model.rb +4 -2
  78. data/lib/translatomatic/model/locale.rb +5 -5
  79. data/lib/translatomatic/model/text.rb +5 -5
  80. data/lib/translatomatic/option.rb +57 -34
  81. data/lib/translatomatic/path_utils.rb +126 -0
  82. data/lib/translatomatic/progress_updater.rb +13 -16
  83. data/lib/translatomatic/provider.rb +101 -0
  84. data/lib/translatomatic/provider/base.rb +136 -0
  85. data/lib/translatomatic/provider/frengly.rb +55 -0
  86. data/lib/translatomatic/provider/google.rb +78 -0
  87. data/lib/translatomatic/provider/google_web.rb +50 -0
  88. data/lib/translatomatic/provider/microsoft.rb +144 -0
  89. data/lib/translatomatic/provider/my_memory.rb +75 -0
  90. data/lib/translatomatic/provider/yandex.rb +61 -0
  91. data/lib/translatomatic/resource_file.rb +59 -53
  92. data/lib/translatomatic/resource_file/base.rb +171 -237
  93. data/lib/translatomatic/resource_file/csv.rb +176 -24
  94. data/lib/translatomatic/resource_file/html.rb +21 -42
  95. data/lib/translatomatic/resource_file/key_value_support.rb +117 -0
  96. data/lib/translatomatic/resource_file/markdown.rb +36 -38
  97. data/lib/translatomatic/resource_file/plist.rb +121 -126
  98. data/lib/translatomatic/resource_file/po.rb +104 -82
  99. data/lib/translatomatic/resource_file/properties.rb +48 -77
  100. data/lib/translatomatic/resource_file/properties.treetop +87 -0
  101. data/lib/translatomatic/resource_file/resw.rb +56 -41
  102. data/lib/translatomatic/resource_file/subtitle.rb +86 -54
  103. data/lib/translatomatic/resource_file/text.rb +18 -18
  104. data/lib/translatomatic/resource_file/xcode_strings.rb +32 -63
  105. data/lib/translatomatic/resource_file/xcode_strings.treetop +85 -0
  106. data/lib/translatomatic/resource_file/xml.rb +94 -81
  107. data/lib/translatomatic/resource_file/yaml.rb +54 -68
  108. data/lib/translatomatic/retry_executor.rb +37 -0
  109. data/lib/translatomatic/slurp.rb +32 -0
  110. data/lib/translatomatic/string_batcher.rb +50 -0
  111. data/lib/translatomatic/string_escaping.rb +61 -0
  112. data/lib/translatomatic/text.rb +263 -0
  113. data/lib/translatomatic/text_collection.rb +66 -0
  114. data/lib/translatomatic/tmx.rb +5 -3
  115. data/lib/translatomatic/tmx/document.rb +107 -82
  116. data/lib/translatomatic/tmx/translation_unit.rb +19 -18
  117. data/lib/translatomatic/translation.rb +8 -28
  118. data/lib/translatomatic/translation/collection.rb +199 -0
  119. data/lib/translatomatic/translation/fetcher.rb +123 -0
  120. data/lib/translatomatic/translation/munging.rb +112 -0
  121. data/lib/translatomatic/translation/result.rb +50 -0
  122. data/lib/translatomatic/translation/sharer.rb +32 -0
  123. data/lib/translatomatic/translation/stats.rb +44 -0
  124. data/lib/translatomatic/translator.rb +91 -88
  125. data/lib/translatomatic/type_cast.rb +63 -0
  126. data/lib/translatomatic/util.rb +37 -33
  127. data/lib/translatomatic/version.rb +2 -2
  128. data/translatomatic.gemspec +57 -46
  129. metadata +136 -59
  130. data/lib/translatomatic/http_request.rb +0 -162
  131. data/lib/translatomatic/string.rb +0 -188
  132. data/lib/translatomatic/translation_result.rb +0 -86
  133. data/lib/translatomatic/translation_stats.rb +0 -31
  134. data/lib/translatomatic/translator/base.rb +0 -128
  135. data/lib/translatomatic/translator/frengly.rb +0 -62
  136. data/lib/translatomatic/translator/google.rb +0 -37
  137. data/lib/translatomatic/translator/microsoft.rb +0 -41
  138. data/lib/translatomatic/translator/my_memory.rb +0 -68
  139. data/lib/translatomatic/translator/yandex.rb +0 -56
@@ -1,153 +1,148 @@
1
- module Translatomatic::ResourceFile
2
- # Property list resource file
3
- # @see https://en.wikipedia.org/wiki/Property_list
4
- class Plist < XML
5
- # property list types:
6
- # array, dict, string, data, date, integer, real, boolean
7
- # boolean is <true /> or <false />
8
-
9
- include Translatomatic::ResourceFile::XCodeStringsLocalePath
10
-
11
- # (see Translatomatic::ResourceFile::Base.extensions)
12
- def self.extensions
13
- %w{plist}
14
- end
1
+ module Translatomatic
2
+ module ResourceFile
3
+ # Property list resource file
4
+ # @see https://en.wikipedia.org/wiki/Property_list
5
+ class Plist < XML
6
+ # property list types:
7
+ # array, dict, string, data, date, integer, real, boolean
8
+ # boolean is <true /> or <false />
9
+
10
+ # (see Base.extensions)
11
+ def self.extensions
12
+ %w[plist]
13
+ end
15
14
 
16
- # (see Translatomatic::ResourceFile::Base.is_key_value?)
17
- def self.is_key_value?
18
- true
19
- end
15
+ # (see Base.key_value?)
16
+ def self.key_value?
17
+ true
18
+ end
20
19
 
21
- private
20
+ private
22
21
 
23
- def init_nodemap
24
- result = Parser.new.parse(@doc)
25
- #puts "parser result:"
26
- #p result
27
- @flattened_data = flatten(result)
28
- @nodemap = @flattened_data.transform_values { |i| i.node }
29
- #puts "nodemap:"
30
- #p @nodemap
31
- end
22
+ def init_nodemap
23
+ result = Parser.new.parse(@doc)
24
+ # puts "parser result:"
25
+ # p result
26
+ @flattened_data = flatten(result)
27
+ @nodemap = @flattened_data.transform_values(&:node)
28
+ # puts "nodemap:"
29
+ # p @nodemap
30
+ end
32
31
 
33
- def init_properties
34
- @properties = @flattened_data.transform_values { |i| i.content }
35
- end
32
+ def init_properties
33
+ @properties = @flattened_data.transform_values(&:content)
34
+ end
36
35
 
37
- def create_node(key, value)
38
- # add properties to first dict found
39
- dict = @doc.xpath("//dict")
40
- # TODO: not sure sure what to do if dict is missing
41
- raise "missing top level dictionary" unless dict.present?
42
- dict = dict[0]
43
-
44
- # add xml: <data name="key"><value>value</value></data>
45
- key_node = Nokogiri::XML::Node.new("key", @doc)
46
- key_node.content = key
47
- value_node = Nokogiri::XML::Node.new("string", @doc)
48
- value_node.content = value
49
- dict.add_child(key_node)
50
- dict.add_child(value_node)
51
-
52
- @nodemap[key] = value_node
53
- @properties[key] = value
54
- end
36
+ def create_node(key, value)
37
+ # add properties to first dict found
38
+ dict = @doc.xpath('//dict')
39
+ # TODO: not sure sure what to do if dict is missing
40
+ raise 'missing top level dictionary' unless dict.present?
41
+ dict = dict[0]
42
+
43
+ # add xml: <data name="key"><value>value</value></data>
44
+ key_node = Nokogiri::XML::Node.new('key', @doc)
45
+ key_node.content = key
46
+ value_node = Nokogiri::XML::Node.new('string', @doc)
47
+ value_node.content = value
48
+ dict.add_child(key_node)
49
+ dict.add_child(value_node)
50
+
51
+ @nodemap[key] = value_node
52
+ @properties[key] = value
53
+ end
55
54
 
56
- def empty_doc
57
- Nokogiri::XML(EMPTY_DOC)
58
- end
55
+ def empty_doc
56
+ Nokogiri::XML(EMPTY_DOC)
57
+ end
59
58
 
60
- EMPTY_DOC=<<EOM
61
- <?xml version="1.0" encoding="UTF-8"?>
62
- <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
63
- <plist version="1.0">
59
+ EMPTY_DOC = <<EOM.strip_heredoc.freeze
60
+ <?xml version="1.0" encoding="UTF-8"?>
61
+ <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
62
+ <plist version="1.0">
64
63
  <dict>
65
64
  </dict>
66
- </plist>
65
+ </plist>
67
66
  EOM
68
67
 
69
- PlistNode = Struct.new(:node, :content) do
70
- def inspect
71
- "PlistNode:#{content}"
68
+ # @private
69
+ PlistNode = Struct.new(:node, :content) do
70
+ def inspect
71
+ "PlistNode:#{content}"
72
+ end
72
73
  end
73
- end
74
74
 
75
- # Adapted from nokogiri-plist parser
76
- # @see https://github.com/caseyhoward/nokogiri-plist
77
- class Parser
78
-
79
- def parse(xml, options = {})
80
- @converters = {
81
- 'integer' => Proc.new { |node| node.content.to_i },
82
- 'real' => Proc.new { |node| node.content.to_f },
83
- 'string' => Proc.new { |node| node.content.to_s },
84
- # DateTime.parse(node.content)
85
- 'date' => Proc.new { |node| node.content.to_s },
86
- 'true' => Proc.new { |node| true },
87
- 'false' => Proc.new { |node| false },
88
- 'dict' => Proc.new { |node| parse_dict(node) },
89
- 'array' => Proc.new { |node| parse_array(node) },
90
- 'data' => Proc.new { |node| node.content.to_s }
91
- }.merge(options[:converters] || {})
92
-
93
- @dict_class = options[:dict_class] || Hash
94
- plist = xml.root
95
- plist = plist.children.first if plist.name == "plist"
96
- result = parse_value_node(next_valid_sibling plist)
97
- plist_node_value(result)
98
- end
75
+ # Adapted from nokogiri-plist parser
76
+ # @see https://github.com/caseyhoward/nokogiri-plist
77
+ # @private
78
+ class Parser
79
+ def parse(xml, options = {})
80
+ @converters = {
81
+ 'integer' => proc { |node| node.content.to_i },
82
+ 'real' => proc { |node| node.content.to_f },
83
+ 'string' => proc { |node| node.content.to_s },
84
+ # DateTime.parse(node.content)
85
+ 'date' => proc { |node| node.content.to_s },
86
+ 'true' => proc { |_node| true },
87
+ 'false' => proc { |_node| false },
88
+ 'dict' => proc { |node| parse_dict(node) },
89
+ 'array' => proc { |node| parse_array(node) },
90
+ 'data' => proc { |node| node.content.to_s }
91
+ }.merge(options[:converters] || {})
92
+
93
+ @dict_class = options[:dict_class] || Hash
94
+ plist = xml.root
95
+ plist = plist.children.first if plist.name == 'plist'
96
+ result = parse_value_node(next_valid_sibling(plist))
97
+ plist_node_value(result)
98
+ end
99
99
 
100
- def parse_value_node(value_node)
101
- value = @converters[value_node.name].call(value_node)
102
- PlistNode.new(value_node, value)
103
- end
100
+ def parse_value_node(value_node)
101
+ value = @converters[value_node.name].call(value_node)
102
+ PlistNode.new(value_node, value)
103
+ end
104
104
 
105
- def valid_type?(type)
106
- @converters.has_key? type
107
- end
105
+ def valid_type?(type)
106
+ @converters.key? type
107
+ end
108
108
 
109
- def valid_node?(node)
110
- valid_type?(node.name) or node.name == "key"
111
- end
109
+ def valid_node?(node)
110
+ valid_type?(node.name) || node.name == 'key'
111
+ end
112
112
 
113
- def parse_dict(node)
114
- node.xpath('./key').inject(@dict_class.new) do |result, key_node|
115
- plist_node = parse_value_node(next_valid_sibling key_node)
116
- value = plist_node_value(plist_node)
117
- result[key_node.content] = value
118
- result
113
+ def parse_dict(node)
114
+ node.xpath('./key').each_with_object(@dict_class.new) do |k, v|
115
+ plist_node = parse_value_node(next_valid_sibling(k))
116
+ value = plist_node_value(plist_node)
117
+ v[k.content] = value
118
+ end
119
119
  end
120
- end
121
120
 
122
- # if the PlistNode value is an array or hash, use that directly
123
- # instead of the PlistNode.
124
- def plist_node_value(plist_node)
125
- content = plist_node.content
126
- if content.kind_of?(Array) || content.kind_of?(Hash)
127
- content
128
- else
129
- plist_node
121
+ # if the PlistNode value is an array or hash, use that directly
122
+ # instead of the PlistNode.
123
+ def plist_node_value(plist_node)
124
+ content = plist_node.content
125
+ if content.is_a?(Array) || content.is_a?(Hash)
126
+ content
127
+ else
128
+ plist_node
129
+ end
130
130
  end
131
- end
132
131
 
133
- def parse_array(node)
134
- node.children.inject([]) do |result, child|
135
- if valid_node?(child)
136
- plist_node = parse_value_node(child)
137
- result << plist_node_value(plist_node)
132
+ def parse_array(node)
133
+ node.children.each_with_object([]) do |child, result|
134
+ if valid_node?(child)
135
+ plist_node = parse_value_node(child)
136
+ result << plist_node_value(plist_node)
137
+ end
138
138
  end
139
- result
140
139
  end
141
- end
142
140
 
143
- def next_valid_sibling(node)
144
- until node.nil? or valid_type? node.name
145
- node = node.next_sibling
141
+ def next_valid_sibling(node)
142
+ node = node.next_sibling until node.nil? || valid_type?(node.name)
143
+ node
146
144
  end
147
- node
148
145
  end
149
-
150
146
  end
151
-
152
- end # class
153
- end # module
147
+ end
148
+ end
@@ -1,107 +1,129 @@
1
1
  require 'poparser'
2
2
 
3
- module Translatomatic::ResourceFile
4
- # Property list resource file
5
- # @see https://en.wikipedia.org/wiki/Property_list
6
- class PO < Base
7
-
8
- # (see Translatomatic::ResourceFile::Base.extensions)
9
- def self.extensions
10
- %w{po pot}
11
- end
3
+ module Translatomatic
4
+ module ResourceFile
5
+ # Property list resource file
6
+ # @see https://en.wikipedia.org/wiki/Property_list
7
+ class PO < Base
8
+ # (see Base.extensions)
9
+ def self.extensions
10
+ %w[po pot]
11
+ end
12
12
 
13
- # (see Translatomatic::ResourceFile::Base.is_key_value?)
14
- def self.is_key_value?
15
- true
16
- end
13
+ # (see Base.key_value?)
14
+ def self.key_value?
15
+ true
16
+ end
17
17
 
18
- # (see Translatomatic::ResourceFile::Base#set)
19
- def set(key, value)
20
- super(key, value)
21
-
22
- unless @pomap.include?(key)
23
- # new key, create po entry
24
- po << {
25
- msgid: key,
26
- msgstr: value
27
- }
28
- entry = po.entries[-1]
29
- add_entry(entry, :msgid, 0)
30
- else
31
- po_property = @pomap[key]
32
- entry = po_property.entry
33
- if entry.plural?
34
- msgstr = entry.msgstr || []
35
- msgstr[po_property.index] = value
36
- entry.msgstr = msgstr
18
+ # (see Base#set)
19
+ def set(key, value)
20
+ super(key, value)
21
+
22
+ if @pomap.include?(key)
23
+ po_property = @pomap[key]
24
+ entry = po_property.entry
25
+ if entry.plural?
26
+ msgstr = entry.msgstr || []
27
+ msgstr[po_property.msgstr_index] = value
28
+ entry.msgstr = msgstr
29
+ else
30
+ entry.msgstr = value
31
+ end
37
32
  else
38
- entry.msgstr = value
33
+ # new key, create po entry
34
+ @po << {
35
+ msgid: key,
36
+ msgstr: value
37
+ }
38
+ entry = @po.entries[-1]
39
+ add_entry(entry, :msgid, 0)
39
40
  end
40
41
  end
41
- end
42
42
 
43
- # (see Translatomatic::ResourceFile::Base#save)
44
- def save(target = path, options = {})
45
- if @po
43
+ # (see Base#save)
44
+ def save(target = path, options = {})
45
+ return unless @po
46
46
  add_created_by unless options[:no_created_by]
47
47
  target.write(@po.to_s)
48
48
  end
49
- end
50
49
 
51
- private
50
+ private
52
51
 
53
- class PoProperty
54
- attr_reader :entry
55
- attr_reader :value_index
52
+ PO_DATE_FORMAT = '%Y-%M-%d %HH:%MM%Z'.freeze
56
53
 
57
- def initialize(entry, value_index)
58
- @entry = entry
59
- @value_index = value_index
60
- end
54
+ # used to index into PO msgstr[]
55
+ # @private
56
+ class PoProperty
57
+ attr_reader :entry
58
+ attr_reader :msgstr_index
61
59
 
62
- def value
63
- if entry.plural?
64
- entry.msgstr[value_index]
65
- else
66
- entry.msgstr
60
+ def initialize(entry, msgstr_index)
61
+ @entry = entry
62
+ @msgstr_index = msgstr_index
63
+ end
64
+
65
+ def value
66
+ if entry.plural?
67
+ entry.msgstr[msgstr_index]
68
+ else
69
+ entry.msgstr
70
+ end
67
71
  end
68
72
  end
69
- end
70
73
 
71
- def init
72
- @po = PoParser.parse('')
73
- @pomap = {}
74
- end
74
+ def init
75
+ @po = PoParser.parse('')
76
+ @pomap = {}
77
+ end
75
78
 
76
- def load
77
- content = read_contents(@path)
78
- @po = PoParser.parse(content)
79
- @pomap = init_pomap(@po)
80
- @properties = pomap_to_properties
81
- end
79
+ def load
80
+ @metadata.reset
81
+ content = read_contents(@path)
82
+ @po = PoParser.parse(content)
83
+ init_pomap(@po)
84
+ @properties = pomap_to_properties
85
+ end
82
86
 
83
- def add_created_by
84
- # TODO
85
- end
87
+ def add_created_by
88
+ header = po_header
89
+ header['PO-RevisionDate'] = Time.now.strftime(PO_DATE_FORMAT)
90
+ header['Last-Translator'] = 'Translatomatic ' + VERSION
91
+ end
86
92
 
87
- # create mapping from key to PoProperty
88
- def init_pomap(po)
89
- pomap = {}
90
- po.entries.each do |entry|
91
- add_entry(entry, :msgid, 0)
92
- add_entry(entry, :msgid_plural, 1) if entry.plural?
93
+ def po_header
94
+ # TODO: get or create header entry
95
+ {}
93
96
  end
94
- pomap
95
- end
96
97
 
97
- def pomap_to_properties
98
- @pomap.transform_values { |i| i.value }
99
- end
98
+ # create mapping from key to PoProperty
99
+ def init_pomap(po)
100
+ po.entries.each_with_index do |entry, i|
101
+ # skip PO file header if present
102
+ # TODO: update PO-Revision-Date, Last-Provider ?
103
+ next if entry.msgid == '' && i.zero?
104
+
105
+ if entry.extracted_comment
106
+ @metadata.parse_comment(entry.extracted_comment.value)
107
+ end
108
+ add_entry(entry, :msgid, 0)
109
+ add_entry(entry, :msgid_plural, 1) if entry.plural?
110
+ @metadata.clear_context
111
+ end
112
+ end
100
113
 
101
- def add_entry(entry, key, index)
102
- untranslated = entry.send(key)
103
- @pomap[untranslated] = PoProperty.new(entry, index) if untranslated
104
- end
114
+ def pomap_to_properties
115
+ @pomap.transform_values { |i| i.value.to_s }
116
+ end
105
117
 
106
- end # class
107
- end # module
118
+ def add_entry(entry, key, msgstr_index)
119
+ map_key = entry.send(key).to_s
120
+ return unless map_key
121
+
122
+ msg_context = entry.msgctxt
123
+ map_key = map_key + '.' + msg_context.to_s if msg_context
124
+ @pomap[map_key] = PoProperty.new(entry, msgstr_index)
125
+ @metadata.assign_key(map_key, keep_context: true)
126
+ end
127
+ end
128
+ end
129
+ end