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
|
require 'fast_gettext/vendor/mofile'
module FastGettext
# Responsibility:
# - abstract mo files for Mo Repository
class MoFile
PLURAL_SEPERATOR = "\000"
# file => path or FastGettext::GetText::MOFile
def initialize(file)
if file.is_a? FastGettext::GetText::MOFile
@data = file
else
@data = FastGettext::GetText::MOFile.open(file, "UTF-8")
end
make_singular_and_plural_available
end
def [](key)
@data[key]
end
#returns the plural forms or all singular translations that where found
# Car, Cars => [Auto,Autos] or []
def plural(*msgids)
split_plurals(self[msgids*PLURAL_SEPERATOR].to_s)
end
def pluralisation_rule
#gettext uses 0 as default rule, which would turn off all pluralisation, very clever...
#additionally parsing fails when directly accessing po files, so this line was taken from gettext/mofile
(@data['']||'').split("\n").each do |line|
return lambda{|n|eval($2)} if /^Plural-Forms:\s*nplurals\s*\=\s*(\d*);\s*plural\s*\=\s*([^;]*)\n?/ =~ line
end
nil
end
def self.empty
MoFile.new(File.join(File.dirname(__FILE__),'vendor','empty.mo'))
end
private
#(if plural==singular, prefer singular)
def make_singular_and_plural_available
data = {}
@data.each do |key,translation|
next unless key.include? PLURAL_SEPERATOR
singular, plural = split_plurals(key)
translation = split_plurals(translation)
data[singular] ||= translation[0]
data[plural] ||= translation[1]
end
@data.merge!(data){|key,old,new| old}
end
def split_plurals(singular_plural)
singular_plural.split(PLURAL_SEPERATOR)
end
end
end
|