locale 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/COPYING +55 -0
- data/ChangeLog +113 -0
- data/README +100 -0
- data/Rakefile +77 -0
- data/doc/classes/Locale/Driver.html +375 -0
- data/doc/classes/Locale/Driver/CGI.html +502 -0
- data/doc/classes/Locale/Driver/Env.html +440 -0
- data/doc/classes/Locale/Driver/JRuby.html +390 -0
- data/doc/classes/Locale/Driver/Posix.html +431 -0
- data/doc/classes/Locale/Driver/Win32.html +398 -0
- data/doc/classes/Locale/Driver/Win32Table.html +356 -0
- data/doc/classes/Locale/Info.html +586 -0
- data/doc/classes/Locale/Info/Language.html +764 -0
- data/doc/classes/Locale/Info/Region.html +470 -0
- data/doc/classes/Locale/Tag/Cldr.html +547 -0
- data/doc/classes/Locale/Tag/Common.html +655 -0
- data/doc/classes/Locale/Tag/Illegular.html +424 -0
- data/doc/classes/Locale/Tag/Posix.html +612 -0
- data/doc/classes/Locale/Tag/Rfc.html +610 -0
- data/doc/classes/Locale/Tag/Simple.html +684 -0
- data/doc/classes/Locale/TagList.html +783 -0
- data/doc/classes/Locale/Util.html +476 -0
- data/doc/classes/Locale/Util/Memoizable.html +356 -0
- data/doc/created.rid +1 -0
- data/doc/files/ChangeLog.html +497 -0
- data/doc/files/README.html +525 -0
- data/doc/files/lib/locale/driver/cgi_rb.html +342 -0
- data/doc/files/lib/locale/driver/env_rb.html +354 -0
- data/doc/files/lib/locale/driver/jruby_rb.html +359 -0
- data/doc/files/lib/locale/driver/posix_rb.html +349 -0
- data/doc/files/lib/locale/driver/win32_rb.html +359 -0
- data/doc/files/lib/locale/driver/win32_table_rb.html +342 -0
- data/doc/files/lib/locale/info/language_rb.html +353 -0
- data/doc/files/lib/locale/info/region_rb.html +353 -0
- data/doc/files/lib/locale/info_rb.html +354 -0
- data/doc/files/lib/locale/tag/cldr_rb.html +342 -0
- data/doc/files/lib/locale/tag/common_rb.html +342 -0
- data/doc/files/lib/locale/tag/illegular_rb.html +349 -0
- data/doc/files/lib/locale/tag/posix_rb.html +342 -0
- data/doc/files/lib/locale/tag/rfc_rb.html +342 -0
- data/doc/files/lib/locale/tag/simple_rb.html +349 -0
- data/doc/files/lib/locale/tag_rb.html +374 -0
- data/doc/files/lib/locale/taglist_rb.html +342 -0
- data/doc/files/lib/locale/util/memoizable_rb.html +360 -0
- data/doc/files/lib/locale/version_rb.html +342 -0
- data/doc/files/lib/locale_rb.html +379 -0
- data/doc/fr_class_index.html +20 -0
- data/doc/fr_file_index.html +23 -0
- data/doc/fr_method_index.html +80 -0
- data/doc/index.html +1 -0
- data/doc/rdoc-style.css +320 -0
- data/lib/locale.rb +248 -0
- data/lib/locale/data/languages.tab.gz +0 -0
- data/lib/locale/data/regions.tab.gz +0 -0
- data/lib/locale/driver/cgi.rb +132 -0
- data/lib/locale/driver/env.rb +64 -0
- data/lib/locale/driver/jruby.rb +53 -0
- data/lib/locale/driver/posix.rb +49 -0
- data/lib/locale/driver/win32.rb +61 -0
- data/lib/locale/driver/win32_table.rb +298 -0
- data/lib/locale/info.rb +12 -0
- data/lib/locale/info/language.rb +134 -0
- data/lib/locale/info/region.rb +74 -0
- data/lib/locale/tag.rb +36 -0
- data/lib/locale/tag/cldr.rb +93 -0
- data/lib/locale/tag/common.rb +122 -0
- data/lib/locale/tag/illegular.rb +38 -0
- data/lib/locale/tag/posix.rb +97 -0
- data/lib/locale/tag/rfc.rb +106 -0
- data/lib/locale/tag/simple.rb +145 -0
- data/lib/locale/taglist.rb +93 -0
- data/lib/locale/util/memoizable.rb +76 -0
- data/lib/locale/version.rb +12 -0
- data/samples/cgi/README +20 -0
- data/samples/cgi/cookie.cgi +62 -0
- data/samples/cgi/http.rb +52 -0
- data/samples/cgi/index.cgi +90 -0
- data/samples/cgi/locale.css +115 -0
- data/samples/sample_1.rb +25 -0
- data/samples/sample_info.rb +6 -0
- data/setup.rb +1585 -0
- data/test/test_detect_cgi.rb +179 -0
- data/test/test_detect_general.rb +159 -0
- data/test/test_info.rb +28 -0
- data/test/test_tag.rb +1183 -0
- data/test/test_thread.rb +37 -0
- metadata +162 -0
data/lib/locale/info.rb
ADDED
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
# encoding: UTF-8
|
|
2
|
+
=begin
|
|
3
|
+
|
|
4
|
+
language.rb - Locale::Info::Language class
|
|
5
|
+
|
|
6
|
+
Copyright (C) 2008 Masao Mutoh
|
|
7
|
+
|
|
8
|
+
Original Author:: Brian Pontarelli
|
|
9
|
+
|
|
10
|
+
$Id: language.rb 27 2008-12-03 15:06:50Z mutoh $
|
|
11
|
+
=end
|
|
12
|
+
|
|
13
|
+
require 'zlib'
|
|
14
|
+
|
|
15
|
+
module Locale
|
|
16
|
+
|
|
17
|
+
module Info
|
|
18
|
+
# This class contains all the of the ISO information for the ISO 639-3
|
|
19
|
+
# languages. This class is immutable once constructed.
|
|
20
|
+
class Language
|
|
21
|
+
attr_reader :two_code, :three_code, :scope, :type, :name
|
|
22
|
+
|
|
23
|
+
#
|
|
24
|
+
# Constructs a new Language instance.
|
|
25
|
+
#
|
|
26
|
+
# * code The 2 or 3 digit ISO 639-3 language code.
|
|
27
|
+
# * scope A single character that defines the ISO scope of the language - <tt>(I)ndividual</tt>,
|
|
28
|
+
# <tt>(M)acrolanguage</tt>, or <tt>(S)pecial</tt>.
|
|
29
|
+
# * type A single character that defines the ISO type of the language - <tt>(A)ncient</tt>,
|
|
30
|
+
# <tt>(C)onstructed</tt>, <tt>(E)xtinct</tt>, <tt>(H)istorical</tt>, <tt>(L)iving</tt>,
|
|
31
|
+
# or <tt>(S)pecial</tt>.
|
|
32
|
+
# * name The name of the language.
|
|
33
|
+
#
|
|
34
|
+
def initialize(two_code, three_code, scope, type, name)
|
|
35
|
+
@two_code, @three_code, @scope, @type, @name = two_code, three_code, scope, type, name
|
|
36
|
+
|
|
37
|
+
@individual = (scope == "I")
|
|
38
|
+
@macro = (scope == "M")
|
|
39
|
+
@special = (scope == "S")
|
|
40
|
+
@constructed = (type == "C")
|
|
41
|
+
@living = (type == "L")
|
|
42
|
+
@extinct = (type == "E")
|
|
43
|
+
@ancient = (type == "A")
|
|
44
|
+
@historical = (type == "H")
|
|
45
|
+
@special_type = (type == "S")
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
# Returns true if the language is an individual language according to the ISO 639-3 data.
|
|
49
|
+
def individual?; @individual; end
|
|
50
|
+
|
|
51
|
+
# Returns true if the language is a macro language according to the ISO 639-3 data.
|
|
52
|
+
def macro?; @macro; end
|
|
53
|
+
|
|
54
|
+
# Returns true if the language is a special language according to the ISO 639-3 data.
|
|
55
|
+
def special?; @special; end
|
|
56
|
+
|
|
57
|
+
# Returns true if the language is a constructed language according to the ISO 639-3 data.
|
|
58
|
+
def constructed?; @constructed; end
|
|
59
|
+
|
|
60
|
+
# Returns true if the language is a living language according to the ISO 639-3 data.
|
|
61
|
+
def living?; @living; end
|
|
62
|
+
|
|
63
|
+
# Returns true if the language is an extinct language according to the ISO 639-3 data.
|
|
64
|
+
def extinct?; @extinct; end
|
|
65
|
+
|
|
66
|
+
# Returns true if the language is an ancient language according to the ISO 639-3 data.
|
|
67
|
+
def ancient?; @ancient; end
|
|
68
|
+
|
|
69
|
+
# Returns true if the language is an historical language according to the ISO 639-3 data.
|
|
70
|
+
def historical?; @historical; end
|
|
71
|
+
|
|
72
|
+
# Returns true if the language is a special type language according to the ISO 639-3 data.
|
|
73
|
+
def special_type?; @special_type; end
|
|
74
|
+
|
|
75
|
+
# Returns the two or three code.
|
|
76
|
+
def to_s
|
|
77
|
+
two_code || tree_code
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
# Returns this object is valid as ISO 639 data.
|
|
81
|
+
def iso_language?
|
|
82
|
+
@@lang_two_codes[two_code] != nil || @@lang_three_codes[three_code] != nil
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
@@lang_two_codes = Hash.new
|
|
87
|
+
@@lang_three_codes = Hash.new
|
|
88
|
+
|
|
89
|
+
Zlib::GzipReader.open(File.dirname(__FILE__) + "/../data/languages.tab.gz") do |gz|
|
|
90
|
+
gz.readlines.each do |l|
|
|
91
|
+
unless l =~ /^\s*$/
|
|
92
|
+
parts = l.split(/\t/)
|
|
93
|
+
lang = Language.new(parts[2], parts[0], parts[3], parts[4], parts[5].strip)
|
|
94
|
+
@@lang_three_codes[parts[0]] = lang
|
|
95
|
+
@@lang_two_codes[parts[2]] = lang if parts[2].length > 0
|
|
96
|
+
end
|
|
97
|
+
end
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
module_function
|
|
101
|
+
|
|
102
|
+
# Returns a hash of all the ISO languages. The hash is {String, language} where
|
|
103
|
+
# the string is the 3 digit language code from the ISO 639 data. This contains
|
|
104
|
+
# all of the data from the ISO 639-3 data (7600 Languages).
|
|
105
|
+
#
|
|
106
|
+
# Need to require 'locale/info' or 'locale/language'.
|
|
107
|
+
def three_languages
|
|
108
|
+
@@lang_three_codes
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
# Returns a hash of all the ISO languages. The hash is {String, language} where
|
|
112
|
+
# the string is the 2 digit language code from the ISO 639-1 data. This contains
|
|
113
|
+
# all of the data from the ISO 639-1 data (186 Languages).
|
|
114
|
+
#
|
|
115
|
+
# Need to require 'locale/info' or 'locale/language'.
|
|
116
|
+
def two_languages
|
|
117
|
+
@@lang_two_codes
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
# Returns the language for the given 2 or 3 digit code.
|
|
121
|
+
#
|
|
122
|
+
# Need to require 'locale/info' or 'locale/language'.
|
|
123
|
+
def get_language(code)
|
|
124
|
+
@@lang_three_codes[code] || @@lang_two_codes[code]
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
# Returns the language code is valid.
|
|
128
|
+
#
|
|
129
|
+
# Need to require 'locale/info' or 'locale/language'.
|
|
130
|
+
def language_code?(code)
|
|
131
|
+
get_language(code) != nil
|
|
132
|
+
end
|
|
133
|
+
end
|
|
134
|
+
end
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
# encoding: UTF-8
|
|
2
|
+
=begin
|
|
3
|
+
|
|
4
|
+
region.rb - Locale::Info::Region class
|
|
5
|
+
|
|
6
|
+
Copyright (C) 2008 Masao Mutoh
|
|
7
|
+
|
|
8
|
+
First Author:: Brian Pontarelli
|
|
9
|
+
|
|
10
|
+
$Id: region.rb 27 2008-12-03 15:06:50Z mutoh $
|
|
11
|
+
=end
|
|
12
|
+
|
|
13
|
+
require 'zlib'
|
|
14
|
+
|
|
15
|
+
module Locale
|
|
16
|
+
|
|
17
|
+
module Info
|
|
18
|
+
# This class models out a region/country from the ISO 3166 standard for region codes.
|
|
19
|
+
# In ISO3166, it's called "Country" but Ruby/Locale the word "Region" instead.
|
|
20
|
+
class Region
|
|
21
|
+
attr_reader :code, :name
|
|
22
|
+
|
|
23
|
+
# code:: The 2 or 3 digit ISO 3166 region code.
|
|
24
|
+
# name:: The name of the region.
|
|
25
|
+
def initialize(code, name)
|
|
26
|
+
@code = code
|
|
27
|
+
@name = name
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def iso_region?
|
|
31
|
+
@@regions[code] != nil
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def to_s
|
|
35
|
+
"#{code}"
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
@@regions = Hash.new
|
|
40
|
+
Zlib::GzipReader.open(File.dirname(__FILE__) + "/../data/regions.tab.gz") do |gz|
|
|
41
|
+
gz.readlines.each do |l|
|
|
42
|
+
unless l =~ /^\s*$/
|
|
43
|
+
parts = l.split(/\t/)
|
|
44
|
+
region = Region.new(parts[0], parts[1].strip)
|
|
45
|
+
@@regions[parts[0]] = region
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
module_function
|
|
51
|
+
|
|
52
|
+
# Returns a hash of all the ISO regions. The hash is {String, Region} where
|
|
53
|
+
# the string is the 2 digit region code from the ISO 3166 data.
|
|
54
|
+
#
|
|
55
|
+
# You need to require 'locale/info' or 'locale/region'.
|
|
56
|
+
def regions
|
|
57
|
+
@@regions
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
# Returns the region for the given code.
|
|
61
|
+
#
|
|
62
|
+
# You need to require 'locale/info' or 'locale/info/region'.
|
|
63
|
+
def get_region(code)
|
|
64
|
+
@@regions[code]
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
# Returns the region code is valid.
|
|
68
|
+
#
|
|
69
|
+
# You need to require 'locale/info' or 'locale/info/region'.
|
|
70
|
+
def valid_region_code?(code)
|
|
71
|
+
@@regions[code] != nil
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
end
|
data/lib/locale/tag.rb
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
=begin
|
|
2
|
+
|
|
3
|
+
tag.rb - Locale::Tag module
|
|
4
|
+
|
|
5
|
+
Copyright (C) 2008 Masao Mutoh
|
|
6
|
+
|
|
7
|
+
$Id: tag.rb 27 2008-12-03 15:06:50Z mutoh $
|
|
8
|
+
=end
|
|
9
|
+
|
|
10
|
+
require 'locale/tag/simple'
|
|
11
|
+
require 'locale/tag/illegular'
|
|
12
|
+
require 'locale/tag/common'
|
|
13
|
+
require 'locale/tag/rfc'
|
|
14
|
+
require 'locale/tag/cldr'
|
|
15
|
+
require 'locale/tag/posix'
|
|
16
|
+
|
|
17
|
+
module Locale
|
|
18
|
+
|
|
19
|
+
# Language tag / locale identifiers.
|
|
20
|
+
module Tag
|
|
21
|
+
module_function
|
|
22
|
+
# Parse a language tag/locale name and return Locale::Tag
|
|
23
|
+
# object.
|
|
24
|
+
# * tag: a tag as a String. e.g.) ja-Hira-JP
|
|
25
|
+
# * Returns: a Locale::Tag subclass.
|
|
26
|
+
def parse(tag)
|
|
27
|
+
# Common is not used here.
|
|
28
|
+
[Simple, Common, Rfc, Cldr, Posix].each do |parser|
|
|
29
|
+
ret = parser.parse(tag)
|
|
30
|
+
return ret if ret
|
|
31
|
+
end
|
|
32
|
+
Locale::Tag::Illegular.new(tag)
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
=begin
|
|
2
|
+
locale/tag/cldr.rb - Locale::Tag::CLDR
|
|
3
|
+
|
|
4
|
+
Copyright (C) 2008 Masao Mutoh
|
|
5
|
+
|
|
6
|
+
You may redistribute it and/or modify it under the same
|
|
7
|
+
license terms as Ruby.
|
|
8
|
+
|
|
9
|
+
$Id: cldr.rb 27 2008-12-03 15:06:50Z mutoh $
|
|
10
|
+
=end
|
|
11
|
+
|
|
12
|
+
module Locale #:nodoc:
|
|
13
|
+
module Tag #:nodoc:
|
|
14
|
+
|
|
15
|
+
# Unicode locale identifier class for CLDR-1.6.1.
|
|
16
|
+
# (Unicode Common Locale Data Repository).
|
|
17
|
+
class Cldr < Common
|
|
18
|
+
|
|
19
|
+
VARIANT = "(#{ALPHANUM}{5,8}|#{DIGIT}#{ALPHANUM}{3})"
|
|
20
|
+
EXTENSION = "#{ALPHANUM}+=[a-z0-9\-]+"
|
|
21
|
+
|
|
22
|
+
TAG_RE = /\A#{LANGUAGE}(?:[-_]#{SCRIPT})?
|
|
23
|
+
(?:[-_]#{REGION})?((?:[-_]#{VARIANT})*
|
|
24
|
+
(?:@(#{EXTENSION};?)+)*)\Z/ix
|
|
25
|
+
|
|
26
|
+
attr_reader :extensions
|
|
27
|
+
|
|
28
|
+
# Create Locale::Tag::Cldr.
|
|
29
|
+
#
|
|
30
|
+
# variants should be upcase.
|
|
31
|
+
def initialize(language, script = nil, region = nil,
|
|
32
|
+
variants = [], extensions = {})
|
|
33
|
+
@extensions = extensions
|
|
34
|
+
super(language, script, region, variants.map{|v| v.upcase})
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
# Parse the language tag and return the new Locale::Tag::CLDR.
|
|
38
|
+
def self.parse(tag)
|
|
39
|
+
if tag =~ /\APOSIX\Z/ # This is the special case of POSIX locale but match this regexp.
|
|
40
|
+
nil
|
|
41
|
+
elsif tag =~ TAG_RE
|
|
42
|
+
lang, script, region, subtag = $1, $2, $3, $4
|
|
43
|
+
|
|
44
|
+
extensions = {}
|
|
45
|
+
subtag.scan(/#{EXTENSION}/i).each{|v|
|
|
46
|
+
subtag.sub!(v, "")
|
|
47
|
+
key, type = v.split("=")
|
|
48
|
+
extensions[key] = type
|
|
49
|
+
}
|
|
50
|
+
variants = subtag.scan(/#{VARIANT}/i).collect{|v| v[0].upcase}
|
|
51
|
+
|
|
52
|
+
ret = self.new(lang, script, region, variants, extensions)
|
|
53
|
+
ret.tag = tag
|
|
54
|
+
ret
|
|
55
|
+
else
|
|
56
|
+
nil
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
# Returns the language tag.
|
|
61
|
+
# (e.g.) "ja_Hira_JP_VARIANT1_VARIANT2@foo1=var1;foo2=var2"
|
|
62
|
+
def to_s
|
|
63
|
+
s = super
|
|
64
|
+
if @extensions.size > 0
|
|
65
|
+
s << "@" << @extensions.to_a.sort.map{|k, v| "#{k}=#{v}"}.join(";")
|
|
66
|
+
end
|
|
67
|
+
s
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
# Sets the extensions.
|
|
71
|
+
def extensions=(val)
|
|
72
|
+
clear
|
|
73
|
+
@extensions = val
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
private
|
|
77
|
+
def convert_to(klass)
|
|
78
|
+
if klass == Cldr
|
|
79
|
+
klass.new(language, script, region, variants, extensions)
|
|
80
|
+
elsif klass == Rfc
|
|
81
|
+
exts = []
|
|
82
|
+
@extensions.each do |k, v|
|
|
83
|
+
exts << "k-#{k[0,8]}-#{v[0,8]}"
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
klass.new(language, script, region, variants, exts)
|
|
87
|
+
else
|
|
88
|
+
super
|
|
89
|
+
end
|
|
90
|
+
end
|
|
91
|
+
end
|
|
92
|
+
end
|
|
93
|
+
end
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
=begin
|
|
2
|
+
locale/tag/common.rb - Locale::Tag::Common
|
|
3
|
+
|
|
4
|
+
Copyright (C) 2008 Masao Mutoh
|
|
5
|
+
|
|
6
|
+
You may redistribute it and/or modify it under the same
|
|
7
|
+
license terms as Ruby.
|
|
8
|
+
|
|
9
|
+
$Id: common.rb 27 2008-12-03 15:06:50Z mutoh $
|
|
10
|
+
=end
|
|
11
|
+
|
|
12
|
+
module Locale
|
|
13
|
+
module Tag
|
|
14
|
+
# Common Language tag class for Ruby.
|
|
15
|
+
# Java and MS Windows use this format.
|
|
16
|
+
#
|
|
17
|
+
# * ja (language: RFC4646)
|
|
18
|
+
# * ja_JP (country: RFC4646(2 alpha or 3 digit))
|
|
19
|
+
# * ja-JP
|
|
20
|
+
# * ja_Hira_JP (script: 4 characters)
|
|
21
|
+
# * ja-Hira-JP
|
|
22
|
+
# * ja_Hira_JP_MOBILE (variants: more than 2 characters or 3 digit)
|
|
23
|
+
# * ja_Hira_JP_MOBILE_IPHONE (2 variants example)
|
|
24
|
+
#
|
|
25
|
+
class Common < Simple
|
|
26
|
+
LANGUAGE = "(#{ALPHA}{2,3}|#{ALPHA}{4}|#{ALPHA}{5,8})" #RFC4646 (ISO639/reserved/registered)
|
|
27
|
+
SCRIPT = "(#{ALPHA}{4})"
|
|
28
|
+
VARIANT = "(#{ALPHANUM}{3,}|#{DIGIT}#{ALPHANUM}{3})" #RFC3066 compatible
|
|
29
|
+
|
|
30
|
+
TAG_RE = /\A#{LANGUAGE}(?:[-_]#{SCRIPT})?
|
|
31
|
+
(?:[-_]#{REGION})?((?:[-_]#{VARIANT})*)\Z/ix
|
|
32
|
+
|
|
33
|
+
attr_reader :script, :variants
|
|
34
|
+
|
|
35
|
+
# Create a Locale::Tag::Common.
|
|
36
|
+
def initialize(language, script = nil, region = nil, variants = [])
|
|
37
|
+
@script, @variants = script, variants
|
|
38
|
+
@script.capitalize! if @script
|
|
39
|
+
super(language, region)
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
# Parse the language tag and return the new Locale::Tag::Common.
|
|
43
|
+
def self.parse(tag)
|
|
44
|
+
if tag =~ /\APOSIX\Z/ # This is the special case of POSIX locale but match this regexp.
|
|
45
|
+
nil
|
|
46
|
+
elsif tag =~ TAG_RE
|
|
47
|
+
lang, script, region, subtag = $1, $2, $3, $4
|
|
48
|
+
variants = subtag.scan(/(^|[-_])#{VARIANT}(?=([-_]|$))/i).collect{|v| v[1]}
|
|
49
|
+
|
|
50
|
+
ret = self.new(lang, script, region, variants)
|
|
51
|
+
ret.tag = tag
|
|
52
|
+
ret
|
|
53
|
+
else
|
|
54
|
+
nil
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
# Set the script (with capitalize)
|
|
59
|
+
def script=(val)
|
|
60
|
+
clear
|
|
61
|
+
@script = val
|
|
62
|
+
@script.capitalize! if @script
|
|
63
|
+
@script
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
# Set the variants
|
|
67
|
+
def variants=(val)
|
|
68
|
+
clear
|
|
69
|
+
@variants = val
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
# Returns the common language tag with "_".
|
|
73
|
+
# <language>_<Script>_<REGION>_VARIANTS1_VARIANTS2
|
|
74
|
+
# (e.g.) "ja_Hira_JP_VARIANTS1_VARIANTS2"
|
|
75
|
+
def to_s
|
|
76
|
+
s = @language.dup
|
|
77
|
+
|
|
78
|
+
s << "_" << @script if @script
|
|
79
|
+
s << "_" << @region if @region
|
|
80
|
+
|
|
81
|
+
@variants.each do |v|
|
|
82
|
+
s << "_#{v}"
|
|
83
|
+
end
|
|
84
|
+
s
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
# Returns an Array of tag-candidates order by priority.
|
|
88
|
+
# Use Locale.candidates instead of this method.
|
|
89
|
+
#
|
|
90
|
+
# Locale::Tag::Rfc, Cldr don't have their own candidates,
|
|
91
|
+
# because it's meaningless to compare the extensions, privateuse, etc.
|
|
92
|
+
def candidates
|
|
93
|
+
[self.class.new(language, script, region, variants), #ja-Kana-JP-FOO
|
|
94
|
+
self.class.new(language, script, region), #ja-Kana-JP
|
|
95
|
+
self.class.new(language, nil, region, variants), #ja-JP-FOO
|
|
96
|
+
self.class.new(language, nil, region), #ja-JP
|
|
97
|
+
self.class.new(language, script, nil, variants), #ja-Kana-FOO
|
|
98
|
+
self.class.new(language, script), #ja-Kana
|
|
99
|
+
self.class.new(language, nil, nil, variants), #ja-FOO
|
|
100
|
+
self.class.new(language)] #ja
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
private
|
|
104
|
+
def convert_to(klass)
|
|
105
|
+
if klass == Simple
|
|
106
|
+
super
|
|
107
|
+
elsif klass == Posix
|
|
108
|
+
if variants.size > 0
|
|
109
|
+
var = variants.join("-")
|
|
110
|
+
else
|
|
111
|
+
var = nil
|
|
112
|
+
end
|
|
113
|
+
klass.new(language, region, nil, var)
|
|
114
|
+
elsif klass == Cldr
|
|
115
|
+
klass.new(language, script, region, variants.map{|v| v.upcase})
|
|
116
|
+
else
|
|
117
|
+
klass.new(language, script, region, variants)
|
|
118
|
+
end
|
|
119
|
+
end
|
|
120
|
+
end
|
|
121
|
+
end
|
|
122
|
+
end
|