* transcode.c (trans_open_i): check the result of rb_transcoding_open.
[ruby-svn.git] / lib / irb / locale.rb
blob855be310520d68fd4c7b6896c4b2f067a0d8cb26
2 #   irb/locale.rb - internationalization module
3 #       $Release Version: 0.9.5$
4 #       $Revision$
5 #       by Keiju ISHITSUKA(keiju@ruby-lang.org)
7 # --
9 #   
12 autoload :Kconv, "kconv"
14 module IRB
15   class Locale
16     @RCS_ID='-$Id$-'
18     JPDefaultLocale = "ja"
19     LOCALE_DIR = "/lc/"
21     def initialize(locale = nil)
22       @lang = locale || ENV["IRB_LANG"] || ENV["LC_MESSAGES"] || ENV["LC_ALL"] || ENV["LANG"] || "C" 
23     end
25     attr_reader :lang
27     def lc2kconv(lang)
28       case lang
29       when "ja_JP.ujis", "ja_JP.euc", "ja_JP.eucJP", "ja_JP.EUC-JP"
30         Kconv::EUC
31       when "ja_JP.sjis", "ja_JP.SJIS"
32         Kconv::SJIS
33       when /ja_JP.utf-?8/i
34         Kconv::UTF8
35       end
36     end
37     private :lc2kconv
39     def String(mes)
40       mes = super(mes)
41       case @lang
42       when /^ja/
43         mes = Kconv::kconv(mes, lc2kconv(@lang))
44       else
45         mes
46       end
47       mes
48     end
50     def format(*opts)
51       String(super(*opts))
52     end
54     def gets(*rs)
55       String(super(*rs))
56     end
58     def readline(*rs)
59       String(super(*rs))
60     end
62     def print(*opts)
63       ary = opts.collect{|opt| String(opt)}
64       super(*ary)
65     end
67     def printf(*opts)
68       s = format(*opts)
69       print s
70     end
72     def puts(*opts)
73       ary = opts.collect{|opt| String(opt)}
74       super(*ary)
75     end
77     def require(file, priv = nil)
78       rex = Regexp.new("lc/#{Regexp.quote(file)}\.(so|o|sl|rb)?")
79       return false if $".find{|f| f =~ rex}
81       case file
82       when /\.rb$/
83         begin
84           load(file, priv)
85           $".push file
86           return true
87         rescue LoadError
88         end
89       when /\.(so|o|sl)$/
90         return super
91       end
93       begin
94         load(f = file + ".rb")
95         $".push f  #"
96         return true
97       rescue LoadError
98         return ruby_require(file)
99       end
100     end
102     alias toplevel_load load
103     
104     def load(file, priv=nil)
105       dir = File.dirname(file)
106       dir = "" if dir == "."
107       base = File.basename(file)
109       if /^ja(_JP)?$/ =~ @lang
110         back, @lang = @lang, "C"
111       end
112       begin
113         if dir[0] == ?/ #/
114           lc_path = search_file(dir, base)
115           return real_load(lc_path, priv) if lc_path
116         end
117         
118         for path in $:
119           lc_path = search_file(path + "/" + dir, base)
120           return real_load(lc_path, priv) if lc_path
121         end
122       ensure
123         @lang = back if back
124       end
125       raise LoadError, "No such file to load -- #{file}"
126     end 
128     def real_load(path, priv)
129       src = self.String(File.read(path))
130       if priv
131         eval("self", TOPLEVEL_BINDING).extend(Module.new {eval(src, nil, path)})
132       else
133         eval(src, TOPLEVEL_BINDING, path)
134       end
135     end
136     private :real_load
138     def find(file , paths = $:)
139       dir = File.dirname(file)
140       dir = "" if dir == "."
141       base = File.basename(file)
142       if dir[0] == ?/ #/
143           return lc_path = search_file(dir, base)
144       else
145         for path in $:
146           if lc_path = search_file(path + "/" + dir, base)
147             return lc_path
148           end
149         end
150       end
151       nil
152     end
154     def search_file(path, file)
155       if File.exist?(p1 = path + lc_path(file, "C"))
156         if File.exist?(p2 = path + lc_path(file))
157           return p2
158         else
159         end
160         return p1
161       else
162       end
163       nil
164     end
165     private :search_file
167     def lc_path(file = "", lc = @lang)
168       case lc
169       when "C"
170         LOCALE_DIR + file
171       when /^ja/
172         LOCALE_DIR + "ja/" + file
173       else
174         LOCALE_DIR + @lang + "/" + file
175       end
176     end
177     private :lc_path
178   end