Class: Knj::Gettext_threadded

Inherits:
Object
  • Object
show all
Defined in:
lib/knj/gettext_threadded.rb

Overview

This class reads .po-files generated by something like POEdit and can be used to run multi-language applications or websites.

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(args = {}) ⇒ Gettext_threadded

Initializes various data.



10
11
12
13
14
15
16
17
# File 'lib/knj/gettext_threadded.rb', line 10

def initialize(args = {})
  @args = {
    :encoding => "utf-8"
  }.merge(args)
  @langs = {}
  @dirs = []
  load_dir(@args["dir"]) if @args["dir"]
end

Instance Attribute Details

#argsObject (readonly)

Config-hash that contains encoding and more.



7
8
9
# File 'lib/knj/gettext_threadded.rb', line 7

def args
  @args
end

#langsObject (readonly)

Hash that contains all translations loaded.



4
5
6
# File 'lib/knj/gettext_threadded.rb', line 4

def langs
  @langs
end

Instance Method Details

#gettext(str, locale) ⇒ Object

This function can be used to make your string be recognized by gettext tools.



72
73
74
# File 'lib/knj/gettext_threadded.rb', line 72

def gettext(str, locale)
  return trans(locale, str)
end

#lang_optsObject

Returns a hash with the language ID string as key and the language human-readable-title as value.



77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
# File 'lib/knj/gettext_threadded.rb', line 77

def lang_opts
  langs = {}
  @langs.keys.sort.each do |lang|
    title = nil

    @dirs.each do |dir|
      title_file_path = "#{dir}/#{lang}/title.txt"
      if File.exist?(title_file_path)
        title = File.read(title_file_path, {:encoding => @args[:encoding]}).to_s.strip
      else
        title = lang.to_s.strip
      end

      break if title
    end

    langs[lang] = title
  end

  return langs
end

#load_dir(dir) ⇒ Object

Loads a ‘locales’-directory with .mo- and .po-files and fills the ‘@langs’-hash.

Examples

gtext.load_dir(“#File.dirname(__FILE__)/../locales”)



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
# File 'lib/knj/gettext_threadded.rb', line 22

def load_dir(dir)
  @dirs << dir
  check_folders = ["LC_MESSAGES", "LC_ALL"]

  Dir.foreach(dir) do |file|
    fn = "#{dir}/#{file}"
    if File.directory?(fn) and file.match(/^[a-z]{2}_[A-Z]{2}$/)
      @langs[file] = {} if !@langs[file]

      check_folders.each do |fname|
        fpath = "#{dir}/#{file}/#{fname}"

        if File.exist?(fpath) and File.directory?(fpath)
          Dir.foreach(fpath) do |pofile|
            if pofile.match(/\.po$/)
              pofn = "#{dir}/#{file}/#{fname}/#{pofile}"

              cont = nil
              File.open(pofn, "r", {:encoding => @args[:encoding]}) do |fp|
                cont = fp.read.encode("utf-8")
              end

              cont.scan(/msgid\s+\"(.+)\"(\r|)\nmsgstr\s+\"(.+)\"(\r|)\n(\r|)\n/) do |match|
                @langs[file][match[0]] = match[2].to_s.encode("utf-8")
              end
            end
          end
        end
      end
    end
  end
end

#trans(locale, str) ⇒ Object

Translates a given string to a given locale from the read .po-files.

Examples

str = “Hello” #=> “Hello” gtext.trans(“da_DK”, str) #=> “Hej”



59
60
61
62
63
64
65
66
67
68
69
# File 'lib/knj/gettext_threadded.rb', line 59

def trans(locale, str)
  locale = locale.to_s
  str = str.to_s

  if !@langs.key?(locale)
    raise "Locale was not found: '#{locale}' in '#{@langs.keys.join(", ")}'."
  end

  return str if !@langs[locale].key?(str)
  return @langs[locale][str]
end