Class: GetText::PoMessage

Inherits:
Object
  • Object
show all
Includes:
PoMessageForRubyParser
Defined in:
lib/gettext/tools/pomessage.rb,
lib/gettext/tools/parser/ruby.rb

Overview

Contains data related to the expression or sentence that is to be translated.

Constant Summary collapse

PARAMS =
{
  :normal => [:msgid, :separator],
  :plural => [:msgid, :msgid_plural, :separator],
  :msgctxt => [:msgctxt, :msgid],
  :msgctxt_plural => [:msgctxt, :msgid, :msgid_plural]
}
@@max_line_length =
70

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Methods included from PoMessageForRubyParser

#advance_to_next_attribute, #init_param, #set_current_attribute

Constructor Details

#initialize(type) ⇒ PoMessage

Create the object. type should be :normal, :plural, :msgctxt or :msgctxt_plural.



72
73
74
75
76
# File 'lib/gettext/tools/pomessage.rb', line 72

def initialize(type)
  @type = type
  @sources = []
  @param_type = PARAMS[@type]
end

Instance Attribute Details

#commentObject

Returns the value of attribute comment.



69
70
71
# File 'lib/gettext/tools/pomessage.rb', line 69

def comment
  @comment
end

#msgctxtObject

Returns the value of attribute msgctxt.



67
68
69
# File 'lib/gettext/tools/pomessage.rb', line 67

def msgctxt
  @msgctxt
end

#msgidObject

Returns the value of attribute msgid.



63
64
65
# File 'lib/gettext/tools/pomessage.rb', line 63

def msgid
  @msgid
end

#msgid_pluralObject

Options



65
66
67
# File 'lib/gettext/tools/pomessage.rb', line 65

def msgid_plural
  @msgid_plural
end

#separatorObject

Returns the value of attribute separator.



66
67
68
# File 'lib/gettext/tools/pomessage.rb', line 66

def separator
  @separator
end

#sourcesObject

“file1:line1”, “file2:line2”, …


68
69
70
# File 'lib/gettext/tools/pomessage.rb', line 68

def sources
  @sources
end

#typeObject

Required



62
63
64
# File 'lib/gettext/tools/pomessage.rb', line 62

def type
  @type
end

Class Method Details

.escape(string) ⇒ Object



37
38
39
40
41
42
43
44
45
46
# File 'lib/gettext/tools/pomessage.rb', line 37

