1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
|
# encoding: utf-8
module Twine
module Formatters
class Gettext < Abstract
def format_name
'gettext'
end
def extension
'.po'
end
def default_file_name
'strings.po'
end
def determine_language_given_path(path)
path_arr = path.split(File::SEPARATOR)
path_arr.each do |segment|
match = /(..)\.po$/.match(segment)
if match
return match[1]
end
end
return
end
def read(io, lang)
comment_regex = /#.? *"(.*)"$/
key_regex = /msgctxt *"(.*)"$/
value_regex = /msgstr *"(.*)"$/m
while item = io.gets("\n\n")
key = nil
value = nil
comment = nil
comment_match = comment_regex.match(item)
if comment_match
comment = comment_match[1]
end
key_match = key_regex.match(item)
if key_match
key = key_match[1].gsub('\\"', '"')
end
value_match = value_regex.match(item)
if value_match
value = value_match[1].gsub(/"\n"/, '').gsub('\\"', '"')
end
if key and key.length > 0 and value and value.length > 0
set_translation_for_key(key, lang, value)
if comment and comment.length > 0 and !comment.start_with?("SECTION:")
set_comment_for_key(key, comment)
end
comment = nil
end
end
end
def format_file(lang)
@default_lang = twine_file.language_codes[0]
result = super
@default_lang = nil
result
end
def format_header(lang)
"msgid \"\"\nmsgstr \"\"\n\"Language: #{lang}\\n\"\n\"X-Generator: Twine #{Twine::VERSION}\\n\"\n"
end
def format_section_header(section)
"# SECTION: #{section.name}"
end
def should_include_definition(definition, lang)
super and !definition.translation_for_lang(@default_lang).nil?
end
def format_comment(definition, lang)
"#. \"#{escape_quotes(definition.comment)}\"\n" if definition.comment
end
def format_key_value(definition, lang)
value = definition.translation_for_lang(lang)
[format_key(definition.key.dup), format_base_translation(definition), format_value(value.dup)].compact.join
end
def format_key(key)
"msgctxt \"#{key}\"\n"
end
def format_base_translation(definition)
"msgid \"#{definition.translations[@default_lang]}\"\n"
end
def format_value(value)
"msgstr \"#{value}\"\n"
end
end
end
end
Twine::Formatters.formatters << Twine::Formatters::Gettext.new
|