def escape(string)
  string.gsub(/([\\"\n])/) do
    special_character = $1
    if special_character == "\n"
      "\\n"
    else
      "\\#{special_character}"
    end
  end
end

.max_line_lengthObject

Gets the max line length.



57
58
59
# File 'lib/gettext/tools/pomessage.rb', line 57

def self.max_line_length
  @@max_line_length
end

.max_line_length=(len) ⇒ Object

Sets the max line length.



52
53
54
# File 'lib/gettext/tools/pomessage.rb', line 52

def self.max_line_length=(len)
  @@max_line_length = len
end

.new_from_ary(ary) ⇒ Object

For backward comatibility. This doesn’t support “comment”. ary = [msgid1, “file1:line1”, “file2:line”]



195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
# File 'lib/gettext/tools/pomessage.rb', line 195

def self.new_from_ary(ary)
  ary = ary.dup
  msgid = ary.shift
  sources = ary
  type = :normal
  msgctxt = nil
  msgid_plural = nil

  if msgid.include? "\004"
    msgctxt, msgid = msgid.split(/\004/)
    type = :msgctxt
  end
  if msgid.include? "\000"
    ids = msgid.split(/\000/)
    msgid = ids[0]
    msgid_plural = ids[1]
    if type == :msgctxt
      type = :msgctxt_plural
    else
      type = :plural
    end
  end
  ret = self.new(type)
  ret.msgid = msgid
  ret.sources = sources
  ret.msgctxt = msgctxt
  ret.msgid_plural = msgid_plural
  ret
end

Instance Method Details

#==(other) ⇒ Object

Checks if the other translation target is mergeable with the current one. Relevant are msgid and translation context (msgctxt).



97
98
99
# File 'lib/gettext/tools/pomessage.rb', line 97

def ==(other)
  other && other.msgid == self.msgid && other.msgctxt == self.msgctxt
end

#[](number) ⇒ Object

Raises:



225
226
227
228
229
# File 'lib/gettext/tools/pomessage.rb', line 225

def [](number)
  param = @param_type[number]
  raise ParseError, 'no more string parameters expected' unless param
  send param
end

#add_comment(new_comment) ⇒ Object

Support for extracted comments. Explanation s. www.gnu.org/software/gettext/manual/gettext.html#Names



80
81
82
83
84
85
86
# File 'lib/gettext/tools/pomessage.rb', line 80

def add_comment(new_comment)
  if (new_comment and ! new_comment.empty?)
    @comment ||= ""
    @comment += new_comment
  end
  to_s
end

#escaped(param_name) ⇒ Object

Returns a parameter representation suitable for po-files and other purposes.



90
91
92
93
# File 'lib/gettext/tools/pomessage.rb', line 90

def escaped(param_name)
  orig = self.send param_name
  self.class.escape(orig.gsub(/\r/, ""))
end

#initialize_oldPoMessage

Create the object. type should be :normal, :plural, :msgctxt or :msgctxt_plural.

Returns:

  • (PoMessage)

    a new instance of PoMessage



103
104
105
106
107
# File 'lib/gettext/tools/parser/ruby.rb', line 103

def initialize(type)
  @type = type
  @sources = []
  @param_type = PARAMS[@type]
end

#merge(other) ⇒ Object

Merges two translation targets with the same msgid and returns the merged result. If one is declared as plural and the other not, then the one with the plural wins.

Raises:



104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
# File 'lib/gettext/tools/pomessage.rb', line 104

def merge(other)
  return self unless other
  raise ParseError, "Translation targets do not match: \n" \
  "  self: #{self.inspect}\n  other: '#{other.inspect}'" unless self == other
  if other.msgid_plural && !self.msgid_plural
    res = other
    unless (res.sources.include? self.sources[0])
      res.sources += self.sources
      res.add_comment(self.comment)
    end
  else
    res = self
    unless (res.sources.include? other.sources[0])
      res.sources += other.sources
      res.add_comment(other.comment)
    end
  end
  res
end

#msgctxt?Boolean

Returns true if the type is kind of msgctxt. And if this is a kind of msgctxt and msgctxt property is nil, then raise an RuntimeException.

Returns:

  • (Boolean)


165
166
167
168
169
170
# File 'lib/gettext/tools/pomessage.rb', line 165

def msgctxt?
  if [:msgctxt, :msgctxt_plural].include? @type
    raise "This PoMessage is a kind of msgctxt but the msgctxt property is nil. msgid: #{msgid}" unless @msgctxt
    true
  end
end

#plural?Boolean

Returns true if the type is kind of plural. And if this is a kind of plural and msgid_plural property is nil, then raise an RuntimeException.

Returns:

  • (Boolean)


175
176
177
178
179
180
# File 'lib/gettext/tools/pomessage.rb', line 175

def plural?
  if [:plural, :msgctxt_plural].include? @type
    raise "This PoMessage is a kind of plural but the msgid_plural property is nil. msgid: #{msgid}" unless @msgid_plural
    true
  end
end

#to_po_strObject

Output the po message for the po-file.



125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
# File 'lib/gettext/tools/pomessage.rb', line 125

def to_po_str
  raise "msgid is nil." unless @msgid
  raise "sources is nil." unless @sources

  str = ""
  # extracted comments
  if comment
    comment.split("\n").each do |comment_line|
      str << "\n#. #{comment_line.strip}"
    end
  end

  # references
  curr_pos = @@max_line_length
  sources.each do |e|
    if curr_pos + e.size > @@max_line_length
      str << "\n#:"
      curr_pos = 3
    else
      curr_pos += (e.size + 1)
    end
    str << " " << e
  end

  # msgctxt, msgid, msgstr
  str << "\nmsgctxt \"" << msgctxt << "\"" if msgctxt?
  str << "\nmsgid \"" << escaped(:msgid) << "\"\n"
  if plural?
    str << "msgid_plural \"" << escaped(:msgid_plural) << "\"\n"
    str << "msgstr[0] \"\"\n"
    str << "msgstr[1] \"\"\n"
  else
    str << "msgstr \"\"\n"
  end
  str
end