aboutsummaryrefslogtreecommitdiffstats
path: root/vendor/gems/locale-2.0.5
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/gems/locale-2.0.5')
-rw-r--r--vendor/gems/locale-2.0.5/.specification98
-rw-r--r--vendor/gems/locale-2.0.5/COPYING56
-rw-r--r--vendor/gems/locale-2.0.5/ChangeLog157
-rw-r--r--vendor/gems/locale-2.0.5/README.rdoc111
-rw-r--r--vendor/gems/locale-2.0.5/Rakefile82
-rw-r--r--vendor/gems/locale-2.0.5/lib/locale.rb329
-rw-r--r--vendor/gems/locale-2.0.5/lib/locale/data/languages.tab.gzbin0 -> 62732 bytes
-rw-r--r--vendor/gems/locale-2.0.5/lib/locale/data/regions.tab.gzbin0 -> 2125 bytes
-rw-r--r--vendor/gems/locale-2.0.5/lib/locale/driver/cgi.rb136
-rw-r--r--vendor/gems/locale-2.0.5/lib/locale/driver/env.rb64
-rw-r--r--vendor/gems/locale-2.0.5/lib/locale/driver/jruby.rb52
-rw-r--r--vendor/gems/locale-2.0.5/lib/locale/driver/posix.rb49
-rw-r--r--vendor/gems/locale-2.0.5/lib/locale/driver/win32.rb81
-rw-r--r--vendor/gems/locale-2.0.5/lib/locale/driver/win32_table.rb298
-rw-r--r--vendor/gems/locale-2.0.5/lib/locale/info.rb12
-rw-r--r--vendor/gems/locale-2.0.5/lib/locale/info/language.rb135
-rw-r--r--vendor/gems/locale-2.0.5/lib/locale/info/region.rb75
-rw-r--r--vendor/gems/locale-2.0.5/lib/locale/tag.rb39
-rw-r--r--vendor/gems/locale-2.0.5/lib/locale/tag/cldr.rb99
-rw-r--r--vendor/gems/locale-2.0.5/lib/locale/tag/common.rb129
-rw-r--r--vendor/gems/locale-2.0.5/lib/locale/tag/irregular.rb40
-rw-r--r--vendor/gems/locale-2.0.5/lib/locale/tag/posix.rb97
-rw-r--r--vendor/gems/locale-2.0.5/lib/locale/tag/rfc.rb112
-rw-r--r--vendor/gems/locale-2.0.5/lib/locale/tag/simple.rb162
-rw-r--r--vendor/gems/locale-2.0.5/lib/locale/taglist.rb109
-rw-r--r--vendor/gems/locale-2.0.5/lib/locale/util/memoizable.rb108
-rw-r--r--vendor/gems/locale-2.0.5/lib/locale/version.rb12
-rw-r--r--vendor/gems/locale-2.0.5/samples/cgi/README20
-rwxr-xr-xvendor/gems/locale-2.0.5/samples/cgi/cookie.cgi62
-rwxr-xr-xvendor/gems/locale-2.0.5/samples/cgi/http.rb52
-rwxr-xr-xvendor/gems/locale-2.0.5/samples/cgi/index.cgi90
-rw-r--r--vendor/gems/locale-2.0.5/samples/cgi/locale.css115
-rw-r--r--vendor/gems/locale-2.0.5/samples/rack/README10
-rw-r--r--vendor/gems/locale-2.0.5/samples/rack/hello_rack.rb17
-rw-r--r--vendor/gems/locale-2.0.5/samples/rack/hello_rack.ru5
-rw-r--r--vendor/gems/locale-2.0.5/samples/sample_1.rb25
-rw-r--r--vendor/gems/locale-2.0.5/samples/sample_info.rb6
-rw-r--r--vendor/gems/locale-2.0.5/setup.rb1585
-rw-r--r--vendor/gems/locale-2.0.5/test/test_detect_cgi.rb216
-rw-r--r--vendor/gems/locale-2.0.5/test/test_detect_general.rb164
-rw-r--r--vendor/gems/locale-2.0.5/test/test_driver_jruby.rb43
-rw-r--r--vendor/gems/locale-2.0.5/test/test_driver_win32.rb65
-rw-r--r--vendor/gems/locale-2.0.5/test/test_info.rb28
-rw-r--r--vendor/gems/locale-2.0.5/test/test_memoizable.rb133
-rw-r--r--vendor/gems/locale-2.0.5/test/test_tag.rb1233
-rw-r--r--vendor/gems/locale-2.0.5/test/test_taglist.rb34
-rw-r--r--vendor/gems/locale-2.0.5/test/test_thread.rb37
47 files changed, 6582 insertions, 0 deletions
diff --git a/vendor/gems/locale-2.0.5/.specification b/vendor/gems/locale-2.0.5/.specification
new file mode 100644
index 000000000..7d3263441
--- /dev/null
+++ b/vendor/gems/locale-2.0.5/.specification
@@ -0,0 +1,98 @@
+--- !ruby/object:Gem::Specification
+name: locale
+version: !ruby/object:Gem::Version
+ version: 2.0.5
+platform: ruby
+authors:
+- Masao Mutoh
+autorequire:
+bindir: bin
+cert_chain: []
+
+date: 2009-11-13 00:00:00 +00:00
+default_executable:
+dependencies: []
+
+description: Ruby-Locale is the pure ruby library which provides basic APIs for localization.
+email: mutomasa at gmail.com
+executables: []
+
+extensions: []
+
+extra_rdoc_files: []
+
+files:
+- lib/locale.rb
+- lib/locale/tag/posix.rb
+- lib/locale/tag/irregular.rb
+- lib/locale/tag/rfc.rb
+- lib/locale/tag/simple.rb
+- lib/locale/tag/cldr.rb
+- lib/locale/tag/common.rb
+- lib/locale/taglist.rb
+- lib/locale/driver/posix.rb
+- lib/locale/driver/win32.rb
+- lib/locale/driver/win32_table.rb
+- lib/locale/driver/jruby.rb
+- lib/locale/driver/env.rb
+- lib/locale/driver/cgi.rb
+- lib/locale/util/memoizable.rb
+- lib/locale/data/regions.tab.gz
+- lib/locale/data/languages.tab.gz
+- lib/locale/info/region.rb
+- lib/locale/info/language.rb
+- lib/locale/version.rb
+- lib/locale/info.rb
+- lib/locale/tag.rb
+- setup.rb
+- test/test_tag.rb
+- test/test_memoizable.rb
+- test/test_driver_jruby.rb
+- test/test_info.rb
+- test/test_driver_win32.rb
+- test/test_detect_general.rb
+- test/test_taglist.rb
+- test/test_detect_cgi.rb
+- test/test_thread.rb
+- Rakefile
+- README.rdoc
+- ChangeLog
+- COPYING
+- samples/rack/hello_rack.ru
+- samples/rack/hello_rack.rb
+- samples/rack/README
+- samples/sample_info.rb
+- samples/cgi/http.rb
+- samples/cgi/locale.css
+- samples/cgi/index.cgi
+- samples/cgi/README
+- samples/cgi/cookie.cgi
+- samples/sample_1.rb
+has_rdoc: true
+homepage: http://locale.rubyforge.org/
+post_install_message:
+rdoc_options: []
+
+require_paths:
+- lib
+required_ruby_version: !ruby/object:Gem::Requirement
+ requirements:
+ - - ">="
+ - !ruby/object:Gem::Version
+ version: "0"
+ version:
+required_rubygems_version: !ruby/object:Gem::Requirement
+ requirements:
+ - - ">="
+ - !ruby/object:Gem::Version
+ version: "0"
+ version:
+requirements: []
+
+rubyforge_project: locale
+rubygems_version: 1.2.0
+signing_key:
+specification_version: 3
+summary: Ruby-Locale is the pure ruby library which provides basic APIs for localization.
+test_files: []
+
diff --git a/vendor/gems/locale-2.0.5/COPYING b/vendor/gems/locale-2.0.5/COPYING
new file mode 100644
index 000000000..9043404a8
--- /dev/null
+++ b/vendor/gems/locale-2.0.5/COPYING
@@ -0,0 +1,56 @@
+Ruby is copyrighted free software by Yukihiro Matsumoto <matz@netlab.jp>.
+You can redistribute it and/or modify it under either the terms of the GPL
+version 2 (see the file GPL), or the conditions below:
+
+ 1. You may make and give away verbatim copies of the source form of the
+ software without restriction, provided that you duplicate all of the
+ original copyright notices and associated disclaimers.
+
+ 2. You may modify your copy of the software in any way, provided that
+ you do at least ONE of the following:
+
+ a) place your modifications in the Public Domain or otherwise
+ make them Freely Available, such as by posting said
+ modifications to Usenet or an equivalent medium, or by allowing
+ the author to include your modifications in the software.
+
+ b) use the modified software only within your corporation or
+ organization.
+
+ c) give non-standard binaries non-standard names, with
+ instructions on where to get the original software distribution.
+
+ d) make other distribution arrangements with the author.
+
+ 3. You may distribute the software in object code or binary form,
+ provided that you do at least ONE of the following:
+
+ a) distribute the binaries and library files of the software,
+ together with instructions (in the manual page or equivalent)
+ on where to get the original distribution.
+
+ b) accompany the distribution with the machine-readable source of
+ the software.
+
+ c) give non-standard binaries non-standard names, with
+ instructions on where to get the original software distribution.
+
+ d) make other distribution arrangements with the author.
+
+ 4. You may modify and include the part of the software into any other
+ software (possibly commercial). But some files in the distribution
+ are not written by the author, so that they are not under these terms.
+
+ For the list of those files and their copying conditions, see the
+ file LEGAL.
+
+ 5. The scripts and library files supplied as input to or produced as
+ output from the software do not automatically fall under the
+ copyright of the software, but belong to whomever generated them,
+ and may be sold commercially, and may be aggregated with this
+ software.
+
+ 6. THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR
+ IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ PURPOSE.
diff --git a/vendor/gems/locale-2.0.5/ChangeLog b/vendor/gems/locale-2.0.5/ChangeLog
new file mode 100644
index 000000000..851da0ccc
--- /dev/null
+++ b/vendor/gems/locale-2.0.5/ChangeLog
@@ -0,0 +1,157 @@
+= locale-2.0.5 (2009-11-11)
+ * Update license information(obiviously Ruby's and LGPL).
+ [Pointed out by Masateru Yoshikawa]
+
+= locale-2.0.4 (2009-05-22)
+ * Enhance Win32 support. [Reported by Dice]
+ * Enhance JRuby support
+ * Fixed a waring with ruby -d option.
+ * Update version.
+
+= locale-2.0.3 (2009-05-09)
+ * Update version.
+
+= locale-2.0.2 (2009-05-04)
+ * Add Locale.set_app_language_tags to restrict the target locales whole the application. [Suggested by Vladimir Dobriakov]
+ * locale/driver/cgi.rb: Add Locale.set_request.
+ * sample/rack: Add a sample for rack.
+ * Improve documents.
+ * Fix bugs
+ * Illegular -> Irregular [by Denis Defreyne]
+ * test_thread.rb doesn't work under the environment where LC_ALL is set .
+ [Reported by Hans de Graaff (Bug#24831)]
+ * Fixed Locale::Drive::CGI.charset don't work when accept_charset is nil.
+ [Reported by hallelujah (Bug#25583)]
+ * Fixed Locale::Drive::Win32.charset don't work.
+
+Thanks to:
+ Denis Defreyne, Hans de Graaff, hallelujah, Vladimir Dobriakov
+
+= locale-2.0.1 (2009-04-18)
+ * Locale::Tag::Common#extensions are shown order by the keys.[reported by
+ Dan Coutu]
+ * Enhance to support ruby-1.9.x [by OZAWA Sakuro]
+ * Reimplement memoize to be able to freeze or dup the object.
+ * Improve Locale.candidates.
+
+ Thanks to:
+ Dan Coutu, OZAWA Sakuro
+
+= locale-2.0.0 (2009-03-21)
+ * Support Rack.
+ * move to github from svn.
+
+== Older format.
+2008-12-04 Masao Mutoh <mutoh@highway.ne.jp>
+
+ * lib/locale/util/memoizable.rb: Modified.
+
+2008-12-03 Masao Mutoh <mutoh@highway.ne.jp>
+
+ * lib/locale/tag/*.rb: Add attribute writer to subtags.
+ * lib/locale/tag/*.rb: Remove tag attributes.
+ * lib/locale/tag/common.rb: Variant accept 3 or later size because of RFC3066 compatibility.
+ * test/test_tag.rb: Add tests.
+
+2008-12-01 Masao Mutoh <mutoh@highway.ne.jp>
+
+ * lib/locale/driver/win32.rb: Work on Win32 again.
+
+2008-11-22 Masao Mutoh <mutoh@highway.ne.jp>
+
+ * lib/locale.rb: Rename Locale.current_language_tags to Locale.candidates.
+ Locale.current_charset to Locale.charset.
+
+2008-11-21 Masao Mutoh <mutoh@highway.ne.jp>
+
+ * lib/locale/tag/simple.rb: Add Locale::Tag::Simple#to_str.
+ * lib/locale.rb: Remove set_current_charset. current_charset becomes read only.
+
+2008-11-20 Masao Mutoh <mutoh@highway.ne.jp>
+
+ * lib/locale/driver/cgi.rb: Accept plural lang values(query string and
+ cookies).
+
+2008-11-19 Masao Mutoh <mutoh@highway.ne.jp>
+
+ * lib/locale.rb: Locale.current_language_tags returns Locale::TagList.
+ * lib/tag/*.rb: Add #candidates method.
+
+2008-11-12 Masao Mutoh <mutoh@highway.ne.jp>
+
+ * lib/locale/util/meoizable.rb: Added.
+
+2008-11-03 Masao Mutoh <mutoh@highway.ne.jp>
+
+ * README: Updated.
+ * Rakefile: Add package tasks. Revise RDoc task.
+ * lib/locale/driver/win32.rb, win32_table.rb, jruby.rb: Work on Windows.
+
+2008-10-29 Masao Mutoh <mutoh@highway.ne.jp>
+
+ * samples/cgi/*.rb: Added CGI sample (Based on Ruby-GetText sample).
+
+2008-10-21 Masao Mutoh <mutoh@highway.ne.jp>
+
+ * samples/sample1.rb: Added.
+
+2008-10-07 Masao Mutoh <mutoh@highway.ne.jp>
+
+ * lib/locale/*.rb: Support Ruby 1.9.
+
+2008-10-01 Masao Mutoh <mutoh@highway.ne.jp>
+
+ * lib/locale/*.rb: Support JRuby. Tested on JRuby 1.1.4.
+
+2008-09-26 Masao Mutoh <mutoh@highway.ne.jp>
+
+ * lib/locale/driver/*: Apply tags.
+ * lib/locale/taglist.rb: Added. An array of tags. Also, it behaves
+ as the first tag in the array.
+ * test/test_detect_general.rb: Added.
+
+2008-09-25 Masao Mutoh <mutoh@highway.ne.jp>
+
+ * lib/locale/tag.rb, lib/locale/tag/*: Added. Support rfc4646/posix/cldr
+ language tags powerfully.
+ * lib/locale/object.rb: Removed(Moved to tags).
+ * test/test_tag.rb: Added.
+
+2008-09-21 Masao Mutoh <mutoh@highway.ne.jp>
+
+ * test/*: Added.
+
+2008-09-02 Masao Mutoh <mutoh@highway.ne.jp>
+
+ * lib/locale.rb: Added Locale.current_language_tags which returns
+ language tags strings as an Array order by priority.
+
+2008-08-20 Masao Mutoh <mutoh@highway.ne.jp>
+
+ * lib/locale/info/language.rb, region.rb: Move from
+ lib/locale/language.rb, country.rb.
+
+2008-08-18 Masao Mutoh <mutoh@highway.ne.jp>
+
+ * lib/locale.rb: Remove Locale.codeset, .charset, .current_charset.
+ Use Locale.get.charset instead.
+ Add Locale.current_preferable_locales, supported_locales,
+ .set_supported_locales
+
+2008-08-10 Masao Mutoh <mutoh@highway.ne.jp>
+
+ * Separates this locale library from Ruby-GetText-Package-1.92.0.
+ * lib/locale/country.rb, language.rb: Merge locale-0.1 by Brian Pontarelli.
+ Reimplement Locale::Language and Locale::Country. All APIs don't have
+ backward compatibility from locale-0.1.
+ * lib/locale/data/countries.tab.gz, languages.tab.gz: Merge from locale-0.1.
+ * lib/locale/base.rb, win32.rb, win32_table.rb, posix.rb, jruby.rb, cgi.rb:
+ Move to lib/locale/driver/.
+ These classes detect the user/system locale (the language tag or
+ the charset) from the environment variables or the system APIs
+ (Win32/Java). Support POSIX, Win32, JRuby, CGI and ENV.
+
+ * lib/locale.rb: Add Locale.init.
+ * lib/locale/info.rb: Added.
+ * lib/locale.rb: Locale.set_current becomes thread safe. Each thread has
+ a current locale.
diff --git a/vendor/gems/locale-2.0.5/README.rdoc b/vendor/gems/locale-2.0.5/README.rdoc
new file mode 100644
index 000000000..381032f7e
--- /dev/null
+++ b/vendor/gems/locale-2.0.5/README.rdoc
@@ -0,0 +1,111 @@
+= Ruby-Locale
+
+Ruby-Locale is the pure ruby library which provides basic and general purpose
+APIs for localization.
+It aims to support all environments which ruby works and all kind of programs
+(GUI, WWW, library, etc), and becomes the hub of other i18n/l10n libs/apps to
+handle major locale ID standards.
+
+* Manage Locale ID(Language Tag)
+ * Each thread has a Locale ID.
+ * POSIX, CLDR, IETF(RFC4646, 3066(BCP47)), Win32 and Java language tags
+ and convert the tag string to each other.
+ * Auto detect Locale ID.
+ POSIX(Unix/Linux/*BSD), Win32, JRuby, CGI.
+
+* Resources
+ * ISO 639-3 languages
+ * ISO 3166 region(countries).
+
+* Support Ruby 1.8.7, Ruby 1.9.1, JRuby 1.1.4. Tested on Win32 and Linux.
+
+== Website
+* http://www.yotabanana.com/hiki/ruby-locale.html
+* http://locale.rubyforge.org/
+
+== Requirements
+* Ruby-1.8.7 or later <http://www.ruby-lang.org/ja/>
+* JRuby-1.1.4 or later <http://jruby.codehaus.org/>
+
+== Install
+* gem:
+ ($ su)
+ # gem install locale
+
+* tar-ball:
+ Download tar-ball from http://rubyforge.org/projects/locale/
+ De-Compress archive and enter its top directory.
+ Then type:
+ ($ su)
+ # ruby setup.rb
+
+== The simplest usage
+
+ require 'rubygems'
+ require 'locale'
+
+ p Locale.candidates
+
+== APIs
+The most important APIs are defined in Locale module.
+
+* Locale.candidates - Returns the current locale candidates.
+* Locale.current= - Sets the current locale(in a thread).
+* Locale.default= - Sets the default locale(in the whole program).
+* Locale.set_app_language_tags - Sets the locale that is supported by the App.
+
+== License
+This program is licenced under the same licence as Ruby(See COPYING) or
+LGPL(Lesser General Public License: http://www.gnu.org/licenses/lgpl-3.0.txt).
+
+* locale/language.rb, locale/region.rb,
+ locale/data/language.tab.gz, locale/data/region.tab.gz:
+ * Copyright (C) 2006 Brian Pontarelli, Antonio Terceiro
+ * Copyright (C) 2008,2009 Masao Mutoh <mutomasa at gmail.com>
+
+* setup.rb version 3.4.1
+ * Copyright (C) 2000-2005 Minero Aoki <aamine at loveruby.net>
+ * This file is released under LGPL. See the top of the setup.rb.
+
+* Others(Some files are separated from Ruby-GetText-Package-1.92.0)
+ * Copyright (C) 2008,2009 Masao Mutoh <mutoh at highwhay.ne.jp>
+
+== References
+=== Other libraries
+* langtag-0.1.0
+ * by Martin Dürst <http://rubyforge.org/projects/langtag/>
+
+* memoizable.rb
+ * from ActiveSupport-2.2.0 <http://rubyforge.org/projects/activesupport/>
+
+* Ruby-GetText-Package-1.92.0
+ * by Masao Mutoh <http://www.yotabanana.com/hiki/ruby-gettext.html>
+
+=== Documents
+* The Open Group Base Specifications Issue 6 IEEE Std 1003.1, 2004 Edition
+ Internationalization Variables
+ <http://www.opengroup.org/onlinepubs/009695399/basedefs/xbd_chap08.html>
+
+* GNU `gettext' utilities - Setting the Locale through Environment Variables
+ <http://www.gnu.org/software/gettext/manual/gettext.html#Setting-the-POSIX-Locale>
+
+* BCP47 / RFC4646, RFC3066 - Tags for Identifying Languages (Keep RFC3066 compatibility)
+ <http://www.ietf.org/rfc/rfc4646.txt>
+ <http://www.ietf.org/rfc/rfc3066.txt>
+
+* Unicode Locale Data Markup Language (LDML) 1.6.1
+ Unicode Language and Locale Identifiers
+ <http://www.unicode.org/reports/tr35/tr35-11.html#Unicode_Language_and_Locale_Identifiers>
+
+* JDK 6 Documentation - Java Supported Locales
+ <http://java.sun.com/javase/6/docs/technotes/guides/intl/locale.doc.html>
+
+* Microsoft Developer Network - Locales and Languages
+ <http://msdn.microsoft.com/en-us/library/ms776264(VS.85).aspx>
+
+* ISO 639
+
+* ISO 3166
+
+== Maintainer
+Masao Mutoh <mutomasa at gmail.com>
diff --git a/vendor/gems/locale-2.0.5/Rakefile b/vendor/gems/locale-2.0.5/Rakefile
new file mode 100644
index 000000000..28fae03f1
--- /dev/null
+++ b/vendor/gems/locale-2.0.5/Rakefile
@@ -0,0 +1,82 @@
+$:.unshift "./lib"
+
+require 'rake'
+require 'rake/testtask'
+require 'rake/rdoctask'
+require 'rake/packagetask'
+require 'rake/gempackagetask'
+
+require 'locale/version'
+
+#desc "Default Task"
+#task :default => [ :test ]
+
+PKG_VERSION = Locale::VERSION
+
+# Run the unit tests
+task :test do
+ Dir.glob("test/test_*.rb").each do |v|
+ ruby "-Ilib #{v}"
+ end
+end
+
+Rake::RDocTask.new { |rdoc|
+ begin
+ allison = `allison --path`.chop
+ rescue Exception
+ allison = ""
+ end
+ rdoc.rdoc_dir = 'doc'
+ rdoc.title = "Ruby-Locale library"
+ rdoc.options << "--line-numbers" << "--inline-source" <<
+ "--accessor" << "cattr_accessor=object" << "--charset" << "utf-8"
+ rdoc.rdoc_files.include('README.rdoc')
+ rdoc.rdoc_files.include('ChangeLog')
+ rdoc.rdoc_files.add('lib')
+ rdoc.template = allison if allison.size > 0
+}
+
+desc "Create gem and tar.gz"
+spec = Gem::Specification.new do |s|
+ s.name = 'locale'
+ s.version = PKG_VERSION
+ s.summary = 'Ruby-Locale is the pure ruby library which provides basic APIs for localization.'
+ s.author = 'Masao Mutoh'
+ s.email = 'mutomasa at gmail.com'
+ s.homepage = 'http://locale.rubyforge.org/'
+ s.rubyforge_project = "locale"
+ s.files = FileList['**/*'].to_a.select{|v| v !~ /pkg|CVS/}
+ s.require_path = 'lib'
+ s.bindir = 'bin'
+ s.has_rdoc = true
+ s.description = <<-EOF
+ Ruby-Locale is the pure ruby library which provides basic APIs for localization.
+ EOF
+end
+
+unless RUBY_PLATFORM =~ /win32/
+ Rake::PackageTask.new("ruby-locale", PKG_VERSION) do |o|
+ o.package_files = FileList['**/*'].to_a.select{|v| v !~ /pkg|CVS/}
+ o.need_tar_gz = true
+ o.need_zip = false
+ end
+end
+
+Rake::GemPackageTask.new(spec) do |p|
+ p.gem_spec = spec
+ p.need_tar_gz = false
+ p.need_zip = false
+end
+
+desc "Publish the release files to RubyForge."
+task :release => [ :package ] do
+ require 'rubyforge'
+
+ rubyforge = RubyForge.new
+ rubyforge.configure
+ rubyforge.login
+ rubyforge.add_release("locale", "locale",
+ PKG_VERSION,
+ "pkg/locale-#{PKG_VERSION}.gem",
+ "pkg/ruby-locale-#{PKG_VERSION}.tar.gz")
+end
diff --git a/vendor/gems/locale-2.0.5/lib/locale.rb b/vendor/gems/locale-2.0.5/lib/locale.rb
new file mode 100644
index 000000000..f56de3783
--- /dev/null
+++ b/vendor/gems/locale-2.0.5/lib/locale.rb
@@ -0,0 +1,329 @@
+=begin
+ locale.rb - Locale module
+
+ Copyright (C) 2002-2009 Masao Mutoh
+
+ You may redistribute it and/or modify it under the same
+ license terms as Ruby.
+
+ Original: Ruby-GetText-Package-1.92.0.
+
+ $Id: locale.rb 27 2008-12-03 15:06:50Z mutoh $
+=end
+
+require 'locale/util/memoizable'
+require 'locale/tag'
+require 'locale/taglist'
+require 'locale/version'
+
+# Locale module manages the locale informations of the application.
+# These functions are the most important APIs in this library.
+# Almost of all i18n/l10n programs use this APIs only.
+module Locale
+ @@default_tag = nil
+ @@locale_driver_module = nil
+
+ ROOT = File.dirname(__FILE__)
+
+ include Locale::Util::Memoizable
+
+ module_function
+ def require_driver(name) #:nodoc:
+ require File.join(ROOT, "locale/driver", name.to_s)
+ end
+
+ def create_language_tag(tag) #:nodoc:
+ if tag
+ if tag.kind_of? Locale::Tag::Simple
+ tag
+ else
+ Locale::Tag.parse(tag)
+ end
+ else
+ nil
+ end
+ end
+
+ # Initialize Locale library.
+ # Usually, you don't need to call this directly, because
+ # this is called when Locale's methods are called.
+ #
+ # If you use this library with CGI or the kind of CGI.
+ # You need to call Locale.init(:driver => :cgi).
+ #
+ # ==== For Framework designers/programers:
+ # If your framework is for WWW, call this once like: Locale.init(:driver => :cgi).
+ #
+ # ==== To Application programers:
+ # If your framework doesn't use ruby-locale and the application is for WWW,
+ # call this once like: Locale.init(:driver => :cgi).
+ #
+ # ==== To Library authors:
+ # Don't call this, even if your application is only for WWW.
+ #
+ # * opts: Options as a Hash.
+ # * :driver - The driver. :cgi if you use Locale module with CGI,
+ # nil if you use system locale.
+ # (ex) Locale.init(:driver => :cgi)
+ #
+ def init(opts = {})
+ if opts[:driver]
+ require_driver opts[:driver]
+ else
+ if /cygwin|mingw|win32/ =~ RUBY_PLATFORM
+ require_driver 'win32'
+ elsif /java/ =~ RUBY_PLATFORM
+ require_driver 'jruby'
+ else
+ require_driver 'posix'
+ end
+ end
+ end
+
+ # Gets the driver module.
+ #
+ # Usually you don't need to call this method.
+ #
+ # * Returns: the driver module.
+ def driver_module
+ unless @@locale_driver_module
+ Locale.init
+ end
+ @@locale_driver_module
+ end
+
+ DEFAULT_LANGUAGE_TAG = Locale::Tag::Simple.new("en") #:nodoc:
+
+ # Sets the default locale as the language tag
+ # (Locale::Tag's class or String(such as "ja_JP")).
+ #
+ # * tag: the default language_tag
+ # * Returns: self.
+ def set_default(tag)
+ Thread.list.each do |thread|
+ thread[:current_languages] = nil
+ thread[:candidates_caches] = nil
+ end
+ @@default_tag = create_language_tag(tag)
+ self
+ end
+
+ # Same as Locale.set_default.
+ #
+ # * locale: the default locale (Locale::Tag's class) or a String such as "ja-JP".
+ # * Returns: locale.
+ def default=(tag)
+ set_default(tag)
+ @@default_tag
+ end
+
+ # Gets the default locale(language tag).
+ #
+ # If the default language tag is not set, this returns nil.
+ #
+ # * Returns: the default locale (Locale::Tag's class).
+ def default
+ @@default_tag || DEFAULT_LANGUAGE_TAG
+ end
+
+ # Sets the locales of the current thread order by the priority.
+ # Each thread has a current locales.
+ # The system locale/default locale is used if the thread doesn't have current locales.
+ #
+ # * tag: Locale::Language::Tag's class or the language tag as a String. nil if you need to
+ # clear current locales.
+ # * charset: the charset (override the charset even if the locale name has charset) or nil.
+ # * Returns: self
+ #
+ # (e.g.)
+ # Locale.set_current("ja_JP.eucJP")
+ # Locale.set_current("ja-JP")
+ # Locale.set_current("en_AU", "en_US", ...)
+ # Locale.set_current(Locale::Tag::Simple.new("ja", "JP"), ...)
+ def set_current(*tags)
+ languages = nil
+ if tags[0]
+ languages = Locale::TagList.new
+ tags.each do |tag|
+ languages << create_language_tag(tag)
+ end
+ end
+ Thread.current[:current_languages] = languages
+ Thread.current[:candidates_caches] = nil
+ self
+ end
+
+ # Sets a current locale. This is a single argument version of Locale.set_current.
+ #
+ # * tag: the language tag such as "ja-JP"
+ # * Returns: an Array of the current locale (Locale::Tag's class).
+ #
+ # Locale.current = "ja-JP"
+ # Locale.current = "ja_JP.eucJP"
+ def current=(tag)
+ set_current(tag)
+ Thread.current[:current_languages]
+ end
+
+ # Gets the current locales (Locale::Tag's class).
+ # If the current locale is not set, this returns system/default locale.
+ #
+ # This method returns the current language tags even if it isn't included in app_language_tags.
+ #
+ # Usually, the programs should use Locale.candidates to find the correct locale, not this method.
+ #
+ # * Returns: an Array of the current locales (Locale::Tag's class).
+ def current
+ unless Thread.current[:current_languages]
+ loc = driver_module.locales
+ Thread.current[:current_languages] = loc ? loc : Locale::TagList.new([default])
+ end
+ Thread.current[:current_languages]
+ end
+
+ # Deprecated.
+ def get #:nodoc:
+ current
+ end
+
+ # Deprecated.
+ def set(tag) #:nodoc:
+ set_current(tag)
+ end
+
+ # Returns the language tags which are variations of the current locales order by priority.
+ #
+ # For example, if the current locales are ["fr", "ja_JP", "en_US", "en-Latn-GB-VARIANT"],
+ # then returns ["fr", "ja_JP", "en_US", "en-Latn-GB-VARIANT", "en_Latn_GB", "en_GB", "ja", "en"].
+ # "en" is the default locale(You can change it using set_default).
+ # The default locale is added at the end of the list even if it isn't exist.
+ #
+ # Usually, this method is used to find the locale data as the path(or a kind of IDs).
+ # * options: options as a Hash or nil.
+ # * :supported_language_tags -
+ # An Array of the language tags order by the priority. This option
+ # restricts the locales which are supported by the library/application.
+ # Default is nil if you don't need to restrict the locales.
+ # (e.g.1) ["fr_FR", "en_GB", "en_US", ...]
+ # * :type -
+ # The type of language tag. :common, :rfc, :cldr, :posix and
+ # :simple are available. Default value is :common
+ def candidates(options = {})
+ opts = {:supported_language_tags => nil, :current => current,
+ :type => :common}.merge(options)
+
+ if Thread.current[:candidates_caches]
+ cache = Thread.current[:candidates_caches][opts.hash]
+ return cache if cache
+ else
+ Thread.current[:candidates_caches] = {}
+ end
+ Thread.current[:candidates_caches][opts.hash] =
+ collect_candidates(opts[:type], opts[:current],
+ opts[:supported_language_tags])
+ end
+
+ # collect tag candidates and memoize it.
+ # The result is shared from all threads.
+ def collect_candidates(type, tags, supported_tags) # :nodoc:
+ candidate_tags = tags.collect{|v| v.send("to_#{type}").candidates}
+ default_tags = default.send("to_#{type}").candidates
+ if app_language_tags
+ app_tags = app_language_tags.collect{|v| v.send("to_#{type}")}.flatten.uniq
+ end
+ if supported_tags
+ supported_tags = supported_tags.collect{|v| Locale::Tag.parse(v).send("to_#{type}")}.flatten.uniq
+ end
+
+ tags = []
+ (0...candidate_tags[0].size).each {|i|
+ tags += candidate_tags.collect{|v| v[i]}
+ }
+ tags += default_tags
+ tags.uniq!
+
+ all_tags = nil
+ if app_tags
+ if supported_tags
+ all_tags = app_tags & supported_tags
+ else
+ all_tags = app_tags
+ end
+ elsif supported_tags
+ all_tags = supported_tags
+ end
+ if all_tags
+ tags &= all_tags
+ tags = default_tags.uniq if tags.size == 0
+ end
+
+ Locale::TagList.new(tags)
+ end
+ memoize :collect_candidates
+
+ # Gets the current charset.
+ #
+ # This returns the current user/system charset. This value is
+ # read only, so you can't set it by yourself.
+ #
+ # * Returns: the current charset.
+ def charset
+ driver_module.charset || "UTF-8"
+ end
+ memoize :charset
+
+ # Clear current locale.
+ # * Returns: self
+ def clear
+ Thread.current[:current_languages] = nil
+ Thread.current[:candidates_caches] = nil
+ self
+ end
+
+ # Clear all locales and charsets of all threads.
+ # This doesn't clear the default and app_language_tags.
+ # Use Locale.default = nil to unset the default locale.
+ # * Returns: self
+ def clear_all
+ Thread.list.each do |thread|
+ thread[:current_languages] = nil
+ thread[:candidates_caches] = nil
+ end
+ memoize_clear
+ self
+ end
+
+ @@app_language_tags = nil
+ # Set the language tags which is supported by the Application.
+ # This value is same with supported_language_tags in Locale.candidates
+ # to restrict the result but is the global setting.
+ # If you set a language tag, the application works as the single locale
+ # application.
+ #
+ # If the current locale is not included in app_language_tags,
+ # Locale.default value is used.
+ # Use Locale.set_default() to set correct language
+ # if "en" is not included in the language tags.
+ #
+ # Set nil if clear the value.
+ #
+ # Note that the libraries/plugins shouldn't set this value.
+ #
+ # (e.g.) Locale.set_app_language_tags("fr_FR", "en-GB", "en_US", ...)
+ def set_app_language_tags(*tags)
+ if tags[0]
+ @@app_language_tags = tags.collect{|v| Locale::Tag.parse(v)}
+ else
+ @@app_language_tags = nil
+ end
+
+ clear_all
+ self
+ end
+
+ # Returns the app_language_tags. Default is nil. See set_app_language_tags for more details.
+ def app_language_tags
+ @@app_language_tags
+ end
+
+end
diff --git a/vendor/gems/locale-2.0.5/lib/locale/data/languages.tab.gz b/vendor/gems/locale-2.0.5/lib/locale/data/languages.tab.gz
new file mode 100644
index 000000000..7658a03f0
--- /dev/null
+++ b/vendor/gems/locale-2.0.5/lib/locale/data/languages.tab.gz
Binary files differ
diff --git a/vendor/gems/locale-2.0.5/lib/locale/data/regions.tab.gz b/vendor/gems/locale-2.0.5/lib/locale/data/regions.tab.gz
new file mode 100644
index 000000000..b5ecbfbec
--- /dev/null
+++ b/vendor/gems/locale-2.0.5/lib/locale/data/regions.tab.gz
Binary files differ
diff --git a/vendor/gems/locale-2.0.5/lib/locale/driver/cgi.rb b/vendor/gems/locale-2.0.5/lib/locale/driver/cgi.rb
new file mode 100644
index 000000000..c1d1126dd
--- /dev/null
+++ b/vendor/gems/locale-2.0.5/lib/locale/driver/cgi.rb
@@ -0,0 +1,136 @@
+=begin
+ locale/driver/cgi.rb
+
+ Copyright (C) 2002-2008 Masao Mutoh
+
+ You may redistribute it and/or modify it under the same
+ license terms as Ruby.
+
+ Original: Ruby-GetText-Package-1.92.0.
+
+ $Id: cgi.rb 27 2008-12-03 15:06:50Z mutoh $
+=end
+
+module Locale
+ # Locale::Driver module for CGI.
+ # Detect the user locales and the charset from CGI parameters.
+ # This is a low-level class. Application shouldn't use this directly.
+ module Driver
+ module CGI
+ $stderr.puts self.name + " is loaded." if $DEBUG
+
+ module_function
+ # Gets required locales from CGI parameters. (Based on RFC2616)
+ #
+ # Returns: An Array of Locale::Tag's subclasses
+ # (QUERY_STRING "lang" > COOKIE "lang" > HTTP_ACCEPT_LANGUAGE > "en")
+ #
+ def locales
+ req = Thread.current[:current_request]
+ return nil unless req
+
+ locales = []
+
+ # QUERY_STRING "lang"
+ if langs = req[:query_langs]
+ langs.each do |lang|
+ locales << Locale::Tag.parse(lang)
+ end
+ end
+
+ unless locales.size > 0
+ # COOKIE "lang"
+ if langs = req[:cookie_langs]
+ langs.each do |lang|
+ locales << Locale::Tag.parse(lang) if lang.size > 0
+ end
+ end
+ end
+
+ unless locales.size > 0
+ # HTTP_ACCEPT_LANGUAGE
+ if lang = req[:accept_language] and lang.size > 0
+ locales += lang.gsub(/\s/, "").split(/,/).map{|v| v.split(";q=")}.map{|j| [j[0], j[1] ? j[1].to_f : 1.0]}.sort{|a,b| -(a[1] <=> b[1])}.map{|v| Locale::Tag.parse(v[0])}
+ end
+ end
+
+ locales.size > 0 ? Locale::TagList.new(locales.uniq) : nil
+ end
+
+ # Gets the charset from CGI parameters. (Based on RFC2616)
+ # * Returns: the charset (HTTP_ACCEPT_CHARSET or nil).
+ def charset
+ req = Thread.current[:current_request]
+ return nil unless req
+
+ charsets = req[:accept_charset]
+ if charsets and charsets.size > 0
+ num = charsets.index(',')
+ charset = num ? charsets[0, num] : charsets
+ charset = nil if charset == "*"
+ else
+ charset = nil
+ end
+ charset
+ end
+
+ # Set a request.
+ #
+ # * query_langs: An Array of QUERY_STRING value "lang".
+ # * cookie_langs: An Array of cookie value "lang".
+ # * accept_language: The value of HTTP_ACCEPT_LANGUAGE
+ # * accept_charset: The value of HTTP_ACCEPT_CHARSET
+ def set_request(query_langs, cookie_langs, accept_language, accept_charset)
+ Thread.current[:current_request] = {
+ :query_langs => query_langs,
+ :cookie_langs => cookie_langs,
+ :accept_language => accept_language,
+ :accept_charset => accept_charset
+ }
+ self
+ end
+
+ # Clear the current request.
+ def clear_current_request
+ Thread.current[:current_request] = nil
+ end
+ end
+ end
+
+ @@locale_driver_module = Driver::CGI
+
+ module_function
+ # Sets a request values for lang/charset.
+ #
+ # * query_langs: An Array of QUERY_STRING value "lang".
+ # * cookie_langs: An Array of cookie value "lang".
+ # * accept_language: The value of HTTP_ACCEPT_LANGUAGE
+ # * accept_charset: The value of HTTP_ACCEPT_CHARSET
+ def set_request(query_langs, cookie_langs, accept_language, accept_charset)
+ @@locale_driver_module.set_request(query_langs, cookie_langs, accept_language, accept_charset)
+ self
+ end
+
+ # Sets a CGI object. This is the convenient function of set_request().
+ #
+ # This method is appeared when Locale.init(:driver => :cgi) is called.
+ #
+ # * cgi: CGI object
+ # * Returns: self
+ def set_cgi(cgi)
+ set_request(cgi.params["lang"], cgi.cookies["lang"],
+ cgi.accept_language, cgi.accept_charset)
+ self
+ end
+
+ # Sets a CGI object.This is the convenient function of set_request().
+ #
+ # This method is appeared when Locale.init(:driver => :cgi) is called.
+ #
+ # * cgi: CGI object
+ # * Returns: cgi
+ def cgi=(cgi)
+ set_cgi(cgi)
+ cgi
+ end
+end
diff --git a/vendor/gems/locale-2.0.5/lib/locale/driver/env.rb b/vendor/gems/locale-2.0.5/lib/locale/driver/env.rb
new file mode 100644
index 000000000..9d0995fa2
--- /dev/null
+++ b/vendor/gems/locale-2.0.5/lib/locale/driver/env.rb
@@ -0,0 +1,64 @@
+=begin
+ locale/env.rb
+
+ Copyright (C) 2008 Masao Mutoh
+
+ You may redistribute it and/or modify it under the same
+ license terms as Ruby.
+
+ Original: Ruby-GetText-Package-1.92.0.
+
+ $Id: env.rb 27 2008-12-03 15:06:50Z mutoh $
+=end
+
+require 'locale/tag'
+require 'locale/taglist'
+
+module Locale
+ module Driver
+ # Locale::Driver::Env module.
+ # Detect the user locales and the charset.
+ # All drivers(except CGI) refer environment variables first and use it
+ # as the locale if it's defined.
+ # This is a low-level module. Application shouldn't use this directly.
+ module Env
+ module_function
+
+ # Gets the locale from environment variable. (LC_ALL > LC_MESSAGES > LANG)
+ # Returns: the locale as Locale::Tag::Posix.
+ def locale
+ # At least one environment valiables should be set on *nix system.
+ [ENV["LC_ALL"], ENV["LC_MESSAGES"], ENV["LANG"]].each do |loc|
+ if loc != nil and loc.size > 0
+ return Locale::Tag::Posix.parse(loc)
+ end
+ end
+ nil
+ end
+
+ # Gets the locales from environment variables. (LANGUAGE > LC_ALL > LC_MESSAGES > LANG)
+ # * Returns: an Array of the locale as Locale::Tag::Posix or nil.
+ def locales
+ if (locales = ENV["LANGUAGE"])
+ Locale::TagList.new(locales.split(/:/).collect{|v| Locale::Tag::Posix.parse(v)})
+ elsif (loc = locale)
+ Locale::TagList.new([loc])
+ else
+ nil
+ end
+ end
+
+ # Gets the charset from environment variable or return nil.
+ # * Returns: the system charset.
+ def charset # :nodoc:
+ if loc = locale
+ loc.charset
+ else
+ nil
+ end
+ end
+
+ end
+ end
+end
+
diff --git a/vendor/gems/locale-2.0.5/lib/locale/driver/jruby.rb b/vendor/gems/locale-2.0.5/lib/locale/driver/jruby.rb
new file mode 100644
index 000000000..d30348dbe
--- /dev/null
+++ b/vendor/gems/locale-2.0.5/lib/locale/driver/jruby.rb
@@ -0,0 +1,52 @@
+=begin
+ locale/driver/jruby.rb
+
+ Copyright (C) 2007,2008 Masao Mutoh
+
+ You may redistribute it and/or modify it under the same
+ license terms as Ruby.
+
+ Original: Ruby-GetText-Package-1.92.0.
+
+ $Id: jruby.rb 27 2008-12-03 15:06:50Z mutoh $
+=end
+
+require File.join(File.dirname(__FILE__), 'env')
+require 'java'
+
+module Locale
+ module Driver
+ # Locale::Driver::JRuby module for JRuby
+ # Detect the user locales and the charset.
+ # This is a low-level class. Application shouldn't use this directly.
+ module JRuby
+ $stderr.puts self.name + " is loaded." if $DEBUG
+
+ module_function
+ def locales #:nodoc:
+ locales = ::Locale::Driver::Env.locales
+ unless locales
+ locale = java.util.Locale.getDefault
+ variant = locale.getVariant
+ variants = []
+ if variant != nil and variant.size > 0
+ variants = [variant]
+ end
+ locales = TagList.new([Locale::Tag::Common.new(locale.getLanguage, nil,
+ locale.getCountry,
+ variants)])
+ end
+ locales
+ end
+
+ def charset #:nodoc:
+ charset = ::Locale::Driver::Env.charset
+ unless charset
+ charset = java.nio.charset.Charset.defaultCharset.name
+ end
+ charset
+ end
+ end
+ end
+ @@locale_driver_module = Driver::JRuby
+end
diff --git a/vendor/gems/locale-2.0.5/lib/locale/driver/posix.rb b/vendor/gems/locale-2.0.5/lib/locale/driver/posix.rb
new file mode 100644
index 000000000..cf918efbe
--- /dev/null
+++ b/vendor/gems/locale-2.0.5/lib/locale/driver/posix.rb
@@ -0,0 +1,49 @@
+=begin
+ locale/posix.rb
+
+ Copyright (C) 2002-2008 Masao Mutoh
+
+ You may redistribute it and/or modify it under the same
+ license terms as Ruby.
+
+ Original: Ruby-GetText-Package-1.92.0.
+
+ $Id: posix.rb 27 2008-12-03 15:06:50Z mutoh $
+=end
+
+require File.join(File.dirname(__FILE__), 'env')
+
+module Locale
+ # Locale::Driver::Posix module for Posix OS (Unix)
+ # Detect the user locales and the charset.
+ # This is a low-level class. Application shouldn't use this directly.
+ module Driver
+ module Posix
+ $stderr.puts self.name + " is loaded." if $DEBUG
+
+ module_function
+ # Gets the locales from environment variables. (LANGUAGE > LC_ALL > LC_MESSAGES > LANG)
+ # Only LANGUAGE accept plural languages such as "nl_BE;
+ # * Returns: an Array of the locale as Locale::Tag::Posix or nil.
+ def locales
+ ::Locale::Driver::Env.locales
+ end
+
+ # Gets the charset from environment variable or the result of
+ # "locale charmap" or nil.
+ # * Returns: the system charset.
+ def charset
+ charset = ::Locale::Driver::Env.charset
+ unless charset
+ charset = `locale charmap`.strip
+ unless $? && $?.success?
+ charset = nil
+ end
+ end
+ charset
+ end
+ end
+ end
+ @@locale_driver_module = Driver::Posix
+end
+
diff --git a/vendor/gems/locale-2.0.5/lib/locale/driver/win32.rb b/vendor/gems/locale-2.0.5/lib/locale/driver/win32.rb
new file mode 100644
index 000000000..2bb6fbc4c
--- /dev/null
+++ b/vendor/gems/locale-2.0.5/lib/locale/driver/win32.rb
@@ -0,0 +1,81 @@
+=begin
+ locale/win32.rb
+
+ Copyright (C) 2002-2008 Masao Mutoh
+
+ You may redistribute it and/or modify it under the same
+ license terms as Ruby.
+
+ Original: Ruby-GetText-Package-1.92.0.
+
+ $Id: win32.rb 27 2008-12-03 15:06:50Z mutoh $
+=end
+
+require File.join(File.dirname(__FILE__), 'env')
+require File.join(File.dirname(__FILE__), 'win32_table')
+require 'dl/win32'
+
+
+module Locale
+ # Locale::Driver::Win32 module for win32.
+ # Detect the user locales and the charset.
+ # This is a low-level class. Application shouldn't use this directly.
+ module Driver
+ module Win32
+ include Win32Table
+
+ $stderr.puts self.name + " is loaded." if $DEBUG
+
+ @@win32 = nil
+ @@current_locale_id = nil
+
+ module_function
+
+ # Gets the Win32 charset of the locale.
+ def charset
+ charset = ::Locale::Driver::Env.charset
+ unless charset
+ if locales
+ tag = locales[0].to_rfc.to_s
+ loc = LocaleTable.find{|v| v[1] == tag}
+ loc = LocaleTable.find{|v| v[1] =~ /^#{locales[0].language}/} unless loc
+ charset = loc ? loc[2] : nil
+ else
+ charset = "CP1252"
+ end
+ end
+ charset
+ end
+
+ def thread_locale_id #:nodoc:
+ if @@current_locale_id
+ @@current_locale_id
+ else
+ @@win32 ||= Win32API.new("kernel32.dll", "GetThreadLocale", nil, "i")
+ @@win32.call
+ end
+ end
+
+ def set_thread_locale_id(lcid) #:nodoc:
+ # for testing.
+ @@current_locale_id = lcid
+ end
+
+ def locales #:nodoc:
+ locales = ::Locale::Driver::Env.locales
+ unless locales
+ lang = LocaleTable.assoc(thread_locale_id)
+ if lang
+ ret = Locale::Tag::Common.parse(lang[1])
+ locales = Locale::TagList.new([ret])
+ else
+ locales = nil
+ end
+ end
+ locales
+ end
+ end
+ end
+ @@locale_driver_module = Driver::Win32
+end
+
diff --git a/vendor/gems/locale-2.0.5/lib/locale/driver/win32_table.rb b/vendor/gems/locale-2.0.5/lib/locale/driver/win32_table.rb
new file mode 100644
index 000000000..e1fd68a1b
--- /dev/null
+++ b/vendor/gems/locale-2.0.5/lib/locale/driver/win32_table.rb
@@ -0,0 +1,298 @@
+=begin
+ win32_table.rb - Locale table for win32
+
+ Copyright (C) 2008 Masao Mutoh <mutomasa at gmail.com>
+
+ You may redistribute it and/or modify it under the same
+ license terms as Ruby.
+
+ Original: Ruby-GetText-Package-1.92.0.
+
+ $Id: win32_table.rb 27 2008-12-03 15:06:50Z mutoh $
+=end
+
+module Locale
+ module Driver
+ module Win32Table
+
+ #http://msdn.microsoft.com/ja-jp/goglobal/bb896001(en-us).aspx
+
+ #LangID, locale name, code page
+ LocaleTable = [
+ [0x0036,"af","CP1252"],
+ [0x0436,"af-ZA","CP1252"],
+ [0x001C,"sq","CP1250"],
+ [0x041C,"sq-AL","CP1250"],
+ [0x0484,"gsw-FR","CP1252"],
+ [0x045E,"am-ET","UNICODE"],
+ [0x0001,"ar","CP1256"],
+ [0x1401,"ar-DZ","CP1256"],
+ [0x3C01,"ar-BH","CP1256"],
+ [0x0C01,"ar-EG","CP1256"],
+ [0x0801,"ar-IQ","CP1256"],
+ [0x2C01,"ar-JO","CP1256"],
+ [0x3401,"ar-KW","CP1256"],
+ [0x3001,"ar-LB","CP1256"],
+ [0x1001,"ar-LY","CP1256"],
+ [0x1801,"ar-MA","CP1256"],
+ [0x2001,"ar-OM","CP1256"],
+ [0x4001,"ar-QA","CP1256"],
+ [0x0401,"ar-SA","CP1256"],
+ [0x2801,"ar-SY","CP1256"],
+ [0x1C01,"ar-TN","CP1256"],
+ [0x3801,"ar-AE","CP1256"],
+ [0x2401,"ar-YE","CP1256"],
+ [0x002B,"hy","UNICODE"],
+ [0x042B,"hy-AM","UNICODE"],
+ [0x044D,"as-IN","UNICODE"],
+ [0x002C,"az","CP1254"],
+ [0x082C,"az-Cyrl-AZ","CP1251"],
+ [0x042C,"az-Latn-AZ","CP1254"],
+ [0x046D,"ba-RU","CP1251"],
+ [0x002D,"eu","CP1252"],
+ [0x042D,"eu-ES","CP1252"],
+ [0x0023,"be","CP1251"],
+ [0x0423,"be-BY","CP1251"],
+ [0x0845,"bn-BD","UNICODE"],
+ [0x0445,"bn-IN","UNICODE"],
+ [0x201A,"bs-Cyrl-BA","CP1251"],
+ [0x141A,"bs-Latn-BA","CP1250"],
+ [0x047E,"br-FR","CP1252"],
+ [0x0002,"bg","CP1251"],
+ [0x0402,"bg-BG","CP1251"],
+ [0x0003,"ca","CP1252"],
+ [0x0403,"ca-ES","CP1252"],
+ [0x0C04,"zh-HK","CP950"],
+ [0x1404,"zh-MO","CP950"],
+ [0x0804,"zh-CN","CP936"],
+ [0x0004,"zh-Hans","CP936"],
+ [0x1004,"zh-SG","CP936"],
+ [0x0404,"zh-TW","CP950"],
+ [0x7C04,"zh-Hant","CP950"],
+ [0x0483,"co-FR","CP1252"],
+ [0x001A,"hr","CP1250"],
+ [0x041A,"hr-HR","CP1250"],
+ [0x101A,"hr-BA","CP1250"],
+ [0x0005,"cs","CP1250"],
+ [0x0405,"cs-CZ","CP1250"],
+ [0x0006,"da","CP1252"],
+ [0x0406,"da-DK","CP1252"],
+ [0x048C,"prs-AF","CP1256"],
+ [0x0065,"div","UNICODE"],
+ [0x0465,"div-MV","UNICODE"],
+ [0x0013,"nl","CP1252"],
+ [0x0813,"nl-BE","CP1252"],
+ [0x0413,"nl-NL","CP1252"],
+ [0x0009,"en","CP1252"],
+ [0x0C09,"en-AU","CP1252"],
+ [0x2809,"en-BZ","CP1252"],
+ [0x1009,"en-CA","CP1252"],
+ [0x2409,"en-029","CP1252"],
+ [0x4009,"en-IN","CP1252"],
+ [0x1809,"en-IE","CP1252"],
+ [0x2009,"en-JM","CP1252"],
+ [0x4409,"en-MY","CP1252"],
+ [0x1409,"en-NZ","CP1252"],
+ [0x3409,"en-PH","CP1252"],
+ [0x4809,"en-SG","CP1252"],
+ [0x1C09,"en-ZA","CP1252"],
+ [0x2C09,"en-TT","CP1252"],
+ [0x0809,"en-GB","CP1252"],
+ [0x0409,"en-US","CP1252"],
+ [0x3009,"en-ZW","CP1252"],
+ [0x0025,"et","CP1257"],
+ [0x0425,"et-EE","CP1257"],
+ [0x0038,"fo","CP1252"],
+ [0x0438,"fo-FO","CP1252"],
+ [0x0464,"fil-PH","CP1252"],
+ [0x000B,"fi","CP1252"],
+ [0x040B,"fi-FI","CP1252"],
+ [0x000C,"fr","CP1252"],
+ [0x080C,"fr-BE","CP1252"],
+ [0x0C0C,"fr-CA","CP1252"],
+ [0x040C,"fr-FR","CP1252"],
+ [0x140C,"fr-LU","CP1252"],
+ [0x180C,"fr-MC","CP1252"],
+ [0x100C,"fr-CH","CP1252"],
+ [0x0462,"fy-NL","CP1252"],
+ [0x0056,"gl","CP1252"],
+ [0x0456,"gl-ES","CP1252"],
+ [0x0037,"ka","UNICODE"],
+ [0x0437,"ka-GE","UNICODE"],
+ [0x0007,"de","CP1252"],
+ [0x0C07,"de-AT","CP1252"],
+ [0x0407,"de-DE","CP1252"],
+ [0x1407,"de-LI","CP1252"],
+ [0x1007,"de-LU","CP1252"],
+ [0x0807,"de-CH","CP1252"],
+ [0x0008,"el","CP1253"],
+ [0x0408,"el-GR","CP1253"],
+ [0x046F,"kl-GL","CP1252"],
+ [0x0047,"gu","UNICODE"],
+ [0x0447,"gu-IN","UNICODE"],
+ [0x0468,"ha-Latn-NG","CP1252"],
+ [0x000D,"he","CP1255"],
+ [0x040D,"he-IL","CP1255"],
+ [0x0039,"hi","UNICODE"],
+ [0x0439,"hi-IN","UNICODE"],
+ [0x000E,"hu","CP1250"],
+ [0x040E,"hu-HU","CP1250"],
+ [0x000F,"is","CP1252"],
+ [0x040F,"is-IS","CP1252"],
+ [0x0470,"ig-NG","CP1252"],
+ [0x0021,"id","CP1252"],
+ [0x0421,"id-ID","CP1252"],
+ [0x085D,"iu-Latn-CA","CP1252"],
+ [0x045D,"iu-Cans-CA","UNICODE"],
+ [0x083C,"ga-IE","CP1252"],
+ [0x0434,"xh-ZA","CP1252"],
+ [0x0435,"zu-ZA","CP1252"],
+ [0x0010,"it","CP1252"],
+ [0x0410,"it-IT","CP1252"],
+ [0x0810,"it-CH","CP1252"],
+ [0x0011,"ja","CP932"],
+ [0x0411,"ja-JP","CP932"],
+ [0x004B,"kn","UNICODE"],
+ [0x044B,"kn-IN","UNICODE"],
+ [0x003F,"kk","CP1251"],
+ [0x043F,"kk-KZ","CP1251"],
+ [0x0453,"km-KH","UNICODE"],
+ [0x0486,"qut-GT","CP1252"],
+ [0x0487,"rw-RW","CP1252"],
+ [0x0041,"sw","CP1252"],
+ [0x0441,"sw-KE","CP1252"],
+ [0x0057,"kok","UNICODE"],
+ [0x0457,"kok-IN","UNICODE"],
+ [0x0012,"ko","CP949"],
+ [0x0412,"ko-KR","CP949"],
+ [0x0040,"ky","CP1251"],
+ [0x0440,"ky-KG","CP1251"],
+ [0x0454,"lo-LA","UNICODE"],
+ [0x0026,"lv","CP1257"],
+ [0x0426,"lv-LV","CP1257"],
+ [0x0027,"lt","CP1257"],
+ [0x0427,"lt-LT","CP1257"],
+ [0x082E,"wee-DE","CP1252"],
+ [0x046E,"lb-LU","CP1252"],
+ [0x002F,"mk","CP1251"],
+ [0x042F,"mk-MK","CP1251"],
+ [0x003E,"ms","CP1252"],
+ [0x083E,"ms-BN","CP1252"],
+ [0x043E,"ms-MY","CP1252"],
+ [0x044C,"ml-IN","UNICODE"],
+ [0x043A,"mt-MT","UNICODE"],
+ [0x0481,"mi-NZ","UNICODE"],
+ [0x047A,"arn-CL","CP1252"],
+ [0x004E,"mr","UNICODE"],
+ [0x044E,"mr-IN","UNICODE"],
+ [0x047C,"moh-CA","CP1252"],
+ [0x0050,"mn","CP1251"],
+ [0x0450,"mn-MN","CP1251"],
+ [0x0850,"mn-Mong-CN","UNICODE"],
+ [0x0461,"ne-NP","UNICODE"],
+ [0x0014,"no","CP1252"],
+ [0x0414,"nb-NO","CP1252"],
+ [0x0814,"nn-NO","CP1252"],
+ [0x0482,"oc-FR","CP1252"],
+ [0x0448,"or-IN","UNICODE"],
+ [0x0463,"ps-AF","UNICODE"],
+ [0x0029,"fa","CP1256"],
+ [0x0429,"fa-IR","CP1256"],
+ [0x0015,"pl","CP1250"],
+ [0x0415,"pl-PL","CP1250"],
+ [0x0016,"pt","CP1252"],
+ [0x0416,"pt-BR","CP1252"],
+ [0x0816,"pt-PT","CP1252"],
+ [0x0046,"pa","UNICODE"],
+ [0x0446,"pa-IN","UNICODE"],
+ [0x046B,"quz-BO","CP1252"],
+ [0x086B,"quz-EC","CP1252"],
+ [0x0C6B,"quz-PE","CP1252"],
+ [0x0018,"ro","CP1250"],
+ [0x0418,"ro-RO","CP1250"],
+ [0x0417,"rm-CH","CP1252"],
+ [0x0019,"ru","CP1251"],
+ [0x0419,"ru-RU","CP1251"],
+ [0x243B,"smn-FI","CP1252"],
+ [0x103B,"smj-NO","CP1252"],
+ [0x143B,"smj-SE","CP1252"],
+ [0x0C3B,"se-FI","CP1252"],
+ [0x043B,"se-NO","CP1252"],
+ [0x083B,"se-SE","CP1252"],
+ [0x203B,"sms-FI","CP1252"],
+ [0x183B,"sma-NO","CP1252"],
+ [0x1C3B,"sma-SE","CP1252"],
+ [0x004F,"sa","UNICODE"],
+ [0x044F,"sa-IN","UNICODE"],
+ [0x7C1A,"sr","CP1251"],
+ [0x1C1A,"sr-Cyrl-BA","CP1251"],
+ [0x0C1A,"sr-Cyrl-SP","CP1251"],
+ [0x181A,"sr-Latn-BA","CP1250"],
+ [0x081A,"sr-Latn-SP","CP1250"],
+ [0x046C,"nso-ZA","CP1252"],
+ [0x0432,"tn-ZA","CP1252"],
+ [0x045B,"si-LK","UNICODE"],
+ [0x001B,"sk","CP1250"],
+ [0x041B,"sk-SK","CP1250"],
+ [0x0024,"sl","CP1250"],
+ [0x0424,"sl-SI","CP1250"],
+ [0x000A,"es","CP1252"],
+ [0x2C0A,"es-AR","CP1252"],
+ [0x400A,"es-BO","CP1252"],
+ [0x340A,"es-CL","CP1252"],
+ [0x240A,"es-CO","CP1252"],
+ [0x140A,"es-CR","CP1252"],
+ [0x1C0A,"es-DO","CP1252"],
+ [0x300A,"es-EC","CP1252"],
+ [0x440A,"es-SV","CP1252"],
+ [0x100A,"es-GT","CP1252"],
+ [0x480A,"es-HN","CP1252"],
+ [0x080A,"es-MX","CP1252"],
+ [0x4C0A,"es-NI","CP1252"],
+ [0x180A,"es-PA","CP1252"],
+ [0x3C0A,"es-PY","CP1252"],
+ [0x280A,"es-PE","CP1252"],
+ [0x500A,"es-PR","CP1252"],
+ [0x0C0A,"es-ES","CP1252"],
+ [0x540A,"es-US","CP1252"],
+ [0x380A,"es-UY","CP1252"],
+ [0x200A,"es-VE","CP1252"],
+ [0x001D,"sv","CP1252"],
+ [0x081D,"sv-FI","CP1252"],
+ [0x041D,"sv-SE","CP1252"],
+ [0x005A,"syr","UNICODE"],
+ [0x045A,"syr-SY","UNICODE"],
+ [0x0428,"tg-Cyrl-TJ","CP1251"],
+ [0x085F,"tmz-Latn-DZ","CP1252"],
+ [0x0049,"ta","UNICODE"],
+ [0x0449,"ta-IN","UNICODE"],
+ [0x0044,"tt","CP1251"],
+ [0x0444,"tt-RU","CP1251"],
+ [0x004A,"te","UNICODE"],
+ [0x044A,"te-IN","UNICODE"],
+ [0x001E,"th","CP874"],
+ [0x041E,"th-TH","CP874"],
+ [0x0451,"bo-CN","UNICODE"],
+ [0x001F,"tr","CP1254"],
+ [0x041F,"tr-TR","CP1254"],
+ [0x0442,"tk-TM","CP1250"],
+ [0x0480,"ug-CN","CP1256"],
+ [0x0022,"uk","CP1251"],
+ [0x0422,"uk-UA","CP1251"],
+ [0x042E,"wen-DE","CP1252"],
+ [0x0020,"ur","CP1256"],
+ [0x0420,"ur-PK","CP1256"],
+ [0x0043,"uz","CP1254"],
+ [0x0843,"uz-Cyrl-UZ","CP1251"],
+ [0x0443,"uz-Latn-UZ","CP1254"],
+ [0x002A,"vi","CP1258"],
+ [0x042A,"vi-VN","CP1258"],
+ [0x0452,"cy-GB","CP1252"],
+ [0x0488,"wo-SN","CP1252"],
+ [0x0485,"sah-RU","CP1251"],
+ [0x0478,"ii-CN","UNICODE"],
+ [0x046A,"yo-NG","CP1252"],
+ ]
+ end
+ end
+end
diff --git a/vendor/gems/locale-2.0.5/lib/locale/info.rb b/vendor/gems/locale-2.0.5/lib/locale/info.rb
new file mode 100644
index 000000000..1aac39115
--- /dev/null
+++ b/vendor/gems/locale-2.0.5/lib/locale/info.rb
@@ -0,0 +1,12 @@
+=begin
+
+ info.rb - Load Locale::Info::Language and Locale::Info::Region.
+
+ Copyright (C) 2008 Masao Mutoh
+
+ $Id: info.rb 27 2008-12-03 15:06:50Z mutoh $
+=end
+
+require 'locale/info/language'
+require 'locale/info/region'
+
diff --git a/vendor/gems/locale-2.0.5/lib/locale/info/language.rb b/vendor/gems/locale-2.0.5/lib/locale/info/language.rb
new file mode 100644
index 000000000..b14752354
--- /dev/null
+++ b/vendor/gems/locale-2.0.5/lib/locale/info/language.rb
@@ -0,0 +1,135 @@
+# encoding: UTF-8
+=begin
+
+ language.rb - Locale::Info::Language class
+
+ Copyright (C) 2008 Masao Mutoh
+
+ Original Author:: Brian Pontarelli
+
+ $Id: language.rb 27 2008-12-03 15:06:50Z mutoh $
+=end
+
+require 'zlib'
+
+module Locale
+
+ module Info
+ # This class contains all the of the ISO information for the ISO 639-3
+ # languages. This class is immutable once constructed.
+ class Language
+ attr_reader :two_code, :three_code, :scope, :type, :name
+
+ #
+ # Constructs a new Language instance.
+ #
+ # * code The 2 or 3 digit ISO 639-3 language code.
+ # * scope A single character that defines the ISO scope of the language - <tt>(I)ndividual</tt>,
+ # <tt>(M)acrolanguage</tt>, or <tt>(S)pecial</tt>.
+ # * type A single character that defines the ISO type of the language - <tt>(A)ncient</tt>,
+ # <tt>(C)onstructed</tt>, <tt>(E)xtinct</tt>, <tt>(H)istorical</tt>, <tt>(L)iving</tt>,
+ # or <tt>(S)pecial</tt>.
+ # * name The name of the language.
+ #
+ def initialize(two_code, three_code, scope, type, name)
+ @two_code, @three_code, @scope, @type, @name = two_code, three_code, scope, type, name
+
+ @individual = (scope == "I")
+ @macro = (scope == "M")
+ @special = (scope == "S")
+ @constructed = (type == "C")
+ @living = (type == "L")
+ @extinct = (type == "E")
+ @ancient = (type == "A")
+ @historical = (type == "H")
+ @special_type = (type == "S")
+ end
+
+ # Returns true if the language is an individual language according to the ISO 639-3 data.
+ def individual?; @individual; end
+
+ # Returns true if the language is a macro language according to the ISO 639-3 data.
+ def macro?; @macro; end
+
+ # Returns true if the language is a special language according to the ISO 639-3 data.
+ def special?; @special; end
+
+ # Returns true if the language is a constructed language according to the ISO 639-3 data.
+ def constructed?; @constructed; end
+
+ # Returns true if the language is a living language according to the ISO 639-3 data.
+ def living?; @living; end
+
+ # Returns true if the language is an extinct language according to the ISO 639-3 data.
+ def extinct?; @extinct; end
+
+ # Returns true if the language is an ancient language according to the ISO 639-3 data.
+ def ancient?; @ancient; end
+
+ # Returns true if the language is an historical language according to the ISO 639-3 data.
+ def historical?; @historical; end
+
+ # Returns true if the language is a special type language according to the ISO 639-3 data.
+ def special_type?; @special_type; end
+
+ # Returns the two or three code.
+ def to_s
+ two_code || tree_code
+ end
+
+ # Returns this object is valid as ISO 639 data.
+ def iso_language?
+ @@lang_two_codes[two_code] != nil || @@lang_three_codes[three_code] != nil
+ end
+ end
+
+ @@lang_two_codes = Hash.new
+ @@lang_three_codes = Hash.new
+
+ Zlib::GzipReader.open(File.dirname(__FILE__) + "/../data/languages.tab.gz") do |gz|
+ gz.readlines.each do |l|
+ l.force_encoding('UTF-8') if l.respond_to?(:force_encoding)
+ unless l =~ /^\s*$/
+ parts = l.split(/\t/)
+ lang = Language.new(parts[2], parts[0], parts[3], parts[4], parts[5].strip)
+ @@lang_three_codes[parts[0]] = lang
+ @@lang_two_codes[parts[2]] = lang if parts[2].length > 0
+ end
+ end
+ end
+
+ module_function
+
+ # Returns a hash of all the ISO languages. The hash is {String, language} where
+ # the string is the 3 digit language code from the ISO 639 data. This contains
+ # all of the data from the ISO 639-3 data (7600 Languages).
+ #
+ # Need to require 'locale/info' or 'locale/language'.
+ def three_languages
+ @@lang_three_codes
+ end
+
+ # Returns a hash of all the ISO languages. The hash is {String, language} where
+ # the string is the 2 digit language code from the ISO 639-1 data. This contains
+ # all of the data from the ISO 639-1 data (186 Languages).
+ #
+ # Need to require 'locale/info' or 'locale/language'.
+ def two_languages
+ @@lang_two_codes
+ end
+
+ # Returns the language for the given 2 or 3 digit code.
+ #
+ # Need to require 'locale/info' or 'locale/language'.
+ def get_language(code)
+ @@lang_three_codes[code] || @@lang_two_codes[code]
+ end
+
+ # Returns the language code is valid.
+ #
+ # Need to require 'locale/info' or 'locale/language'.
+ def language_code?(code)
+ get_language(code) != nil
+ end
+ end
+end
diff --git a/vendor/gems/locale-2.0.5/lib/locale/info/region.rb b/vendor/gems/locale-2.0.5/lib/locale/info/region.rb
new file mode 100644
index 000000000..daf192410
--- /dev/null
+++ b/vendor/gems/locale-2.0.5/lib/locale/info/region.rb
@@ -0,0 +1,75 @@
+# encoding: UTF-8
+=begin
+
+ region.rb - Locale::Info::Region class
+
+ Copyright (C) 2008 Masao Mutoh
+
+ First Author:: Brian Pontarelli
+
+ $Id: region.rb 27 2008-12-03 15:06:50Z mutoh $
+=end
+
+require 'zlib'
+
+module Locale
+
+ module Info
+ # This class models out a region/country from the ISO 3166 standard for region codes.
+ # In ISO3166, it's called "Country" but Ruby/Locale the word "Region" instead.
+ class Region
+ attr_reader :code, :name
+
+ # code:: The 2 or 3 digit ISO 3166 region code.
+ # name:: The name of the region.
+ def initialize(code, name)
+ @code = code
+ @name = name
+ end
+
+ def iso_region?
+ @@regions[code] != nil
+ end
+
+ def to_s
+ "#{code}"
+ end
+ end
+
+ @@regions = Hash.new
+ Zlib::GzipReader.open(File.dirname(__FILE__) + "/../data/regions.tab.gz") do |gz|
+ gz.readlines.each do |l|
+ l.force_encoding('UTF-8') if l.respond_to?(:force_encoding)
+ unless l =~ /^\s*$/
+ parts = l.split(/\t/)
+ region = Region.new(parts[0], parts[1].strip)
+ @@regions[parts[0]] = region
+ end
+ end
+ end
+
+ module_function
+
+ # Returns a hash of all the ISO regions. The hash is {String, Region} where
+ # the string is the 2 digit region code from the ISO 3166 data.
+ #
+ # You need to require 'locale/info' or 'locale/region'.
+ def regions
+ @@regions
+ end
+
+ # Returns the region for the given code.
+ #
+ # You need to require 'locale/info' or 'locale/info/region'.
+ def get_region(code)
+ @@regions[code]
+ end
+
+ # Returns the region code is valid.
+ #
+ # You need to require 'locale/info' or 'locale/info/region'.
+ def valid_region_code?(code)
+ @@regions[code] != nil
+ end
+ end
+end
diff --git a/vendor/gems/locale-2.0.5/lib/locale/tag.rb b/vendor/gems/locale-2.0.5/lib/locale/tag.rb
new file mode 100644
index 000000000..f4be35ad3
--- /dev/null
+++ b/vendor/gems/locale-2.0.5/lib/locale/tag.rb
@@ -0,0 +1,39 @@
+=begin
+ tag.rb - Locale::Tag module
+
+ Copyright (C) 2008,2009 Masao Mutoh
+
+ You may redistribute it and/or modify it under the same
+ license terms as Ruby.
+=end
+
+require 'locale/tag/simple'
+require 'locale/tag/irregular'
+require 'locale/tag/common'
+require 'locale/tag/rfc'
+require 'locale/tag/cldr'
+require 'locale/tag/posix'
+require 'locale/util/memoizable'
+
+module Locale
+
+ # Language tag / locale identifiers.
+ module Tag
+ include Util::Memoizable
+ module_function
+ # Parse a language tag/locale name and return Locale::Tag
+ # object.
+ # * tag: a tag as a String. e.g.) ja-Hira-JP
+ # * Returns: a Locale::Tag subclass.
+ def parse(tag)
+ # Common is not used here.
+ [Simple, Common, Rfc, Cldr, Posix].each do |parser|
+ ret = parser.parse(tag)
+ return ret if ret
+ end
+ Locale::Tag::Irregular.new(tag)
+ end
+ memoize :parse
+ end
+end
+
diff --git a/vendor/gems/locale-2.0.5/lib/locale/tag/cldr.rb b/vendor/gems/locale-2.0.5/lib/locale/tag/cldr.rb
new file mode 100644
index 000000000..0a52d836d
--- /dev/null
+++ b/vendor/gems/locale-2.0.5/lib/locale/tag/cldr.rb
@@ -0,0 +1,99 @@
+=begin
+ locale/tag/cldr.rb - Locale::Tag::CLDR
+
+ Copyright (C) 2008,2009 Masao Mutoh
+
+ You may redistribute it and/or modify it under the same
+ license terms as Ruby.
+=end
+
+require 'locale/tag/common'
+
+module Locale
+ module Tag
+
+ # Unicode locale identifier class for CLDR-1.6.1.
+ # (Unicode Common Locale Data Repository).
+ class Cldr < Common
+
+ VARIANT = "(#{ALPHANUM}{5,8}|#{DIGIT}#{ALPHANUM}{3})"
+ EXTENSION = "#{ALPHANUM}+=[a-z0-9\-]+"
+
+ TAG_RE = /\A#{LANGUAGE}(?:[-_]#{SCRIPT})?
+ (?:[-_]#{REGION})?((?:[-_]#{VARIANT})*
+ (?:@(#{EXTENSION};?)+)*)\Z/ix
+
+ attr_reader :extensions
+
+ class << self
+ include Util::Memoizable
+ # Parse the language tag and return the new Locale::Tag::CLDR.
+ def parse(tag)
+ if tag =~ /\APOSIX\Z/ # This is the special case of POSIX locale but match this regexp.
+ nil
+ elsif tag =~ TAG_RE
+ lang, script, region, subtag = $1, $2, $3, $4
+
+ extensions = {}
+ subtag.scan(/#{EXTENSION}/i).each{|v|
+ subtag.sub!(v, "")
+ key, type = v.split("=")
+ extensions[key] = type
+ }
+ variants = subtag.scan(/#{VARIANT}/i).collect{|v| v[0].upcase}
+
+ ret = self.new(lang, script, region, variants, extensions)
+ ret.tag = tag
+ ret
+ else
+ nil
+ end
+ end
+ memoize_dup :parse
+ end
+
+ # Create Locale::Tag::Cldr.
+ #
+ # variants should be upcase.
+ def initialize(language, script = nil, region = nil,
+ variants = [], extensions = {})
+ @extensions = extensions
+ super(language, script, region, variants.map{|v| v.upcase})
+ end
+
+ # Sets the extensions as an Hash.
+ def extensions=(val)
+ clear
+ @extensions = val
+ end
+
+ private
+ def convert_to(klass) # :nodoc:
+ if klass == Cldr
+ klass.new(language, script, region, variants, extensions)
+ elsif klass == Rfc
+ exts = []
+ @extensions.to_a.sort.each do |k, v|
+ exts << "k-#{k[0,8]}-#{v[0,8]}"
+ end
+
+ klass.new(language, script, region, variants, exts)
+ else
+ super
+ end
+ end
+
+ # Returns the language tag.
+ # (e.g.) "ja_Hira_JP_VARIANT1_VARIANT2@foo1=var1;foo2=var2"
+ #
+ # This is used in internal only. Use to_s instead.
+ def to_string
+ s = super
+ if @extensions.size > 0
+ s << "@" << @extensions.to_a.sort.map{|k, v| "#{k}=#{v}"}.join(";")
+ end
+ s
+ end
+ end
+ end
+end
diff --git a/vendor/gems/locale-2.0.5/lib/locale/tag/common.rb b/vendor/gems/locale-2.0.5/lib/locale/tag/common.rb
new file mode 100644
index 000000000..ad85c18da
--- /dev/null
+++ b/vendor/gems/locale-2.0.5/lib/locale/tag/common.rb
@@ -0,0 +1,129 @@
+=begin
+ locale/tag/common.rb - Locale::Tag::Common
+
+ Copyright (C) 2008,2009 Masao Mutoh
+
+ You may redistribute it and/or modify it under the same
+ license terms as Ruby.
+=end
+
+require 'locale/tag/simple'
+
+module Locale
+ module Tag
+ # Common Language tag class for Ruby.
+ # Java and MS Windows use this format.
+ #
+ # * ja (language: RFC4646)
+ # * ja_JP (country: RFC4646(2 alpha or 3 digit))
+ # * ja-JP
+ # * ja_Hira_JP (script: 4 characters)
+ # * ja-Hira-JP
+ # * ja_Hira_JP_MOBILE (variants: more than 2 characters or 3 digit)
+ # * ja_Hira_JP_MOBILE_IPHONE (2 variants example)
+ #
+ class Common < Simple
+ LANGUAGE = "(#{ALPHA}{2,3}|#{ALPHA}{4}|#{ALPHA}{5,8})" #RFC4646 (ISO639/reserved/registered)
+ SCRIPT = "(#{ALPHA}{4})"
+ VARIANT = "(#{ALPHANUM}{3,}|#{DIGIT}#{ALPHANUM}{3})" #RFC3066 compatible
+
+ TAG_RE = /\A#{LANGUAGE}(?:[-_]#{SCRIPT})?
+ (?:[-_]#{REGION})?((?:[-_]#{VARIANT})*)\Z/ix
+
+ attr_reader :script, :variants
+
+ class << self
+ include Util::Memoizable
+ # Parse the language tag and return the new Locale::Tag::Common.
+ def parse(tag)
+ if tag =~ /\APOSIX\Z/ # This is the special case of POSIX locale but match this regexp.
+ nil
+ elsif tag =~ TAG_RE
+ lang, script, region, subtag = $1, $2, $3, $4
+ variants = subtag.scan(/(^|[-_])#{VARIANT}(?=([-_]|$))/i).collect{|v| v[1]}
+
+ ret = self.new(lang, script, region, variants)
+ ret.tag = tag
+ ret
+ else
+ nil
+ end
+ end
+ memoize_dup :parse
+ end
+
+ # Create a Locale::Tag::Common.
+ def initialize(language, script = nil, region = nil, variants = [])
+ @script, @variants = script, variants
+ @script = @script.capitalize if @script
+ super(language, region)
+ end
+
+ # Set the script (with capitalize)
+ def script=(val)
+ clear
+ @script = val
+ @script = @script.capitalize if @script
+ @script
+ end
+
+ # Set the variants as an Array.
+ def variants=(val)
+ clear
+ @variants = val
+ end
+
+ # Returns an Array of tag-candidates order by priority.
+ # Use Locale.candidates instead of this method.
+ #
+ # Locale::Tag::Rfc, Cldr don't have their own candidates,
+ # because it's meaningless to compare the extensions, privateuse, etc.
+ def candidates
+ [self.class.new(language, script, region, variants), #ja-Kana-JP-FOO
+ self.class.new(language, script, region), #ja-Kana-JP
+ self.class.new(language, nil, region, variants), #ja-JP-FOO
+ self.class.new(language, nil, region), #ja-JP
+ self.class.new(language, script, nil, variants), #ja-Kana-FOO
+ self.class.new(language, script), #ja-Kana
+ self.class.new(language, nil, nil, variants), #ja-FOO
+ self.class.new(language)] #ja
+ end
+ memoize_dup :candidates
+
+ private
+ def convert_to(klass) #:nodoc:
+ if klass == Simple
+ super
+ elsif klass == Posix
+ if variants.size > 0
+ var = variants.join("-")
+ else
+ var = nil
+ end
+ klass.new(language, region, nil, var)
+ elsif klass == Cldr
+ klass.new(language, script, region, variants.map{|v| v.upcase})
+ else
+ klass.new(language, script, region, variants)
+ end
+ end
+
+ # Returns the common language tag with "_".
+ # <language>_<Script>_<REGION>_VARIANTS1_VARIANTS2
+ # (e.g.) "ja_Hira_JP_VARIANTS1_VARIANTS2"
+ #
+ # This is used in internal only. Use to_s instead.
+ def to_string
+ s = @language.dup
+
+ s << "_" << @script if @script
+ s << "_" << @region if @region
+
+ @variants.each do |v|
+ s << "_#{v}"
+ end
+ s
+ end
+ end
+ end
+end
diff --git a/vendor/gems/locale-2.0.5/lib/locale/tag/irregular.rb b/vendor/gems/locale-2.0.5/lib/locale/tag/irregular.rb
new file mode 100644
index 000000000..ede85b600
--- /dev/null
+++ b/vendor/gems/locale-2.0.5/lib/locale/tag/irregular.rb
@@ -0,0 +1,40 @@
+=begin
+ locale/tag/irregular.rb - Locale::Tag::Irregular
+
+ Copyright (C) 2008 Masao Mutoh
+
+ You may redistribute it and/or modify it under the same
+ license terms as Ruby.
+
+ $Id: irregular.rb 27 2008-12-03 15:06:50Z mutoh $
+=end
+
+require 'locale/tag/simple'
+
+module Locale
+
+ module Tag
+ # Broken tag class.
+ class Irregular < Simple
+
+ def initialize(tag)
+ tag = "en" if tag == nil or tag == ""
+ super(tag.to_s)
+ @tag = tag
+ end
+
+ # Returns an Array of tag-candidates order by priority.
+ def candidates
+ [Irregular.new(tag)]
+ end
+ memoize :candidates
+
+ # Conver to the klass(the class of Language::Tag)
+ private
+ def convert_to(klass)
+ klass.new(tag)
+ end
+ memoize :convert_to
+ end
+ end
+end
diff --git a/vendor/gems/locale-2.0.5/lib/locale/tag/posix.rb b/vendor/gems/locale-2.0.5/lib/locale/tag/posix.rb
new file mode 100644
index 000000000..b04aa54a1
--- /dev/null
+++ b/vendor/gems/locale-2.0.5/lib/locale/tag/posix.rb
@@ -0,0 +1,97 @@
+=begin
+ locale/tag/posix.rb - Locale::Tag::Posix
+
+ Copyright (C) 2008 Masao Mutoh
+
+ You may redistribute it and/or modify it under the same
+ license terms as Ruby.
+
+ $Id: posix.rb 27 2008-12-03 15:06:50Z mutoh $
+=end
+
+module Locale
+ module Tag
+
+ # Locale tag class for POSIX locale
+ # * ja
+ # * ja_JP
+ # * ja_JP.UTF-8
+ # * ja_JP.UTF-8@Osaka
+ # * C/POSIX (-> en_US)
+ class Posix < Simple
+ LANGUAGE = "([a-z]{2,})"
+ TAG_RE = /\A#{LANGUAGE}(?:_#{REGION})?(?:\.([^@]+))?(?:@(.*))?\Z/i
+
+ attr_reader :charset, :modifier
+
+ def initialize(language, region = nil, charset = nil, modifier = nil)
+ @charset, @modifier = charset, modifier
+ super(language, region)
+ end
+
+ def self.parse(tag)
+ if tag =~ /^(C|POSIX)$/
+ ret = self.new("en", "US")
+ ret.tag = tag
+ ret
+ elsif tag =~ TAG_RE
+ ret = self.new($1, $2, $3, $4)
+ ret.tag = tag
+ ret
+ else
+ nil
+ end
+ end
+
+ # Returns the language tag.
+ # <language>_<COUNTRY>.<CHARSET>@<MODIFIER>
+ # (e.g.) "ja_JP.EUC-JP@Modifier"
+ def to_s
+ s = @language.dup
+ s << "_#{@region}" if @region
+ s << ".#{@charset}" if @charset
+ s << "@#{@modifier}" if @modifier
+ s
+ end
+
+ # Set the charset.
+ def charset=(val)
+ clear
+ @charset = val
+ end
+
+ # Set the modifier as a String
+ def modifier=(val)
+ clear
+ @modifier = val
+ end
+
+ # Returns an Array of tag-candidates order by priority.
+ # Use Locale.candidates instead of this method.
+ def candidates
+ [self.class.new(language, region, charset, modifier), #ja_JP.UTF-8@Modifier
+ self.class.new(language, region, charset), #ja_JP.UTF-8
+ self.class.new(language, region, nil, modifier), #ja_JP@Modifier
+ self.class.new(language, region, nil, nil), #ja_JP@Modifier
+ self.class.new(language, nil, charset, modifier), #ja.UTF-8@Modifier
+ self.class.new(language, nil, charset), #ja.UTF-8
+ self.class.new(language, nil, nil, modifier), #ja@Modifier
+ self.class.new(language)] #ja
+ end
+
+ # A modifier is converted to a variant.
+ # If the modifier is less than 5 characters, it is not canonical value.
+ private
+ def convert_to(klass)
+ if klass == Simple
+ super
+ elsif klass == Posix
+ klass.new(language, region, charset, modifier)
+ else
+ klass.new(language, nil, region, modifier ? [modifier] : [])
+ end
+ end
+
+ end
+ end
+end
diff --git a/vendor/gems/locale-2.0.5/lib/locale/tag/rfc.rb b/vendor/gems/locale-2.0.5/lib/locale/tag/rfc.rb
new file mode 100644
index 000000000..5a230b6e0
--- /dev/null
+++ b/vendor/gems/locale-2.0.5/lib/locale/tag/rfc.rb
@@ -0,0 +1,112 @@
+=begin
+ locale/tag/rfc.rb - Locale::Tag::Rfc
+
+ Copyright (C) 2008,2009 Masao Mutoh
+
+ You may redistribute it and/or modify it under the same
+ license terms as Ruby.
+=end
+
+require 'locale/tag/common'
+
+module Locale
+ module Tag
+
+ # Language tag class for RFC4646(BCP47).
+ class Rfc < Common
+ SINGLETON = '[a-wyz0-9]'
+ VARIANT = "(#{ALPHANUM}{5,8}|#{DIGIT}#{ALPHANUM}{3})"
+ EXTENSION = "(#{SINGLETON}(?:-#{ALPHANUM}{2,8})+)"
+ PRIVATEUSE = "(x(?:-#{ALPHANUM}{1,8})+)"
+ GRANDFATHERED = "#{ALPHA}{1,3}(?:-#{ALPHANUM}{2,8}){1,2}"
+
+ TAG_RE = /\A#{LANGUAGE}(?:-#{SCRIPT})?
+ (?:-#{REGION})?((?:-#{VARIANT})*
+ (?:-#{EXTENSION})*(?:-#{PRIVATEUSE})?)\Z/ix
+
+ attr_reader :extensions, :privateuse
+
+ class << self
+ include Util::Memoizable
+ # Parse the language tag and return the new Locale::Tag::Rfc.
+ def parse(tag)
+ if tag =~ /\APOSIX\Z/ # This is the special case of POSIX locale but match this regexp.
+ nil
+ elsif tag =~ TAG_RE
+ lang, script, region, subtag = $1, $2, $3, $4
+ extensions = []
+ variants = []
+ if subtag =~ /#{PRIVATEUSE}/
+ subtag, privateuse = $`, $1
+ # Private use for CLDR.
+ if /x-ldml(.*)/ =~ privateuse
+ p_subtag = $1
+ extensions = p_subtag.scan(/(^|-)#{EXTENSION}/i).collect{|v| p_subtag.sub!(v[1], ""); v[1]}
+ variants = p_subtag.scan(/(^|-)#{VARIANT}(?=(-|$))/i).collect{|v| v[1]}
+ end
+ end
+ extensions += subtag.scan(/(^|-)#{EXTENSION}/i).collect{|v| subtag.sub!(v[1], ""); v[1]}
+ variants += subtag.scan(/(^|-)#{VARIANT}(?=(-|$))/i).collect{|v| v[1]}
+
+ ret = self.new(lang, script, region, variants, extensions, privateuse)
+ ret.tag = tag
+ ret
+ else
+ nil
+ end
+ end
+ memoize_dup :parse
+ end
+
+ def initialize(language, script = nil, region = nil, variants = [],
+ extensions = [], privateuse = nil)
+ @extensions, @privateuse = extensions, privateuse
+ super(language, script, region, variants)
+ end
+
+ # Sets the extensions as an Array.
+ def extensions=(val)
+ clear
+ @extensions = val
+ end
+
+ # Sets the privateuse as a String
+ def privateuse=(val)
+ clear
+ @privateuse = val
+ end
+
+ private
+ def convert_to(klass)
+ if klass == Rfc
+ klass.new(language, script, region, variants, extensions, privateuse)
+ elsif klass == Cldr
+ exts = {}
+ extensions.sort.each do |v|
+ if v =~ /^k-(#{ALPHANUM}{2,})-(.*)$/i
+ exts[$1] = $2
+ end
+ end
+ klass.new(language, script, region, variants, exts)
+ else
+ super
+ end
+ end
+
+ # Returns the language tag
+ # <language>-<Script>-<REGION>-<variants>-<extensions>-<PRIVATEUSE>
+ # (e.g.) "ja-Hira-JP-variant"
+ #
+ # This is used in internal only. Use to_s instead.
+ def to_string
+ s = super.gsub(/_/, "-")
+ @extensions.sort.each do |v|
+ s << "-#{v}"
+ end
+ s << "-#{@privateuse}" if @privateuse
+ s
+ end
+
+ end
+ end
+end
diff --git a/vendor/gems/locale-2.0.5/lib/locale/tag/simple.rb b/vendor/gems/locale-2.0.5/lib/locale/tag/simple.rb
new file mode 100644
index 000000000..bf3719b88
--- /dev/null
+++ b/vendor/gems/locale-2.0.5/lib/locale/tag/simple.rb
@@ -0,0 +1,162 @@
+=begin
+ locale/tag/simple.rb - Locale::Tag::Simple
+
+ Copyright (C) 2008,2009 Masao Mutoh
+
+ You may redistribute it and/or modify it under the same
+ license terms as Ruby.
+=end
+
+require 'locale/util/memoizable'
+
+module Locale
+ module Tag
+ # Abstract language tag class.
+ # This class has <language>, <region> which
+ # all of language tag specifications have.
+ #
+ # * ja (language: ISO 639 (2 or 3 alpha))
+ # * ja_JP (country: RFC4646 (ISO3166/UN M.49) (2 alpha or 3 digit)
+ # * ja-JP
+ # * ja-392
+ class Simple
+ include Util::Memoizable
+
+ ALPHA = '[a-z]'
+ DIGIT = '[0-9]'
+ ALPHANUM = "[a-zA-Z0-9]"
+
+ LANGUAGE = "(#{ALPHA}{2,3})" # ISO 639
+ REGION = "(#{ALPHA}{2}|#{DIGIT}{3})" # RFC4646 (ISO3166/UN M.49)
+
+ TAG_RE = /\A#{LANGUAGE}(?:[_-]#{REGION})?\Z/i
+
+ include Util::Memoizable
+
+ attr_reader :language, :region
+
+ # tag is set when .parse method is called.
+ # This value is used when the program want to know the original
+ # String.
+ attr_accessor :tag
+
+ # call-seq:
+ # to_common
+ # to_posix
+ # to_rfc
+ # to_cldr
+ #
+ # Convert to each tag classes.
+ [:simple, :common, :posix, :rfc, :cldr].each do |name|
+ class_eval <<-EOS
+ def to_#{name}
+ convert_to(#{name.to_s.capitalize})
+ end
+ memoize_dup :to_#{name}
+ EOS
+ end
+
+ class << self
+ include Util::Memoizable
+ # Parse the language tag and return the new Locale::Tag::Simple.
+ def parse(tag)
+ if tag =~ TAG_RE
+ ret = self.new($1, $2)
+ ret.tag = tag
+ ret
+ else
+ nil
+ end
+ end
+ memoize_dup :parse
+ end
+
+ # Create a Locale::Tag::Simple
+ def initialize(language, region = nil)
+ raise "language can't be nil." unless language
+ @language, @region = language, region
+ @language = @language.downcase if @language
+ @region = @region.upcase if @region
+ end
+
+ # Returns the language tag as the String.
+ # <language>_<REGION>
+ # (e.g.) "ja_JP"
+ def to_s
+ to_string
+ end
+ memoize :to_s
+
+ def to_str #:nodoc:
+ to_s
+ end
+
+ def <=>(other)
+ self.to_s <=> other.to_s
+ end
+
+ def ==(other) #:nodoc:
+ other != nil and hash == other.hash
+ end
+
+ def eql?(other) #:nodoc:
+ self.==(other)
+ end
+ memoize :eql?
+
+ def hash #:nodoc:
+ "#{self.class}:#{to_s}".hash
+ end
+ memoize :hash
+
+ def inspect #:nodoc:
+ %Q[#<#{self.class}: #{to_s}>]
+ end
+ memoize :inspect
+
+ # For backward compatibility.
+ def country; region end
+
+ # Set the language (with downcase)
+ def language=(val)
+ clear
+ @language = val
+ @language = @language.downcase if @language
+ @language
+ end
+
+ # Set the region (with upcase)
+ def region=(val)
+ clear
+ @region = val
+ @region = @region.upcase if @region
+ @region
+ end
+
+ # Returns an Array of tag-candidates order by priority.
+ # Use Locale.candidates instead of this method.
+ def candidates
+ [self.class.new(language, region), self.class.new(language)]
+ end
+ memoize_dup :candidates
+
+ # Convert to the klass(the class of Language::Tag)
+ private
+ def convert_to(klass) #:nodoc:
+ if klass == Simple || klass == Posix
+ klass.new(language, region)
+ else
+ klass.new(language, nil, region)
+ end
+ end
+
+ # Return simple language tag which format is"<lanuguage>_<REGION>".
+ # This is to use internal only. Use to_s instead.
+ def to_string
+ s = @language.dup
+ s << "_" << @region if @region
+ s
+ end
+ end
+ end
+end
diff --git a/vendor/gems/locale-2.0.5/lib/locale/taglist.rb b/vendor/gems/locale-2.0.5/lib/locale/taglist.rb
new file mode 100644
index 000000000..e5d879cc3
--- /dev/null
+++ b/vendor/gems/locale-2.0.5/lib/locale/taglist.rb
@@ -0,0 +1,109 @@
+=begin
+ taglist.rb - Locale module
+
+ Copyright (C) 2008 Masao Mutoh
+
+ You may redistribute it and/or modify it under the same
+ license terms as Ruby.
+
+ $Id: taglist.rb 27 2008-12-03 15:06:50Z mutoh $
+=end
+
+require 'locale/util/memoizable'
+
+module Locale
+ # This provides the subclass of Array which behaves like
+ # the first(top priority) Locale::Tag object.
+ # "Locale.current.language" is same with "Locale.current[0].language".
+ #
+ # Locale.current returns an Array of Tag(s) now.
+ # But the old Locale.current(Ruby-GetText) and Locale.get
+ # returns Locale::Object (similier with Locale::Tag::Posix).
+ # This is the class for backward compatibility.
+ #
+ # It is recommanded to use Locale.current[0] or
+ # Locale.candidates to find the current locale instead
+ # of this function.
+ #
+ class TagList < Array
+ include Util::Memoizable
+
+ # Returns the top priority language. (simple)
+ def language
+ self[0].language
+ end
+ # Returns the top priority region/country. (simple)
+ def country
+ self[0].region
+ end
+ # Returns the top priority region/country. (simple)
+ def region
+ self[0].region
+ end
+ # Returns the top priority script. (common)
+ def script
+ self[0].script
+ end
+ # Returns the top priority charset. (posix)
+ def charset
+ if self[0].respond_to? :charset
+ self[0].charset
+ else
+ ::Locale.driver_module.charset
+ end
+ end
+ memoize :charset
+
+ # Returns the top priority modifier. (posix)
+ def modifier
+ (self[0].respond_to? :modifier) ? self[0].modifier : nil
+ end
+ memoize :modifier
+
+ # Returns the top priority variants.(common, rfc, cldr)
+ def variants
+ (self[0].respond_to? :variants) ? self[0].variants : nil
+ end
+ memoize :variants
+
+ # Returns the top priority extensions.(common, rfc, cldr)
+ def extensions
+ (self[0].respond_to? :extensions) ? self[0].extensions : nil
+ end
+ memoize :extensions
+
+ # Returns the top priority privateuse(rfc)
+ def privateuse
+ (self[0].respond_to? :privateuse) ? self[0].privateuse : nil
+ end
+ memoize :privateuse
+
+ def to_str
+ self[0].to_str
+ end
+
+ def to_s
+ self[0].to_s
+ end
+
+ def to_common
+ self[0].to_common
+ end
+
+ def to_simple
+ self[0].to_simple
+ end
+
+ def to_rfc
+ self[0].to_rfc
+ end
+
+ def to_cldr
+ self[0].to_cldr
+ end
+
+ def to_posix
+ self[0].to_posix
+ end
+ end
+end
diff --git a/vendor/gems/locale-2.0.5/lib/locale/util/memoizable.rb b/vendor/gems/locale-2.0.5/lib/locale/util/memoizable.rb
new file mode 100644
index 000000000..b26ffc86c
--- /dev/null
+++ b/vendor/gems/locale-2.0.5/lib/locale/util/memoizable.rb
@@ -0,0 +1,108 @@
+# Refer from activesupport-2.2.0.
+#
+# * Remove the dependecies to activesupport.
+# * change the key to hash value of args.
+# * Not Thread safe
+# * Add the clear method.
+module Locale
+ module Util
+ module Memoizable
+ MEMOIZED_IVAR = Proc.new do |symbol|
+ "#{symbol.to_s.sub(/\?\Z/, '_query').sub(/!\Z/, '_bang')}".to_sym
+ end
+
+ def self.included(base)
+ mod = self
+ base.class_eval do
+ extend mod
+ end
+ end
+
+ alias :freeze_without_memoizable :freeze #:nodoc:
+ def freeze #:nodoc:
+ unless frozen?
+ @_memoized_ivars = {}
+ freeze_without_memoizable
+ end
+ end
+
+ # Clear memoized values. Deprecated.
+ def clear # :nodoc:
+ @_memoized_ivars = {}
+ end
+
+ # Clear memoized values.
+ def memoize_clear
+ @_memoized_ivars = {}
+ end
+
+ # Cache the result of the methods.
+ #
+ # include Memoizable
+ # def foo
+ # ......
+ # end
+ # def bar(a, b)
+ # ......
+ # end
+ # memoize :foo, :bar(a, b)
+ #
+ # To clear cache, #clear_foo, #clear_bar is also defined.
+ #
+ # (NOTE)
+ # * Consider to use this with huge objects to avoid memory leaks.
+ # * Can't use this with super.<method> because of infinity loop.
+ def memoize(*symbols)
+ memoize_impl(false, *symbols)
+ end
+
+ # memoize with dup. A copy object is returned.
+ def memoize_dup(*symbols)
+ memoize_impl(true, *symbols)
+ end
+
+ def memoize_impl(is_dup, *symbols) #:nodoc:
+ symbols.each do |symbol|
+ original_method = "_unmemoized_#{symbol}"
+ memoized_ivar = MEMOIZED_IVAR.call(symbol)
+ dup_meth = is_dup ? "_dup" : ""
+
+ class_eval <<-EOS, __FILE__, __LINE__
+ alias #{original_method} #{symbol}
+ def #{symbol}(*args)
+ _memoize#{dup_meth}(:#{memoized_ivar}, args.hash) do
+ #{original_method}(*args)
+ end
+ end
+ EOS
+ end
+ end
+
+ def _memoize(ivar, key) #:nodoc:
+ @_memoized_ivars ||= {}
+ @_memoized_ivars[ivar] ||= {}
+
+ ret = @_memoized_ivars[ivar][key]
+ unless ret
+ ret = yield
+ ret.freeze
+ @_memoized_ivars[ivar][key] = ret
+ end
+ ret
+ end
+
+ def _memoize_dup(ivar, key) #:nodoc:
+ ret = _memoize(ivar, key) do; yield; end
+ if ret
+ if ret.kind_of? Array
+ ret.map{|v| v.dup}.dup
+ else
+ ret.dup
+ end
+ else
+ nil
+ end
+ end
+ end
+ end
+end
diff --git a/vendor/gems/locale-2.0.5/lib/locale/version.rb b/vendor/gems/locale-2.0.5/lib/locale/version.rb
new file mode 100644
index 000000000..63bb15b35
--- /dev/null
+++ b/vendor/gems/locale-2.0.5/lib/locale/version.rb
@@ -0,0 +1,12 @@
+=begin
+ version - version information of Ruby-Locale
+
+ Copyright (C) 2008 Masao Mutoh
+
+ You may redistribute it and/or modify it under the same
+ license terms as Ruby.
+=end
+module Locale
+ VERSION = "2.0.5"
+end
+
diff --git a/vendor/gems/locale-2.0.5/samples/cgi/README b/vendor/gems/locale-2.0.5/samples/cgi/README
new file mode 100644
index 000000000..e11819306
--- /dev/null
+++ b/vendor/gems/locale-2.0.5/samples/cgi/README
@@ -0,0 +1,20 @@
+Sample script for CGI/ERB and Ruby/Locale.
+
+Run the http server.
+$ ruby http.rb
+
+Access the http server from WWW browser:
+
+http://localhost:10080/
+
+or
+
+If you want to set locale(lang) forcely, then:
+
+http://localhost:10080/?lang=ja
+ #ja is a target locale in this sample.
+
+http.rb - an http server for samples using WEBrick
+index.cgi - a sample menu (CGI sample)
+cookie.cgi - Set lang to cookie value.
+locale.css - CSS file.
diff --git a/vendor/gems/locale-2.0.5/samples/cgi/cookie.cgi b/vendor/gems/locale-2.0.5/samples/cgi/cookie.cgi
new file mode 100755
index 000000000..06adbc813
--- /dev/null
+++ b/vendor/gems/locale-2.0.5/samples/cgi/cookie.cgi
@@ -0,0 +1,62 @@
+#!/usr/bin/env ruby
+=begin
+ cookie.cgi - Set a selected locale to the cookie of WWW Browser.
+
+ Set UTF-8 forcely as output charset.
+
+ Recommanded to set UTF-8 forcely because some web browser
+ doesn't send HTTP_ACCEPT_CHARSET correctly.
+
+ Copyright (C) 2008 Masao Mutoh
+
+ You may redistribute it and/or modify it under the same
+ license terms as Ruby.
+=end
+
+$:<< "../../lib"
+
+require 'locale'
+require 'cgi'
+
+# Initialization of Locale library.
+Locale.init(:driver => :cgi)
+cgi = CGI.new
+Locale.set_cgi(cgi)
+
+# Get "lang" from the query string.
+lang = cgi["lang"] or ""
+
+#
+# CGI part
+#
+print "Set-Cookie:lang=#{lang}\n"
+print "Content-type:text/html; charset=UTF-8\n\n"
+
+puts %Q[
+<html>
+<head>
+ <meta http-equiv="content-type" content="text/html; charset=UTF-8">
+ <link rel="stylesheet" type="text/css" href="locale.css" media="all">
+ <title>Sample script for CGI and Ruby/Locale</title>
+</head>
+<body>
+
+<div style="text-align:center; margin:5em;">
+]
+
+if lang.size > 0
+ puts %Q!<p><div id="result">Set [#{lang}] as the cookie of your WWW browser.</div></p>!
+else
+ puts %Q!<p><div id="result">Clear "lang" value from your WWW browser.</div></p>!
+end
+
+puts %Q!
+<p style="margin:2em;"><a href="/">Back</a></p>
+</div>
+<div style="text-align:right">
+ <p>Copyright (C) 2008 Masao Mutoh</p>
+</div>
+</body>
+</html>
+!
+
diff --git a/vendor/gems/locale-2.0.5/samples/cgi/http.rb b/vendor/gems/locale-2.0.5/samples/cgi/http.rb
new file mode 100755
index 000000000..033d451f3
--- /dev/null
+++ b/vendor/gems/locale-2.0.5/samples/cgi/http.rb
@@ -0,0 +1,52 @@
+#! /usr/bin/env ruby
+=begin
+ http.rb - An WebServer for hello locale sample.
+
+ Copyright (C) 2005-2008 Masao Mutoh
+
+ You may redistribute it and/or modify it under the same
+ license terms as Ruby.
+
+ Original: Ruby-GetText-Package 1.92.0
+
+ $Id$
+=end
+
+require 'webrick'
+require 'cgi'
+require 'rbconfig'
+
+interpreter = File.join(Config::CONFIG['bindir'], Config::CONFIG['ruby_install_name']) +
+ Config::CONFIG['EXEEXT']
+
+srv = WEBrick::HTTPServer.new({:BindAddress => '127.0.0.1',
+ :Logger => WEBrick::Log::new($stderr, WEBrick::Log::DEBUG),
+ # :CGIInterpreter => "ruby -d",
+ :Port => 10080})
+
+['INT', 'TERM'].each { |signal|
+ trap(signal){ srv.shutdown}
+}
+
+srv.mount("/", WEBrick::HTTPServlet::FileHandler, File.expand_path('.'))
+
+srv.mount_proc("/src/") do |req, res|
+ res.header["Content-Type"] = "text/html; charset=UTF-8"
+ if req.query_string
+ file = File.open(req.query_string).read
+ res.body = %Q[<html>
+ <head>
+ <title>View a source code</title>
+ <meta http-equiv="content-type" content="text/html; charset=UTF-8">
+ <link rel="stylesheet" type="text/css" href="/gettext.css" media="all">
+ </head>
+ <body><h1>#{req.query_string}</h1>
+ <pre>#{CGI.escapeHTML(file)}</pre>
+ <p><a href="/">Back</a></p>
+ </body>
+ </html>
+ ]
+ end
+end
+
+srv.start
diff --git a/vendor/gems/locale-2.0.5/samples/cgi/index.cgi b/vendor/gems/locale-2.0.5/samples/cgi/index.cgi
new file mode 100755
index 000000000..47eb45237
--- /dev/null
+++ b/vendor/gems/locale-2.0.5/samples/cgi/index.cgi
@@ -0,0 +1,90 @@
+#!/usr/bin/env ruby
+=begin
+ index.cgi - Sample script for CGI
+
+ Copyright (C) 2008 Masao Mutoh
+
+ You may redistribute it and/or modify it under the same
+ license terms as Ruby.
+=end
+$:<< "../../lib"
+
+begin
+ require 'rubygems'
+rescue LoadError
+end
+
+require 'locale'
+require 'cgi'
+
+# Initialize Locale library.
+Locale.init(:driver => :cgi)
+cgi = CGI.new
+Locale.set_cgi(cgi)
+
+
+url_base = "http://#{cgi.server_name}:#{cgi.server_port}/"
+
+sample_locales = ["en-US", "fr-FR", "ja-JP"]
+
+langs = Locale.candidates(:type => :common) #Try :rfc, :simple and others.
+
+
+#
+# CGI part
+#
+
+print "Content-type:text/html; charset=UTF-8\n\n"
+
+puts %Q[<html><head>
+ <meta http-equiv="content-type" content="text/html; charset=UTF-8">
+ <link rel="stylesheet" type="text/css" href="locale.css" media="all">
+ <title>Sample script for CGI/ERB and Ruby/Locale</title>
+</head>
+<body>
+<h1>Ruby/Locale CGI sample scripts</h1>
+<p>Requested Locales order by the priority:</p>
+<div id="result">#{CGI.escapeHTML(langs.inspect)}</div>
+
+<h2>Auto-Detect the locale from the WWW browser</h2>
+<p><a href="./">#{url_base}</a></p>
+
+<h2>Set locale as the "lang" parameter</h2>
+<ol>
+]
+sample_locales.each do |lang|
+ url = url_base + "?lang=" + lang
+ puts %Q!<li> <a href="#{url}">#{CGI.escapeHTML(url)}</a> [#{lang}]</li>!
+end
+url = url_base + "?lang=zh_CN;lang=ko_KR"
+puts %Q!<li> <a href="#{url}">#{CGI.escapeHTML(url)}</a> [Plural locales]</li>!
+
+puts "</ol>"
+puts %Q[<h2>Set "lang" as the cookie value.</h2>
+<p>Click one of the link below, and then click "Auto-Detect the locale from the WWW browser".</p>
+<ol>]
+
+sample_locales.each do |lang|
+ url = url_base + "cookie.cgi?lang=" + lang
+ puts %Q!<li><a href="#{url}">#{CGI.escapeHTML(url)}</a> [#{lang}]</li>!
+end
+puts %Q!<li><a href="cookie.cgi">Clear the cookie value</a></li>!
+
+puts "</ol>"
+puts "<h2>Source codes</h2>"
+puts "<ol>"
+
+Dir.glob("*cgi\0*rb)").sort.each do |src|
+ unless /http.rb|makemo.rb/ =~ src
+ puts %Q[<li><a href="/src/?#{src}">#{src}</a></li>]
+ end
+end
+puts %Q[</ol>
+<hr/>
+ <div class="copyright">
+ <p>Copyright (C) 2008 Masao Mutoh</p>
+ </div>
+</body>
+</html>
+]
+
diff --git a/vendor/gems/locale-2.0.5/samples/cgi/locale.css b/vendor/gems/locale-2.0.5/samples/cgi/locale.css
new file mode 100644
index 000000000..6a7f9d8da
--- /dev/null
+++ b/vendor/gems/locale-2.0.5/samples/cgi/locale.css
@@ -0,0 +1,115 @@
+/*
+ CSS for Ruby/Locale
+ by Masao Mutoh.
+*/
+
+body {
+ margin: 0px;
+ padding: 0px;
+ color: #000;
+ background-color: #fff;
+ font-size: 90%;
+ font-family: Times, Sans-Serif;
+ line-height: 1.5em;
+}
+
+h1 {
+ color: #002288;
+ text-align: left;
+ clear: both;
+ padding:0.4em;
+ font-weight: bold;
+ font-size: 1.8em;
+ padding-left:0.5em;
+ padding-right:10px;
+ margin-top: 10px;
+ margin-left: 20px;
+ margin-bottom:1em;
+ margin-right:5px;
+ border: solid thin;
+ border-left: solid;
+ border-color: #9999ff;
+ border-top-width: 0px;
+ border-right-width: 0px;
+ border-bottom-width: 1px;
+ border-left-width: 15px;
+}
+h2 {
+ margin: 0px;
+ font-size: large;
+ font-weight: bold;
+ font-size: 1.4em;
+ padding: 0.3em;
+ padding-left:0.5em;
+ padding-right:10px;
+ margin-top: 1em;
+ margin-left: 1.5em;
+ margin-right: 10px;
+ margin-bottom:0.8em;
+ border: solid thin;
+ border-left: solid;
+ border-color: #9999ff;
+ border-top-width: 0px;
+ border-right-width: 0px;
+ border-bottom-width: 1px;
+ border-left-width: 15px;
+
+}
+
+h3 {
+ margin:1em;
+ margin-bottom: 0.5em;
+ margin-top: 1.5em;
+ margin-left: 2em;
+ margin-right: 24px;
+ padding: 0.1em;
+ padding-top: 0;
+ padding-left: 0.7em;
+ font-size: 1.2em;
+ border-style: dashed;
+ border-width: 0px 0px 1px 1px;
+ border-color: #ddddff;
+}
+
+p {
+ padding-left: 1em;
+ padding-right: 1em;
+ margin-top: 0px;
+ margin-left: 1.5em;
+ margin-right: 1em;
+ margin-bottom: 0.5em;
+}
+
+ol, ul {
+ margin-top: 0.2em;
+ margin-left: 3em;
+ padding-left: 1.5em;
+}
+
+li {
+ margin-top: 0.2em;
+ margin-left: 0em;
+ padding-left: 0em;
+ line-height: 1.2em;
+}
+
+#result {
+ color: red;
+ font-weight: bold;
+ padding-left: 3em;
+ padding-right: 3em;
+}
+
+pre {
+ margin: 2em;
+ padding: 1em;
+ border-style: solid;
+ border-width: 1px 1px 1px 1px;
+ border-color: #ddddff;
+ background-color: #eeffee;
+}
+
+.copyright {
+ text-align: right;
+ padding: 2em;
+}
diff --git a/vendor/gems/locale-2.0.5/samples/rack/README b/vendor/gems/locale-2.0.5/samples/rack/README
new file mode 100644
index 000000000..9da49eeb4
--- /dev/null
+++ b/vendor/gems/locale-2.0.5/samples/rack/README
@@ -0,0 +1,10 @@
+= Install Rack:
+$ sudo gem install rack
+
+= Run rack server:
+$rackup hello_rack.ru
+
+= Access from WWW browser:
+http://localhost:9292/
+http://localhost:9292/?lang=ja
+
diff --git a/vendor/gems/locale-2.0.5/samples/rack/hello_rack.rb b/vendor/gems/locale-2.0.5/samples/rack/hello_rack.rb
new file mode 100644
index 000000000..d6cb16013
--- /dev/null
+++ b/vendor/gems/locale-2.0.5/samples/rack/hello_rack.rb
@@ -0,0 +1,17 @@
+require 'rubygems'
+require 'rack'
+require 'locale'
+
+Locale.init(:driver => :cgi)
+
+class HelloRackApp
+ def call(env)
+ req = Rack::Request.new(env)
+ Locale.set_request(req["lang"], req.cookies["lang"],
+ env["HTTP_ACCEPT_LANGUAGE"], env["HTTP_ACCEPT_CHARSET"])
+ str = "Language tag candidates of your request order by the priority:\n\n"
+ str += Locale.candidates(:type => :rfc).map{|v| v.inspect + "\n"}.join
+ [200, {"Content-Type" => "text/plain", "Content-Length" => str.length.to_s}, [str]]
+ end
+end
+
diff --git a/vendor/gems/locale-2.0.5/samples/rack/hello_rack.ru b/vendor/gems/locale-2.0.5/samples/rack/hello_rack.ru
new file mode 100644
index 000000000..a97748d05
--- /dev/null
+++ b/vendor/gems/locale-2.0.5/samples/rack/hello_rack.ru
@@ -0,0 +1,5 @@
+$LOAD_PATH.unshift "../../lib"
+
+require 'hello_rack'
+run HelloRackApp.new
+
diff --git a/vendor/gems/locale-2.0.5/samples/sample_1.rb b/vendor/gems/locale-2.0.5/samples/sample_1.rb
new file mode 100644
index 000000000..2be192fe4
--- /dev/null
+++ b/vendor/gems/locale-2.0.5/samples/sample_1.rb
@@ -0,0 +1,25 @@
+require 'rubygems'
+require 'locale'
+
+puts "Get the current locale."
+
+p Locale.current #=> Returns a language in a TagList.
+p Locale.charset
+p Locale.current.language
+p Locale.current[0].language #=> same result.
+
+ENV["LANGUAGE"] = "ja_JP.eucJP:fr_FR"
+puts "Set LANGUAGE." + ENV["LANGUAGE"]
+
+# Clear locale because the values are cached.
+Locale.clear
+
+p Locale.current #=> Return 2 languages in a TagList.
+p Locale.current[0].language
+p Locale.current[1].language
+p Locale.current.language #=> Same with Locale.current[0].language.
+p Locale.charset
+
+p "Locale.candidates"
+p Locale.current
+p Locale.candidates
diff --git a/vendor/gems/locale-2.0.5/samples/sample_info.rb b/vendor/gems/locale-2.0.5/samples/sample_info.rb
new file mode 100644
index 000000000..79681c58a
--- /dev/null
+++ b/vendor/gems/locale-2.0.5/samples/sample_info.rb
@@ -0,0 +1,6 @@
+require 'rubygems'
+require 'locale/info'
+
+p Locale::Info.get_language("ja")
+p Locale::Info.get_region("JP")
+
diff --git a/vendor/gems/locale-2.0.5/setup.rb b/vendor/gems/locale-2.0.5/setup.rb
new file mode 100644
index 000000000..424a5f37c
--- /dev/null
+++ b/vendor/gems/locale-2.0.5/setup.rb
@@ -0,0 +1,1585 @@
+#
+# setup.rb
+#
+# Copyright (c) 2000-2005 Minero Aoki
+#
+# This program is free software.
+# You can distribute/modify this program under the terms of
+# the GNU LGPL, Lesser General Public License version 2.1.
+#
+
+unless Enumerable.method_defined?(:map) # Ruby 1.4.6
+ module Enumerable
+ alias map collect
+ end
+end
+
+unless File.respond_to?(:read) # Ruby 1.6
+ def File.read(fname)
+ open(fname) {|f|
+ return f.read
+ }
+ end
+end
+
+unless Errno.const_defined?(:ENOTEMPTY) # Windows?
+ module Errno
+ class ENOTEMPTY
+ # We do not raise this exception, implementation is not needed.
+ end
+ end
+end
+
+def File.binread(fname)
+ open(fname, 'rb') {|f|
+ return f.read
+ }
+end
+
+# for corrupted Windows' stat(2)
+def File.dir?(path)
+ File.directory?((path[-1,1] == '/') ? path : path + '/')
+end
+
+
+class ConfigTable
+
+ include Enumerable
+
+ def initialize(rbconfig)
+ @rbconfig = rbconfig
+ @items = []
+ @table = {}
+ # options
+ @install_prefix = nil
+ @config_opt = nil
+ @verbose = true
+ @no_harm = false
+ end
+
+ attr_accessor :install_prefix
+ attr_accessor :config_opt
+
+ attr_writer :verbose
+
+ def verbose?
+ @verbose
+ end
+
+ attr_writer :no_harm
+
+ def no_harm?
+ @no_harm
+ end
+
+ def [](key)
+ lookup(key).resolve(self)
+ end
+
+ def []=(key, val)
+ lookup(key).set val
+ end
+
+ def names
+ @items.map {|i| i.name }
+ end
+
+ def each(&block)
+ @items.each(&block)
+ end
+
+ def key?(name)
+ @table.key?(name)
+ end
+
+ def lookup(name)
+ @table[name] or setup_rb_error "no such config item: #{name}"
+ end
+
+ def add(item)
+ @items.push item
+ @table[item.name] = item
+ end
+
+ def remove(name)
+ item = lookup(name)
+ @items.delete_if {|i| i.name == name }
+ @table.delete_if {|name, i| i.name == name }
+ item
+ end
+
+ def load_script(path, inst = nil)
+ if File.file?(path)
+ MetaConfigEnvironment.new(self, inst).instance_eval File.read(path), path
+ end
+ end
+
+ def savefile
+ '.config'
+ end
+
+ def load_savefile
+ begin
+ File.foreach(savefile()) do |line|
+ k, v = *line.split(/=/, 2)
+ self[k] = v.strip
+ end
+ rescue Errno::ENOENT
+ setup_rb_error $!.message + "\n#{File.basename($0)} config first"
+ end
+ end
+
+ def save
+ @items.each {|i| i.value }
+ File.open(savefile(), 'w') {|f|
+ @items.each do |i|
+ f.printf "%s=%s\n", i.name, i.value if i.value? and i.value
+ end
+ }
+ end
+
+ def load_standard_entries
+ standard_entries(@rbconfig).each do |ent|
+ add ent
+ end
+ end
+
+ def standard_entries(rbconfig)
+ c = rbconfig
+
+ rubypath = File.join(c['bindir'], c['ruby_install_name'] + c['EXEEXT'])
+
+ major = c['MAJOR'].to_i
+ minor = c['MINOR'].to_i
+ teeny = c['TEENY'].to_i
+ version = "#{major}.#{minor}"
+
+ # ruby ver. >= 1.4.4?
+ newpath_p = ((major >= 2) or
+ ((major == 1) and
+ ((minor >= 5) or
+ ((minor == 4) and (teeny >= 4)))))
+
+ if c['rubylibdir']
+ # V > 1.6.3
+ libruby = "#{c['prefix']}/lib/ruby"
+ librubyver = c['rubylibdir']
+ librubyverarch = c['archdir']
+ siteruby = c['sitedir']
+ siterubyver = c['sitelibdir']
+ siterubyverarch = c['sitearchdir']
+ elsif newpath_p
+ # 1.4.4 <= V <= 1.6.3
+ libruby = "#{c['prefix']}/lib/ruby"
+ librubyver = "#{c['prefix']}/lib/ruby/#{version}"
+ librubyverarch = "#{c['prefix']}/lib/ruby/#{version}/#{c['arch']}"
+ siteruby = c['sitedir']
+ siterubyver = "$siteruby/#{version}"
+ siterubyverarch = "$siterubyver/#{c['arch']}"
+ else
+ # V < 1.4.4
+ libruby = "#{c['prefix']}/lib/ruby"
+ librubyver = "#{c['prefix']}/lib/ruby/#{version}"
+ librubyverarch = "#{c['prefix']}/lib/ruby/#{version}/#{c['arch']}"
+ siteruby = "#{c['prefix']}/lib/ruby/#{version}/site_ruby"
+ siterubyver = siteruby
+ siterubyverarch = "$siterubyver/#{c['arch']}"
+ end
+ parameterize = lambda {|path|
+ path.sub(/\A#{Regexp.quote(c['prefix'])}/, '$prefix')
+ }
+
+ if arg = c['configure_args'].split.detect {|arg| /--with-make-prog=/ =~ arg }
+ makeprog = arg.sub(/'/, '').split(/=/, 2)[1]
+ else
+ makeprog = 'make'
+ end
+
+ [
+ ExecItem.new('installdirs', 'std/site/home',
+ 'std: install under libruby; site: install under site_ruby; home: install under $HOME')\
+ {|val, table|
+ case val
+ when 'std'
+ table['rbdir'] = '$librubyver'
+ table['sodir'] = '$librubyverarch'
+ when 'site'
+ table['rbdir'] = '$siterubyver'
+ table['sodir'] = '$siterubyverarch'
+ when 'home'
+ setup_rb_error '$HOME was not set' unless ENV['HOME']
+ table['prefix'] = ENV['HOME']
+ table['rbdir'] = '$libdir/ruby'
+ table['sodir'] = '$libdir/ruby'
+ end
+ },
+ PathItem.new('prefix', 'path', c['prefix'],
+ 'path prefix of target environment'),
+ PathItem.new('bindir', 'path', parameterize.call(c['bindir']),
+ 'the directory for commands'),
+ PathItem.new('libdir', 'path', parameterize.call(c['libdir']),
+ 'the directory for libraries'),
+ PathItem.new('datadir', 'path', parameterize.call(c['datadir']),
+ 'the directory for shared data'),
+ PathItem.new('mandir', 'path', parameterize.call(c['mandir']),
+ 'the directory for man pages'),
+ PathItem.new('sysconfdir', 'path', parameterize.call(c['sysconfdir']),
+ 'the directory for system configuration files'),
+ PathItem.new('localstatedir', 'path', parameterize.call(c['localstatedir']),
+ 'the directory for local state data'),
+ PathItem.new('libruby', 'path', libruby,
+ 'the directory for ruby libraries'),
+ PathItem.new('librubyver', 'path', librubyver,
+ 'the directory for standard ruby libraries'),
+ PathItem.new('librubyverarch', 'path', librubyverarch,
+ 'the directory for standard ruby extensions'),
+ PathItem.new('siteruby', 'path', siteruby,
+ 'the directory for version-independent aux ruby libraries'),
+ PathItem.new('siterubyver', 'path', siterubyver,
+ 'the directory for aux ruby libraries'),
+ PathItem.new('siterubyverarch', 'path', siterubyverarch,
+ 'the directory for aux ruby binaries'),
+ PathItem.new('rbdir', 'path', '$siterubyver',
+ 'the directory for ruby scripts'),
+ PathItem.new('sodir', 'path', '$siterubyverarch',
+ 'the directory for ruby extentions'),
+ PathItem.new('rubypath', 'path', rubypath,
+ 'the path to set to #! line'),
+ ProgramItem.new('rubyprog', 'name', rubypath,
+ 'the ruby program using for installation'),
+ ProgramItem.new('makeprog', 'name', makeprog,
+ 'the make program to compile ruby extentions'),
+ SelectItem.new('shebang', 'all/ruby/never', 'ruby',
+ 'shebang line (#!) editing mode'),
+ BoolItem.new('without-ext', 'yes/no', 'no',
+ 'does not compile/install ruby extentions')
+ ]
+ end
+ private :standard_entries
+
+ def load_multipackage_entries
+ multipackage_entries().each do |ent|
+ add ent
+ end
+ end
+
+ def multipackage_entries
+ [
+ PackageSelectionItem.new('with', 'name,name...', '', 'ALL',
+ 'package names that you want to install'),
+ PackageSelectionItem.new('without', 'name,name...', '', 'NONE',
+ 'package names that you do not want to install')
+ ]
+ end
+ private :multipackage_entries
+
+ ALIASES = {
+ 'std-ruby' => 'librubyver',
+ 'stdruby' => 'librubyver',
+ 'rubylibdir' => 'librubyver',
+ 'archdir' => 'librubyverarch',
+ 'site-ruby-common' => 'siteruby', # For backward compatibility
+ 'site-ruby' => 'siterubyver', # For backward compatibility
+ 'bin-dir' => 'bindir',
+ 'bin-dir' => 'bindir',
+ 'rb-dir' => 'rbdir',
+ 'so-dir' => 'sodir',
+ 'data-dir' => 'datadir',
+ 'ruby-path' => 'rubypath',
+ 'ruby-prog' => 'rubyprog',
+ 'ruby' => 'rubyprog',
+ 'make-prog' => 'makeprog',
+ 'make' => 'makeprog'
+ }
+
+ def fixup
+ ALIASES.each do |ali, name|
+ @table[ali] = @table[name]
+ end
+ @items.freeze
+ @table.freeze
+ @options_re = /\A--(#{@table.keys.join('|')})(?:=(.*))?\z/
+ end
+
+ def parse_opt(opt)
+ m = @options_re.match(opt) or setup_rb_error "config: unknown option #{opt}"
+ m.to_a[1,2]
+ end
+
+ def dllext
+ @rbconfig['DLEXT']
+ end
+
+ def value_config?(name)
+ lookup(name).value?
+ end
+
+ class Item
+ def initialize(name, template, default, desc)
+ @name = name.freeze
+ @template = template
+ @value = default
+ @default = default
+ @description = desc
+ end
+
+ attr_reader :name
+ attr_reader :description
+
+ attr_accessor :default
+ alias help_default default
+
+ def help_opt
+ "--#{@name}=#{@template}"
+ end
+
+ def value?
+ true
+ end
+
+ def value
+ @value
+ end
+
+ def resolve(table)
+ @value.gsub(%r<\$([^/]+)>) { table[$1] }
+ end
+
+ def set(val)
+ @value = check(val)
+ end
+
+ private
+
+ def check(val)
+ setup_rb_error "config: --#{name} requires argument" unless val
+ val
+ end
+ end
+
+ class BoolItem < Item
+ def config_type
+ 'bool'
+ end
+
+ def help_opt
+ "--#{@name}"
+ end
+
+ private
+
+ def check(val)
+ return 'yes' unless val
+ case val
+ when /\Ay(es)?\z/i, /\At(rue)?\z/i then 'yes'
+ when /\An(o)?\z/i, /\Af(alse)\z/i then 'no'
+ else
+ setup_rb_error "config: --#{@name} accepts only yes/no for argument"
+ end
+ end
+ end
+
+ class PathItem < Item
+ def config_type
+ 'path'
+ end
+
+ private
+
+ def check(path)
+ setup_rb_error "config: --#{@name} requires argument" unless path
+ path[0,1] == '$' ? path : File.expand_path(path)
+ end
+ end
+
+ class ProgramItem < Item
+ def config_type
+ 'program'
+ end
+ end
+
+ class SelectItem < Item
+ def initialize(name, selection, default, desc)
+ super
+ @ok = selection.split('/')
+ end
+
+ def config_type
+ 'select'
+ end
+
+ private
+
+ def check(val)
+ unless @ok.include?(val.strip)
+ setup_rb_error "config: use --#{@name}=#{@template} (#{val})"
+ end
+ val.strip
+ end
+ end
+
+ class ExecItem < Item
+ def initialize(name, selection, desc, &block)
+ super name, selection, nil, desc
+ @ok = selection.split('/')
+ @action = block
+ end
+
+ def config_type
+ 'exec'
+ end
+
+ def value?
+ false
+ end
+
+ def resolve(table)
+ setup_rb_error "$#{name()} wrongly used as option value"
+ end
+
+ undef set
+
+ def evaluate(val, table)
+ v = val.strip.downcase
+ unless @ok.include?(v)
+ setup_rb_error "invalid option --#{@name}=#{val} (use #{@template})"
+ end
+ @action.call v, table
+ end
+ end
+
+ class PackageSelectionItem < Item
+ def initialize(name, template, default, help_default, desc)
+ super name, template, default, desc
+ @help_default = help_default
+ end
+
+ attr_reader :help_default
+
+ def config_type
+ 'package'
+ end
+
+ private
+
+ def check(val)
+ unless File.dir?("packages/#{val}")
+ setup_rb_error "config: no such package: #{val}"
+ end
+ val
+ end
+ end
+
+ class MetaConfigEnvironment
+ def initialize(config, installer)
+ @config = config
+ @installer = installer
+ end
+
+ def config_names
+ @config.names
+ end
+
+ def config?(name)
+ @config.key?(name)
+ end
+
+ def bool_config?(name)
+ @config.lookup(name).config_type == 'bool'
+ end
+
+ def path_config?(name)
+ @config.lookup(name).config_type == 'path'
+ end
+
+ def value_config?(name)
+ @config.lookup(name).config_type != 'exec'
+ end
+
+ def add_config(item)
+ @config.add item
+ end
+
+ def add_bool_config(name, default, desc)
+ @config.add BoolItem.new(name, 'yes/no', default ? 'yes' : 'no', desc)
+ end
+
+ def add_path_config(name, default, desc)
+ @config.add PathItem.new(name, 'path', default, desc)
+ end
+
+ def set_config_default(name, default)
+ @config.lookup(name).default = default
+ end
+
+ def remove_config(name)
+ @config.remove(name)
+ end
+
+ # For only multipackage
+ def packages
+ raise '[setup.rb fatal] multi-package metaconfig API packages() called for single-package; contact application package vendor' unless @installer
+ @installer.packages
+ end
+
+ # For only multipackage
+ def declare_packages(list)
+ raise '[setup.rb fatal] multi-package metaconfig API declare_packages() called for single-package; contact application package vendor' unless @installer
+ @installer.packages = list
+ end
+ end
+
+end # class ConfigTable
+
+
+# This module requires: #verbose?, #no_harm?
+module FileOperations
+
+ def mkdir_p(dirname, prefix = nil)
+ dirname = prefix + File.expand_path(dirname) if prefix
+ $stderr.puts "mkdir -p #{dirname}" if verbose?
+ return if no_harm?
+
+ # Does not check '/', it's too abnormal.
+ dirs = File.expand_path(dirname).split(%r<(?=/)>)
+ if /\A[a-z]:\z/i =~ dirs[0]
+ disk = dirs.shift
+ dirs[0] = disk + dirs[0]
+ end
+ dirs.each_index do |idx|
+ path = dirs[0..idx].join('')
+ Dir.mkdir path unless File.dir?(path)
+ end
+ end
+
+ def rm_f(path)
+ $stderr.puts "rm -f #{path}" if verbose?
+ return if no_harm?
+ force_remove_file path
+ end
+
+ def rm_rf(path)
+ $stderr.puts "rm -rf #{path}" if verbose?
+ return if no_harm?
+ remove_tree path
+ end
+
+ def remove_tree(path)
+ if File.symlink?(path)
+ remove_file path
+ elsif File.dir?(path)
+ remove_tree0 path
+ else
+ force_remove_file path
+ end
+ end
+
+ def remove_tree0(path)
+ Dir.foreach(path) do |ent|
+ next if ent == '.'
+ next if ent == '..'
+ entpath = "#{path}/#{ent}"
+ if File.symlink?(entpath)
+ remove_file entpath
+ elsif File.dir?(entpath)
+ remove_tree0 entpath
+ else
+ force_remove_file entpath
+ end
+ end
+ begin
+ Dir.rmdir path
+ rescue Errno::ENOTEMPTY
+ # directory may not be empty
+ end
+ end
+
+ def move_file(src, dest)
+ force_remove_file dest
+ begin
+ File.rename src, dest
+ rescue
+ File.open(dest, 'wb') {|f|
+ f.write File.binread(src)
+ }
+ File.chmod File.stat(src).mode, dest
+ File.unlink src
+ end
+ end
+
+ def force_remove_file(path)
+ begin
+ remove_file path
+ rescue
+ end
+ end
+
+ def remove_file(path)
+ File.chmod 0777, path
+ File.unlink path
+ end
+
+ def install(from, dest, mode, prefix = nil)
+ $stderr.puts "install #{from} #{dest}" if verbose?
+ return if no_harm?
+
+ realdest = prefix ? prefix + File.expand_path(dest) : dest
+ realdest = File.join(realdest, File.basename(from)) if File.dir?(realdest)
+ str = File.binread(from)
+ if diff?(str, realdest)
+ verbose_off {
+ rm_f realdest if File.exist?(realdest)
+ }
+ File.open(realdest, 'wb') {|f|
+ f.write str
+ }
+ File.chmod mode, realdest
+
+ File.open("#{objdir_root()}/InstalledFiles", 'a') {|f|
+ if prefix
+ f.puts realdest.sub(prefix, '')
+ else
+ f.puts realdest
+ end
+ }
+ end
+ end
+
+ def diff?(new_content, path)
+ return true unless File.exist?(path)
+ new_content != File.binread(path)
+ end
+
+ def command(*args)
+ $stderr.puts args.join(' ') if verbose?
+ system(*args) or raise RuntimeError,
+ "system(#{args.map{|a| a.inspect }.join(' ')}) failed"
+ end
+
+ def ruby(*args)
+ command config('rubyprog'), *args
+ end
+
+ def make(task = nil)
+ command(*[config('makeprog'), task].compact)
+ end
+
+ def extdir?(dir)
+ File.exist?("#{dir}/MANIFEST") or File.exist?("#{dir}/extconf.rb")
+ end
+
+ def files_of(dir)
+ Dir.open(dir) {|d|
+ return d.select {|ent| File.file?("#{dir}/#{ent}") }
+ }
+ end
+
+ DIR_REJECT = %w( . .. CVS SCCS RCS CVS.adm .svn )
+
+ def directories_of(dir)
+ Dir.open(dir) {|d|
+ return d.select {|ent| File.dir?("#{dir}/#{ent}") } - DIR_REJECT
+ }
+ end
+
+end
+
+
+# This module requires: #srcdir_root, #objdir_root, #relpath
+module HookScriptAPI
+
+ def get_config(key)
+ @config[key]
+ end
+
+ alias config get_config
+
+ # obsolete: use metaconfig to change configuration
+ def set_config(key, val)
+ @config[key] = val
+ end
+
+ #
+ # srcdir/objdir (works only in the package directory)
+ #
+
+ def curr_srcdir
+ "#{srcdir_root()}/#{relpath()}"
+ end
+
+ def curr_objdir
+ "#{objdir_root()}/#{relpath()}"
+ end
+
+ def srcfile(path)
+ "#{curr_srcdir()}/#{path}"
+ end
+
+ def srcexist?(path)
+ File.exist?(srcfile(path))
+ end
+
+ def srcdirectory?(path)
+ File.dir?(srcfile(path))
+ end
+
+ def srcfile?(path)
+ File.file?(srcfile(path))
+ end
+
+ def srcentries(path = '.')
+ Dir.open("#{curr_srcdir()}/#{path}") {|d|
+ return d.to_a - %w(. ..)
+ }
+ end
+
+ def srcfiles(path = '.')
+ srcentries(path).select {|fname|
+ File.file?(File.join(curr_srcdir(), path, fname))
+ }
+ end
+
+ def srcdirectories(path = '.')
+ srcentries(path).select {|fname|
+ File.dir?(File.join(curr_srcdir(), path, fname))
+ }
+ end
+
+end
+
+
+class ToplevelInstaller
+
+ Version = '3.4.1'
+ Copyright = 'Copyright (c) 2000-2005 Minero Aoki'
+
+ TASKS = [
+ [ 'all', 'do config, setup, then install' ],
+ [ 'config', 'saves your configurations' ],
+ [ 'show', 'shows current configuration' ],
+ [ 'setup', 'compiles ruby extentions and others' ],
+ [ 'install', 'installs files' ],
+ [ 'test', 'run all tests in test/' ],
+ [ 'clean', "does `make clean' for each extention" ],
+ [ 'distclean',"does `make distclean' for each extention" ]
+ ]
+
+ def ToplevelInstaller.invoke
+ config = ConfigTable.new(load_rbconfig())
+ config.load_standard_entries
+ config.load_multipackage_entries if multipackage?
+ config.fixup
+ klass = (multipackage?() ? ToplevelInstallerMulti : ToplevelInstaller)
+ klass.new(File.dirname($0), config).invoke
+ end
+
+ def ToplevelInstaller.multipackage?
+ File.dir?(File.dirname($0) + '/packages')
+ end
+
+ def ToplevelInstaller.load_rbconfig
+ if arg = ARGV.detect {|arg| /\A--rbconfig=/ =~ arg }
+ ARGV.delete(arg)
+ load File.expand_path(arg.split(/=/, 2)[1])
+ $".push 'rbconfig.rb'
+ else
+ require 'rbconfig'
+ end
+ ::Config::CONFIG
+ end
+
+ def initialize(ardir_root, config)
+ @ardir = File.expand_path(ardir_root)
+ @config = config
+ # cache
+ @valid_task_re = nil
+ end
+
+ def config(key)
+ @config[key]
+ end
+
+ def inspect
+ "#<#{self.class} #{__id__()}>"
+ end
+
+ def invoke
+ run_metaconfigs
+ case task = parsearg_global()
+ when nil, 'all'
+ parsearg_config
+ init_installers
+ exec_config
+ exec_setup
+ exec_install
+ else
+ case task
+ when 'config', 'test'
+ ;
+ when 'clean', 'distclean'
+ @config.load_savefile if File.exist?(@config.savefile)
+ else
+ @config.load_savefile
+ end
+ __send__ "parsearg_#{task}"
+ init_installers
+ __send__ "exec_#{task}"
+ end
+ end
+
+ def run_metaconfigs
+ @config.load_script "#{@ardir}/metaconfig"
+ end
+
+ def init_installers
+ @installer = Installer.new(@config, @ardir, File.expand_path('.'))
+ end
+
+ #
+ # Hook Script API bases
+ #
+
+ def srcdir_root
+ @ardir
+ end
+
+ def objdir_root
+ '.'
+ end
+
+ def relpath
+ '.'
+ end
+
+ #
+ # Option Parsing
+ #
+
+ def parsearg_global
+ while arg = ARGV.shift
+ case arg
+ when /\A\w+\z/
+ setup_rb_error "invalid task: #{arg}" unless valid_task?(arg)
+ return arg
+ when '-q', '--quiet'
+ @config.verbose = false
+ when '--verbose'
+ @config.verbose = true
+ when '--help'
+ print_usage $stdout
+ exit 0
+ when '--version'
+ puts "#{File.basename($0)} version #{Version}"
+ exit 0
+ when '--copyright'
+ puts Copyright
+ exit 0
+ else
+ setup_rb_error "unknown global option '#{arg}'"
+ end
+ end
+ nil
+ end
+
+ def valid_task?(t)
+ valid_task_re() =~ t
+ end
+
+ def valid_task_re
+ @valid_task_re ||= /\A(?:#{TASKS.map {|task,desc| task }.join('|')})\z/
+ end
+
+ def parsearg_no_options
+ unless ARGV.empty?
+ task = caller(0).first.slice(%r<`parsearg_(\w+)'>, 1)
+ setup_rb_error "#{task}: unknown options: #{ARGV.join(' ')}"
+ end
+ end
+
+ alias parsearg_show parsearg_no_options
+ alias parsearg_setup parsearg_no_options
+ alias parsearg_test parsearg_no_options
+ alias parsearg_clean parsearg_no_options
+ alias parsearg_distclean parsearg_no_options
+
+ def parsearg_config
+ evalopt = []
+ set = []
+ @config.config_opt = []
+ while i = ARGV.shift
+ if /\A--?\z/ =~ i
+ @config.config_opt = ARGV.dup
+ break
+ end
+ name, value = *@config.parse_opt(i)
+ if @config.value_config?(name)
+ @config[name] = value
+ else
+ evalopt.push [name, value]
+ end
+ set.push name
+ end
+ evalopt.each do |name, value|
+ @config.lookup(name).evaluate value, @config
+ end
+ # Check if configuration is valid
+ set.each do |n|
+ @config[n] if @config.value_config?(n)
+ end
+ end
+
+ def parsearg_install
+ @config.no_harm = false
+ @config.install_prefix = ''
+ while a = ARGV.shift
+ case a
+ when '--no-harm'
+ @config.no_harm = true
+ when /\A--prefix=/
+ path = a.split(/=/, 2)[1]
+ path = File.expand_path(path) unless path[0,1] == '/'
+ @config.install_prefix = path
+ else
+ setup_rb_error "install: unknown option #{a}"
+ end
+ end
+ end
+
+ def print_usage(out)
+ out.puts 'Typical Installation Procedure:'
+ out.puts " $ ruby #{File.basename $0} config"
+ out.puts " $ ruby #{File.basename $0} setup"
+ out.puts " # ruby #{File.basename $0} install (may require root privilege)"
+ out.puts
+ out.puts 'Detailed Usage:'
+ out.puts " ruby #{File.basename $0} <global option>"
+ out.puts " ruby #{File.basename $0} [<global options>] <task> [<task options>]"
+
+ fmt = " %-24s %s\n"
+ out.puts
+ out.puts 'Global options:'
+ out.printf fmt, '-q,--quiet', 'suppress message outputs'
+ out.printf fmt, ' --verbose', 'output messages verbosely'
+ out.printf fmt, ' --help', 'print this message'
+ out.printf fmt, ' --version', 'print version and quit'
+ out.printf fmt, ' --copyright', 'print copyright and quit'
+ out.puts
+ out.puts 'Tasks:'
+ TASKS.each do |name, desc|
+ out.printf fmt, name, desc
+ end
+
+ fmt = " %-24s %s [%s]\n"
+ out.puts
+ out.puts 'Options for CONFIG or ALL:'
+ @config.each do |item|
+ out.printf fmt, item.help_opt, item.description, item.help_default
+ end
+ out.printf fmt, '--rbconfig=path', 'rbconfig.rb to load',"running ruby's"
+ out.puts
+ out.puts 'Options for INSTALL:'
+ out.printf fmt, '--no-harm', 'only display what to do if given', 'off'
+ out.printf fmt, '--prefix=path', 'install path prefix', ''
+ out.puts
+ end
+
+ #
+ # Task Handlers
+ #
+
+ def exec_config
+ @installer.exec_config
+ @config.save # must be final
+ end
+
+ def exec_setup
+ @installer.exec_setup
+ end
+
+ def exec_install
+ @installer.exec_install
+ end
+
+ def exec_test
+ @installer.exec_test
+ end
+
+ def exec_show
+ @config.each do |i|
+ printf "%-20s %s\n", i.name, i.value if i.value?
+ end
+ end
+
+ def exec_clean
+ @installer.exec_clean
+ end
+
+ def exec_distclean
+ @installer.exec_distclean
+ end
+
+end # class ToplevelInstaller
+
+
+class ToplevelInstallerMulti < ToplevelInstaller
+
+ include FileOperations
+
+ def initialize(ardir_root, config)
+ super
+ @packages = directories_of("#{@ardir}/packages")
+ raise 'no package exists' if @packages.empty?
+ @root_installer = Installer.new(@config, @ardir, File.expand_path('.'))
+ end
+
+ def run_metaconfigs
+ @config.load_script "#{@ardir}/metaconfig", self
+ @packages.each do |name|
+ @config.load_script "#{@ardir}/packages/#{name}/metaconfig"
+ end
+ end
+
+ attr_reader :packages
+
+ def packages=(list)
+ raise 'package list is empty' if list.empty?
+ list.each do |name|
+ raise "directory packages/#{name} does not exist"\
+ unless File.dir?("#{@ardir}/packages/#{name}")
+ end
+ @packages = list
+ end
+
+ def init_installers
+ @installers = {}
+ @packages.each do |pack|
+ @installers[pack] = Installer.new(@config,
+ "#{@ardir}/packages/#{pack}",
+ "packages/#{pack}")
+ end
+ with = extract_selection(config('with'))
+ without = extract_selection(config('without'))
+ @selected = @installers.keys.select {|name|
+ (with.empty? or with.include?(name)) \
+ and not without.include?(name)
+ }
+ end
+
+ def extract_selection(list)
+ a = list.split(/,/)
+ a.each do |name|
+ setup_rb_error "no such package: #{name}" unless @installers.key?(name)
+ end
+ a
+ end
+
+ def print_usage(f)
+ super
+ f.puts 'Inluded packages:'
+ f.puts ' ' + @packages.sort.join(' ')
+ f.puts
+ end
+
+ #
+ # Task Handlers
+ #
+
+ def exec_config
+ run_hook 'pre-config'
+ each_selected_installers {|inst| inst.exec_config }
+ run_hook 'post-config'
+ @config.save # must be final
+ end
+
+ def exec_setup
+ run_hook 'pre-setup'
+ each_selected_installers {|inst| inst.exec_setup }
+ run_hook 'post-setup'
+ end
+
+ def exec_install
+ run_hook 'pre-install'
+ each_selected_installers {|inst| inst.exec_install }
+ run_hook 'post-install'
+ end
+
+ def exec_test
+ run_hook 'pre-test'
+ each_selected_installers {|inst| inst.exec_test }
+ run_hook 'post-test'
+ end
+
+ def exec_clean
+ rm_f @config.savefile
+ run_hook 'pre-clean'
+ each_selected_installers {|inst| inst.exec_clean }
+ run_hook 'post-clean'
+ end
+
+ def exec_distclean
+ rm_f @config.savefile
+ run_hook 'pre-distclean'
+ each_selected_installers {|inst| inst.exec_distclean }
+ run_hook 'post-distclean'
+ end
+
+ #
+ # lib
+ #
+
+ def each_selected_installers
+ Dir.mkdir 'packages' unless File.dir?('packages')
+ @selected.each do |pack|
+ $stderr.puts "Processing the package `#{pack}' ..." if verbose?
+ Dir.mkdir "packages/#{pack}" unless File.dir?("packages/#{pack}")
+ Dir.chdir "packages/#{pack}"
+ yield @installers[pack]
+ Dir.chdir '../..'
+ end
+ end
+
+ def run_hook(id)
+ @root_installer.run_hook id
+ end
+
+ # module FileOperations requires this
+ def verbose?
+ @config.verbose?
+ end
+
+ # module FileOperations requires this
+ def no_harm?
+ @config.no_harm?
+ end
+
+end # class ToplevelInstallerMulti
+
+
+class Installer
+
+ FILETYPES = %w( bin lib ext data conf man )
+
+ include FileOperations
+ include HookScriptAPI
+
+ def initialize(config, srcroot, objroot)
+ @config = config
+ @srcdir = File.expand_path(srcroot)
+ @objdir = File.expand_path(objroot)
+ @currdir = '.'
+ end
+
+ def inspect
+ "#<#{self.class} #{File.basename(@srcdir)}>"
+ end
+
+ def noop(rel)
+ end
+
+ #
+ # Hook Script API base methods
+ #
+
+ def srcdir_root
+ @srcdir
+ end
+
+ def objdir_root
+ @objdir
+ end
+
+ def relpath
+ @currdir
+ end
+
+ #
+ # Config Access
+ #
+
+ # module FileOperations requires this
+ def verbose?
+ @config.verbose?
+ end
+
+ # module FileOperations requires this
+ def no_harm?
+ @config.no_harm?
+ end
+
+ def verbose_off
+ begin
+ save, @config.verbose = @config.verbose?, false
+ yield
+ ensure
+ @config.verbose = save
+ end
+ end
+
+ #
+ # TASK config
+ #
+
+ def exec_config
+ exec_task_traverse 'config'
+ end
+
+ alias config_dir_bin noop
+ alias config_dir_lib noop
+
+ def config_dir_ext(rel)
+ extconf if extdir?(curr_srcdir())
+ end
+
+ alias config_dir_data noop
+ alias config_dir_conf noop
+ alias config_dir_man noop
+
+ def extconf
+ ruby "#{curr_srcdir()}/extconf.rb", *@config.config_opt
+ end
+
+ #
+ # TASK setup
+ #
+
+ def exec_setup
+ exec_task_traverse 'setup'
+ end
+
+ def setup_dir_bin(rel)
+ files_of(curr_srcdir()).each do |fname|
+ update_shebang_line "#{curr_srcdir()}/#{fname}"
+ end
+ end
+
+ alias setup_dir_lib noop
+
+ def setup_dir_ext(rel)
+ make if extdir?(curr_srcdir())
+ end
+
+ alias setup_dir_data noop
+ alias setup_dir_conf noop
+ alias setup_dir_man noop
+
+ def update_shebang_line(path)
+ return if no_harm?
+ return if config('shebang') == 'never'
+ old = Shebang.load(path)
+ if old
+ $stderr.puts "warning: #{path}: Shebang line includes too many args. It is not portable and your program may not work." if old.args.size > 1
+ new = new_shebang(old)
+ return if new.to_s == old.to_s
+ else
+ return unless config('shebang') == 'all'
+ new = Shebang.new(config('rubypath'))
+ end
+ $stderr.puts "updating shebang: #{File.basename(path)}" if verbose?
+ open_atomic_writer(path) {|output|
+ File.open(path, 'rb') {|f|
+ f.gets if old # discard
+ output.puts new.to_s
+ output.print f.read
+ }
+ }
+ end
+
+ def new_shebang(old)
+ if /\Aruby/ =~ File.basename(old.cmd)
+ Shebang.new(config('rubypath'), old.args)
+ elsif File.basename(old.cmd) == 'env' and old.args.first == 'ruby'
+ Shebang.new(config('rubypath'), old.args[1..-1])
+ else
+ return old unless config('shebang') == 'all'
+ Shebang.new(config('rubypath'))
+ end
+ end
+
+ def open_atomic_writer(path, &block)
+ tmpfile = File.basename(path) + '.tmp'
+ begin
+ File.open(tmpfile, 'wb', &block)
+ File.rename tmpfile, File.basename(path)
+ ensure
+ File.unlink tmpfile if File.exist?(tmpfile)
+ end
+ end
+
+ class Shebang
+ def Shebang.load(path)
+ line = nil
+ File.open(path) {|f|
+ line = f.gets
+ }
+ return nil unless /\A#!/ =~ line
+ parse(line)
+ end
+
+ def Shebang.parse(line)
+ cmd, *args = *line.strip.sub(/\A\#!/, '').split(' ')
+ new(cmd, args)
+ end
+
+ def initialize(cmd, args = [])
+ @cmd = cmd
+ @args = args
+ end
+
+ attr_reader :cmd
+ attr_reader :args
+
+ def to_s
+ "#! #{@cmd}" + (@args.empty? ? '' : " #{@args.join(' ')}")
+ end
+ end
+
+ #
+ # TASK install
+ #
+
+ def exec_install
+ rm_f 'InstalledFiles'
+ exec_task_traverse 'install'
+ end
+
+ def install_dir_bin(rel)
+ install_files targetfiles(), "#{config('bindir')}/#{rel}", 0755
+ end
+
+ def install_dir_lib(rel)
+ install_files libfiles(), "#{config('rbdir')}/#{rel}", 0644
+ end
+
+ def install_dir_ext(rel)
+ return unless extdir?(curr_srcdir())
+ install_files rubyextentions('.'),
+ "#{config('sodir')}/#{File.dirname(rel)}",
+ 0555
+ end
+
+ def install_dir_data(rel)
+ install_files targetfiles(), "#{config('datadir')}/#{rel}", 0644
+ end
+
+ def install_dir_conf(rel)
+ # FIXME: should not remove current config files
+ # (rename previous file to .old/.org)
+ install_files targetfiles(), "#{config('sysconfdir')}/#{rel}", 0644
+ end
+
+ def install_dir_man(rel)
+ install_files targetfiles(), "#{config('mandir')}/#{rel}", 0644
+ end
+
+ def install_files(list, dest, mode)
+ mkdir_p dest, @config.install_prefix
+ list.each do |fname|
+ install fname, dest, mode, @config.install_prefix
+ end
+ end
+
+ def libfiles
+ glob_reject(%w(*.y *.output), targetfiles())
+ end
+
+ def rubyextentions(dir)
+ ents = glob_select("*.#{@config.dllext}", targetfiles())
+ if ents.empty?
+ setup_rb_error "no ruby extention exists: 'ruby #{$0} setup' first"
+ end
+ ents
+ end
+
+ def targetfiles
+ mapdir(existfiles() - hookfiles())
+ end
+
+ def mapdir(ents)
+ ents.map {|ent|
+ if File.exist?(ent)
+ then ent # objdir
+ else "#{curr_srcdir()}/#{ent}" # srcdir
+ end
+ }
+ end
+
+ # picked up many entries from cvs-1.11.1/src/ignore.c
+ JUNK_FILES = %w(
+ core RCSLOG tags TAGS .make.state
+ .nse_depinfo #* .#* cvslog.* ,* .del-* *.olb
+ *~ *.old *.bak *.BAK *.orig *.rej _$* *$
+
+ *.org *.in .*
+ )
+
+ def existfiles
+ glob_reject(JUNK_FILES, (files_of(curr_srcdir()) | files_of('.')))
+ end
+
+ def hookfiles
+ %w( pre-%s post-%s pre-%s.rb post-%s.rb ).map {|fmt|
+ %w( config setup install clean ).map {|t| sprintf(fmt, t) }
+ }.flatten
+ end
+
+ def glob_select(pat, ents)
+ re = globs2re([pat])
+ ents.select {|ent| re =~ ent }
+ end
+
+ def glob_reject(pats, ents)
+ re = globs2re(pats)
+ ents.reject {|ent| re =~ ent }
+ end
+
+ GLOB2REGEX = {
+ '.' => '\.',
+ '$' => '\$',
+ '#' => '\#',
+ '*' => '.*'
+ }
+
+ def globs2re(pats)
+ /\A(?:#{
+ pats.map {|pat| pat.gsub(/[\.\$\#\*]/) {|ch| GLOB2REGEX[ch] } }.join('|')
+ })\z/
+ end
+
+ #
+ # TASK test
+ #
+
+ TESTDIR = 'test'
+
+ def exec_test
+ unless File.directory?('test')
+ $stderr.puts 'no test in this package' if verbose?
+ return
+ end
+ $stderr.puts 'Running tests...' if verbose?
+ begin
+ require 'test/unit'
+ rescue LoadError
+ setup_rb_error 'test/unit cannot loaded. You need Ruby 1.8 or later to invoke this task.'
+ end
+ runner = Test::Unit::AutoRunner.new(true)
+ runner.to_run << TESTDIR
+ runner.run
+ end
+
+ #
+ # TASK clean
+ #
+
+ def exec_clean
+ exec_task_traverse 'clean'
+ rm_f @config.savefile
+ rm_f 'InstalledFiles'
+ end
+
+ alias clean_dir_bin noop
+ alias clean_dir_lib noop
+ alias clean_dir_data noop
+ alias clean_dir_conf noop
+ alias clean_dir_man noop
+
+ def clean_dir_ext(rel)
+ return unless extdir?(curr_srcdir())
+ make 'clean' if File.file?('Makefile')
+ end
+
+ #
+ # TASK distclean
+ #
+
+ def exec_distclean
+ exec_task_traverse 'distclean'
+ rm_f @config.savefile
+ rm_f 'InstalledFiles'
+ end
+
+ alias distclean_dir_bin noop
+ alias distclean_dir_lib noop
+
+ def distclean_dir_ext(rel)
+ return unless extdir?(curr_srcdir())
+ make 'distclean' if File.file?('Makefile')
+ end
+
+ alias distclean_dir_data noop
+ alias distclean_dir_conf noop
+ alias distclean_dir_man noop
+
+ #
+ # Traversing
+ #
+
+ def exec_task_traverse(task)
+ run_hook "pre-#{task}"
+ FILETYPES.each do |type|
+ if type == 'ext' and config('without-ext') == 'yes'
+ $stderr.puts 'skipping ext/* by user option' if verbose?
+ next
+ end
+ traverse task, type, "#{task}_dir_#{type}"
+ end
+ run_hook "post-#{task}"
+ end
+
+ def traverse(task, rel, mid)
+ dive_into(rel) {
+ run_hook "pre-#{task}"
+ __send__ mid, rel.sub(%r[\A.*?(?:/|\z)], '')
+ directories_of(curr_srcdir()).each do |d|
+ traverse task, "#{rel}/#{d}", mid
+ end
+ run_hook "post-#{task}"
+ }
+ end
+
+ def dive_into(rel)
+ return unless File.dir?("#{@srcdir}/#{rel}")
+
+ dir = File.basename(rel)
+ Dir.mkdir dir unless File.dir?(dir)
+ prevdir = Dir.pwd
+ Dir.chdir dir
+ $stderr.puts '---> ' + rel if verbose?
+ @currdir = rel
+ yield
+ Dir.chdir prevdir
+ $stderr.puts '<--- ' + rel if verbose?
+ @currdir = File.dirname(rel)
+ end
+
+ def run_hook(id)
+ path = [ "#{curr_srcdir()}/#{id}",
+ "#{curr_srcdir()}/#{id}.rb" ].detect {|cand| File.file?(cand) }
+ return unless path
+ begin
+ instance_eval File.read(path), path, 1
+ rescue
+ raise if $DEBUG
+ setup_rb_error "hook #{path} failed:\n" + $!.message
+ end
+ end
+
+end # class Installer
+
+
+class SetupError < StandardError; end
+
+def setup_rb_error(msg)
+ raise SetupError, msg
+end
+
+if $0 == __FILE__
+ begin
+ ToplevelInstaller.invoke
+ rescue SetupError
+ raise if $DEBUG
+ $stderr.puts $!.message
+ $stderr.puts "Try 'ruby #{$0} --help' for detailed usage."
+ exit 1
+ end
+end
diff --git a/vendor/gems/locale-2.0.5/test/test_detect_cgi.rb b/vendor/gems/locale-2.0.5/test/test_detect_cgi.rb
new file mode 100644
index 000000000..e2adbfc62
--- /dev/null
+++ b/vendor/gems/locale-2.0.5/test/test_detect_cgi.rb
@@ -0,0 +1,216 @@
+require 'cgi'
+require 'locale'
+require 'test/unit'
+
+class CGI
+ module QueryExtension
+ # Override this method to avoid to put warning messages.
+ module_function
+ def readlines=(str)
+ @@lines = [str]
+ end
+ def readlines
+ @@lines
+ end
+ def read_from_cmdline
+ require "shellwords"
+ string = readlines.join(' ').gsub(/\n/n, '').gsub(/\\=/n, '%3D').gsub(/\\&/n, '%26')
+
+ words = Shellwords.shellwords(string)
+
+ if words.find{|x| /=/n.match(x) }
+ words.join('&')
+ else
+ words.join('+')
+ end
+ end
+ private :read_from_cmdline
+ end
+end
+
+class TestDetectCGI < Test::Unit::TestCase
+ def setup_cgi(str)
+ CGI::QueryExtension.readlines = str
+ Locale.init(:driver => :cgi)
+ cgi = CGI.new
+ Locale.cgi = cgi
+ Locale.clear_all
+ end
+
+ def test_query_string
+ #query string
+ setup_cgi("lang=ja_JP")
+ lang = Locale.current[0]
+ assert_equal(Locale::Tag::Simple, lang.class)
+ assert_equal("ja_JP", lang.to_s)
+
+ setup_cgi("lang=ja-jp")
+ lang = Locale.current[0]
+ assert_equal(Locale::Tag::Simple, lang.class)
+ assert_equal("ja_JP", lang.to_s)
+ assert_equal("ja-JP", lang.to_rfc.to_s)
+ setup_cgi("lang=ja-jp")
+ assert_equal("ja_JP", lang.to_s)
+ assert_equal("ja-JP", lang.to_rfc.to_s)
+
+ end
+
+ def test_cookie
+ #cockie
+ setup_cgi("Set-Cookie: lang=en-us")
+ assert_equal("en_US", Locale.current.to_s)
+ end
+
+ def test_accept_language
+ ENV["HTTP_ACCEPT_LANGUAGE"] = ""
+ ENV["HTTP_ACCEPT_CHARSET"] = ""
+ setup_cgi("")
+ lang = Locale.current[0]
+ assert_equal(Locale::Tag::Simple, lang.class)
+ assert_equal("en", lang.to_s)
+ assert_equal("en", lang.to_rfc.to_s)
+
+ ENV["HTTP_ACCEPT_LANGUAGE"] = "ja,en-us;q=0.7,en;q=0.3"
+ setup_cgi("")
+ lang1, lang2, lang3 = Locale.current
+ assert_equal("ja", lang1.to_rfc.to_s)
+ assert_equal("en-US", lang2.to_rfc.to_s)
+ assert_equal("en", lang3.to_rfc.to_s)
+
+ ENV["HTTP_ACCEPT_LANGUAGE"] = "en-us,ja;q=0.7,en;q=0.3"
+ setup_cgi("")
+ lang1, lang2, lang3 = Locale.current
+ assert_equal("en-US", lang1.to_rfc.to_s)
+ assert_equal("ja", lang2.to_rfc.to_s)
+ assert_equal("en", lang3.to_rfc.to_s)
+
+ ENV["HTTP_ACCEPT_LANGUAGE"] = "en"
+ setup_cgi("")
+ lang = Locale.current[0]
+ assert_equal("en", lang.to_rfc.to_s)
+ end
+
+ def test_accept_charset
+ #accept charset
+ ENV["HTTP_ACCEPT_CHARSET"] = "Shift_JIS"
+ setup_cgi("")
+ assert_equal("Shift_JIS", Locale.charset)
+
+ ENV["HTTP_ACCEPT_CHARSET"] = "EUC-JP,*,utf-8"
+ setup_cgi("")
+ assert_equal("EUC-JP", Locale.charset)
+
+ ENV["HTTP_ACCEPT_CHARSET"] = "*"
+ setup_cgi("")
+ assert_equal("UTF-8", Locale.charset)
+
+ ENV["HTTP_ACCEPT_CHARSET"] = ""
+ setup_cgi("")
+ assert_equal("UTF-8", Locale.charset)
+ end
+
+ def test_default
+ Locale.set_default(nil)
+ Locale.set_default("ja-JP")
+ ENV["HTTP_ACCEPT_LANGUAGE"] = ""
+ ENV["HTTP_ACCEPT_CHARSET"] = ""
+ setup_cgi("")
+ assert_equal("ja-JP", Locale.default.to_rfc.to_s)
+ assert_equal("ja-JP", Locale.current.to_rfc.to_s)
+ Locale.set_default(nil)
+ end
+
+ def common(*ary)
+ ary.map{|v| Locale::Tag::Common.parse(v)}
+ end
+
+ def rfc(*ary)
+ ary.map{|v| Locale::Tag::Rfc.parse(v)}
+ end
+
+ def cldr(*ary)
+ ary.map{|v| Locale::Tag::Cldr.parse(v)}
+ end
+
+ def simple(*ary)
+ ary.map{|v| Locale::Tag::Simple.parse(v)}
+ end
+
+ def test_candidates
+
+ ENV["HTTP_ACCEPT_LANGUAGE"] = "fr-fr,zh_CN;q=0.7,zh_TW;q=0.2,ja_JP;q=0.1"
+ setup_cgi("")
+
+ assert_equal common("fr-FR", "zh-CN", "zh-TW", "ja-JP",
+ "fr", "zh", "ja", "en"), Locale.candidates
+
+ assert_equal rfc("fr-FR", "zh-CN", "zh-TW", "ja-JP", "fr",
+ "zh", "ja", "en"), Locale.candidates(:type => :rfc)
+
+ assert_equal cldr("fr_FR", "zh_CN", "zh_TW", "ja_JP", "fr",
+ "zh", "ja", "en"), Locale.candidates(:type => :cldr)
+
+ assert_equal simple("fr-FR", "zh-CN", "zh-TW", "ja-JP",
+ "fr", "zh", "ja", "en"), Locale.candidates(:type => :simple)
+
+ taglist = Locale.candidates(:type => :rfc)
+ assert_equal Locale::TagList, taglist.class
+ assert_equal "fr", taglist.language
+ assert_equal "FR", taglist.region
+
+ end
+
+ def test_candidates_with_supported_language_tags
+ ENV["HTTP_ACCEPT_LANGUAGE"] = "fr-fr,zh_CN;q=0.7,zh_TW;q=0.2,ja_JP;q=0.1"
+ setup_cgi("")
+
+ assert_equal common("fr_FR", "zh", "ja"), Locale.candidates(:type => :common,
+ :supported_language_tags => ["fr_FR", "ja", "zh"])
+
+ assert_equal simple("fr-FR", "zh", "ja"), Locale.candidates(:type => :simple,
+ :supported_language_tags => ["fr-FR", "ja", "zh"])
+ #supported_language_tags includes "pt" as not in HTTP_ACCEPT_LANGUAGE
+ assert_equal simple("fr-FR", "zh", "ja"),
+ Locale.candidates(:type => :simple,
+ :supported_language_tags => ["fr-FR", "ja", "zh", "pt"])
+
+ end
+
+ def test_candidates_with_default
+ ENV["HTTP_ACCEPT_LANGUAGE"] = "fr-fr,zh_CN;q=0.7,zh_TW;q=0.2,ja_JP;q=0.1"
+ setup_cgi("")
+
+ Locale.default = "zh_TW"
+ assert_equal simple("fr-FR", "zh", "ja"),
+ Locale.candidates(:type => :simple,
+ :supported_language_tags => ["fr-FR", "ja", "zh", "pt"])
+
+ Locale.default = "pt"
+ assert_equal simple("fr-FR", "zh", "ja", "pt"),
+ Locale.candidates(:type => :simple,
+ :supported_language_tags => ["fr-FR", "ja", "zh", "pt"])
+
+ # default value is selected even if default is not in supported_language_tags.
+ assert_equal simple("pt"), Locale.candidates(:type => :simple,
+ :supported_language_tags => ["aa"])
+ Locale.default = "en"
+ end
+
+
+ def test_candidates_with_app_language_tags
+ Locale.set_app_language_tags("fr-FR", "ja")
+
+ ENV["HTTP_ACCEPT_LANGUAGE"] = "fr-fr,zh_CN;q=0.7,zh_TW;q=0.2,ja_JP;q=0.1"
+ setup_cgi("")
+
+ assert_equal common("fr-FR", "ja"), Locale.candidates
+
+ # default value is selected if default is not in app_language_tags.
+ Locale.set_app_language_tags("no", "pt")
+ Locale.default = "zh"
+ assert_equal common("zh"), Locale.candidates
+
+ Locale.default = "en"
+ Locale.set_app_language_tags(nil)
+ end
+end
diff --git a/vendor/gems/locale-2.0.5/test/test_detect_general.rb b/vendor/gems/locale-2.0.5/test/test_detect_general.rb
new file mode 100644
index 000000000..08b912df1
--- /dev/null
+++ b/vendor/gems/locale-2.0.5/test/test_detect_general.rb
@@ -0,0 +1,164 @@
+require 'locale'
+require 'test/unit'
+
+class TestDetectGeneral < Test::Unit::TestCase
+
+ def setup
+ Locale.clear_all
+ ENV["LC_ALL"] = nil
+ ENV["LC_MESSAGES"] = nil
+ ENV["LANG"] = nil
+ ENV["LANGUAGE"] = nil
+ end
+
+ def test_lc_all
+ ENV["LC_ALL"] = "ja_JP.eucJP"
+ ENV["LC_MESSAGES"] = "zh_CN.UTF-8" #Ignored.
+ ENV["LANG"] = "ko_KR.UTF-8" #Ignored.
+ ENV["LANGUAGE"] = nil
+
+ lang = Locale.current[0]
+ assert_equal Locale::Tag::Posix, lang.class
+ assert_equal "ja", lang.language
+ assert_equal "JP", lang.region
+ assert_equal "eucJP", lang.charset
+ assert_equal Locale::Tag::Posix.new("ja", "JP", "eucJP"), lang
+
+ assert_equal "eucJP", Locale.charset
+ end
+
+ def test_lc_messages
+ ENV["LC_ALL"] = nil
+ ENV["LC_MESSAGES"] = "ja_JP.eucJP"
+ ENV["LANG"] = "ko_KR.UTF-8" #Ignored.
+ ENV["LANGUAGE"] = nil
+
+ lang = Locale.current[0]
+ assert_equal Locale::Tag::Posix, lang.class
+ assert_equal "ja", lang.language
+ assert_equal "JP", lang.region
+ assert_equal "eucJP", lang.charset
+ assert_equal Locale::Tag::Posix.new("ja", "JP", "eucJP"), lang
+
+ assert_equal "eucJP", Locale.charset
+ end
+
+ def test_lang
+ ENV["LC_ALL"] = nil
+ ENV["LC_MESSAGES"] = nil
+ ENV["LANG"] = "ja_JP.eucJP"
+ ENV["LANGUAGE"] = nil
+
+ lang = Locale.current[0]
+ assert_equal Locale::Tag::Posix, lang.class
+ assert_equal "ja", lang.language
+ assert_equal "JP", lang.region
+ assert_equal "eucJP", lang.charset
+ assert_equal Locale::Tag::Posix.new("ja", "JP", "eucJP"), lang
+
+ assert_equal "eucJP", Locale.charset
+ end
+
+ def test_lang_complex
+ ENV["LC_ALL"] = "zh_CN.UTF-8" # Ignored.
+ ENV["LC_MESSAGES"] = "ko_KR.UTF-8" #Ingored.
+ ENV["LANG"] = "en_US.UTF-8" # Ignored.
+ ENV["LANGUAGE"] ="ja_JP.eucJP:zh_CN.UTF-8"
+
+ lang = Locale.current[0]
+ assert_equal Locale::Tag::Posix, lang.class
+ assert_equal "ja", lang.language
+ assert_equal "JP", lang.region
+ assert_equal "eucJP", lang.charset
+ assert_equal Locale::Tag::Posix.new("ja", "JP", "eucJP"), lang
+
+ # Use the LANG value (locale charmap don't use LANGUAGE)
+ assert_equal "UTF-8", Locale.charset
+ end
+
+ def test_language
+ ENV["LC_ALL"] = "ja_JP.Shift_JIS"
+ ENV["LANGUAGE"] = "zh_CN.UTF-8:ja_JP"
+
+ tags = Locale.current
+ assert_equal Locale::Tag::Posix, tags[0].class
+ assert_equal Locale::Tag::Posix, tags[1].class
+
+ assert_equal "zh", tags.language
+ assert_equal "CN", tags.region
+ assert_equal "UTF-8", tags.charset
+
+ assert_equal "zh", tags[0].language
+ assert_equal "CN", tags[0].region
+ assert_equal "UTF-8", tags[0].charset
+
+ assert_equal "ja", tags[1].language
+ assert_equal "JP", tags[1].region
+ assert_equal nil, tags[1].charset
+
+ assert_equal Locale::TagList.new([Locale::Tag::Posix.new("zh", "CN", "UTF-8"),
+ Locale::Tag::Posix.new("ja", "JP")]), tags
+
+ assert_equal "Shift_JIS", Locale.charset
+ end
+
+ def test_no_charset
+ ENV["LC_ALL"] = "cs_CZ"
+
+ lang = Locale.current[0]
+ assert_equal Locale::Tag::Posix, lang.class
+
+ assert_equal "cs", lang.language
+ assert_equal "CZ", lang.region
+ assert_equal nil, lang.charset
+ assert_equal Locale::Tag::Posix.new("cs", "CZ"), lang
+
+=begin
+ This test doesn't work any environment such as Ubuntu.
+ Because this method gets the system locale via "locale -a" command.
+ if /linux|bsd/ =~ RUBY_PLATFORM
+ assert_equal "ISO-8859-2", Locale.charset
+ end
+=end
+ end
+
+ def test_default
+ return unless /linux|bsd/ =~ RUBY_PLATFORM
+ Locale.set_default("yo_NG")
+ assert_equal Locale::Tag.parse("yo_NG"), Locale.default
+ assert_equal Locale::Tag.parse("yo_NG"), Locale.current[0]
+ Locale.set_default(nil)
+
+ Locale.default = "fr"
+ assert_equal Locale::Tag.parse("fr"), Locale.default
+ assert_equal Locale::Tag.parse("fr"), Locale.current[0]
+ Locale.default = nil
+ end
+
+ def test_current
+ Locale.set_current("yo_NG")
+ assert_equal Locale::Tag.parse("yo_NG"), Locale.current[0]
+
+ Locale.current = "fr"
+ assert_equal Locale::Tag.parse("fr"), Locale.current[0]
+
+ Locale.set_default("yo_NG")
+ Locale.current = "fr"
+ assert_equal Locale::Tag.parse("yo_NG"), Locale.default
+ assert_equal Locale::Tag.parse("fr"), Locale.current[0]
+ Locale.set_default(nil)
+ end
+
+ def test_clear
+ ENV["LC_ALL"] = "ja_JP.Shift_JIS"
+ ENV["LANGUAGE"] = nil
+
+ assert_equal Locale::Tag.parse("ja_JP.Shift_JIS"), Locale.current[0]
+ Locale.clear
+ ENV["LANGUAGE"] = "zh_CN.UTF-8:ja_JP"
+ assert_equal Locale::Tag::Posix.parse("zh_CN.UTF-8"), Locale.current[0]
+ assert_equal Locale::Tag::Posix.parse("ja_JP"), Locale.current[1]
+
+ end
+
+end
diff --git a/vendor/gems/locale-2.0.5/test/test_driver_jruby.rb b/vendor/gems/locale-2.0.5/test/test_driver_jruby.rb
new file mode 100644
index 000000000..692d34029
--- /dev/null
+++ b/vendor/gems/locale-2.0.5/test/test_driver_jruby.rb
@@ -0,0 +1,43 @@
+
+begin
+ require 'locale/driver/jruby'
+ require 'test/unit'
+ class TestDiverJRuby < Test::Unit::TestCase
+
+ def setup
+ ENV["LC_ALL"] = nil
+ ENV["LC_MESSAGES"] = nil
+ ENV["LANG"] = nil
+ ENV["LANGUAGE"] = nil
+ end
+
+ def set_locale(tag)
+ java.util.Locale.setDefault(java.util.Locale.new(tag.language, tag.region, tag.variants.to_s))
+ end
+
+ def test_charset
+ # Depends on system value when jvm is started.
+ end
+
+ def test_locales
+ tag = Locale::Tag::Common.parse("ja-JP")
+ set_locale(tag)
+ assert_equal [tag], Locale::Driver::JRuby.locales
+ end
+
+ def test_locales_with_env
+ ENV["LC_ALL"] = "ja_JP.EUC-JP"
+ assert_equal Locale::Tag::Posix.parse("ja_JP.EUC-JP"), Locale::Driver::JRuby.locales[0]
+ assert_equal "EUC-JP", Locale::Driver::JRuby.charset
+
+ ENV["LC_ALL"] = "ja_JP"
+ assert_equal Locale::Tag::Posix.parse("ja_JP"), Locale::Driver::JRuby.locales[0]
+
+ ENV["LC_ALL"] = "C"
+ assert_equal Locale::Tag::Posix.parse("C"), Locale::Driver::JRuby.locales[0]
+ end
+ end
+
+rescue LoadError
+ puts "jruby test was skipped."
+end
diff --git a/vendor/gems/locale-2.0.5/test/test_driver_win32.rb b/vendor/gems/locale-2.0.5/test/test_driver_win32.rb
new file mode 100644
index 000000000..604cd6efe
--- /dev/null
+++ b/vendor/gems/locale-2.0.5/test/test_driver_win32.rb
@@ -0,0 +1,65 @@
+begin
+ require 'locale/driver/win32'
+ require 'test/unit'
+
+ class TestDiverWin32 < Test::Unit::TestCase
+
+ def setup
+ ENV["LC_ALL"] = nil
+ ENV["LC_MESSAGES"] = nil
+ ENV["LANG"] = nil
+ ENV["LANGUAGE"] = nil
+ Locale::Driver::Win32.set_thread_locale_id(nil)
+ end
+
+ def test_charset
+ Locale::Driver::Win32.set_thread_locale_id(0x0404)
+ assert_equal "CP950", Locale::Driver::Win32.charset
+
+ Locale::Driver::Win32.set_thread_locale_id(0x0411)
+ assert_equal "CP932", Locale::Driver::Win32.charset
+
+ Locale::Driver::Win32.set_thread_locale_id(0x201A)
+ assert_equal "CP1251", Locale::Driver::Win32.charset
+
+ Locale::Driver::Win32.set_thread_locale_id(0x0465)
+ assert_equal "UNICODE", Locale::Driver::Win32.charset
+
+ Locale::Driver::Win32.set_thread_locale_id(0x2222) # invalid
+ assert_equal "CP1252", Locale::Driver::Win32.charset
+ end
+
+ def test_locales
+ Locale::Driver::Win32.set_thread_locale_id(0x0404)
+ assert_equal Locale::Tag::Common.parse("zh-TW"), Locale::Driver::Win32.locales[0]
+
+ Locale::Driver::Win32.set_thread_locale_id(0x0411)
+ assert_equal Locale::Tag::Common.parse("ja-JP"), Locale::Driver::Win32.locales[0]
+
+ Locale::Driver::Win32.set_thread_locale_id(0x201A)
+ assert_equal Locale::Tag::Common.parse("bs-Cyrl-BA"), Locale::Driver::Win32.locales[0]
+
+ Locale::Driver::Win32.set_thread_locale_id(0x0465)
+ assert_equal Locale::Tag::Common.parse("div-MV"), Locale::Driver::Win32.locales[0]
+
+ Locale::Driver::Win32.set_thread_locale_id(0x2222) # invalid
+ assert_equal nil, Locale::Driver::Win32.locales
+ end
+
+ def test_locales_with_env
+ ENV["LC_ALL"] = "ja_JP.UTF-8"
+ assert_equal Locale::Tag::Posix.parse("ja_JP.UTF-8"), Locale::Driver::Win32.locales[0]
+ assert_equal "UTF-8", Locale::Driver::Win32.charset
+
+ ENV["LC_ALL"] = "ja_JP"
+ assert_equal Locale::Tag::Posix.parse("ja_JP"), Locale::Driver::Win32.locales[0]
+ assert_equal "CP932", Locale::Driver::Win32.charset
+
+ ENV["LC_ALL"] = "C"
+ assert_equal Locale::Tag::Posix.parse("C"), Locale::Driver::Win32.locales[0]
+ assert_equal "CP1252", Locale::Driver::Win32.charset
+ end
+ end
+rescue LoadError
+ puts "win32 test was skipped."
+end
diff --git a/vendor/gems/locale-2.0.5/test/test_info.rb b/vendor/gems/locale-2.0.5/test/test_info.rb
new file mode 100644
index 000000000..d34efe8fa
--- /dev/null
+++ b/vendor/gems/locale-2.0.5/test/test_info.rb
@@ -0,0 +1,28 @@
+# encoding: UTF-8
+
+require 'locale/info'
+require 'test/unit'
+
+class TestLocaleInfo < Test::Unit::TestCase
+ def test_languages
+ langs = Locale::Info.three_languages
+ assert_equal 7600, langs.length
+ assert_equal "English", langs["eng"].name
+ assert langs["eng"].living?
+ assert langs["eng"].individual?
+
+ langs = Locale::Info.two_languages
+ assert_equal 185, langs.length
+ assert_equal "English", langs["en"].name
+ assert langs["en"].living?
+ assert langs["en"].individual?
+ end
+
+ def test_regions
+ regions = Locale::Info.regions
+ assert_equal 243, regions.length
+ assert_equal "United States", regions["US"].name
+
+ assert_equal "ÅLand Islands", regions['AX'].name
+ end
+end
diff --git a/vendor/gems/locale-2.0.5/test/test_memoizable.rb b/vendor/gems/locale-2.0.5/test/test_memoizable.rb
new file mode 100644
index 000000000..6ce7092e4
--- /dev/null
+++ b/vendor/gems/locale-2.0.5/test/test_memoizable.rb
@@ -0,0 +1,133 @@
+require 'locale/util/memoizable'
+require 'test/unit'
+
+class A
+ include Locale::Util::Memoizable
+ def initialize
+ @count = 0
+ @a = ""
+ end
+ def test1(a)
+ @a += String(a)
+ @count += 1
+ end
+ memoize :test1
+ attr_reader :a
+end
+
+class B < A
+end
+
+class C < A
+ def test1(a)
+ @a = String(a) + @a
+ @count += 1
+ end
+ memoize :test1
+end
+
+class D
+ class << self
+ include Locale::Util::Memoizable
+ def init
+ @@count = 0
+ @@a = "a"
+ end
+ def test1(a)
+ @@a = @@a + "b" * a
+ @@count += 1
+ end
+ memoize :test1
+ def a
+ @@a
+ end
+ end
+end
+
+class E
+ include Locale::Util::Memoizable
+ def test2
+ "aa"
+ end
+ memoize :test2
+
+ def test2_dup
+ "bb"
+ end
+ memoize_dup :test2_dup
+end
+
+class TestMemoizable < Test::Unit::TestCase
+ def test_simple
+ t = A.new
+ assert_equal 1, t.test1(1)
+ assert_equal "1", t.a
+ assert_equal 1, t.test1(1)
+ assert_equal "1", t.a
+ assert_equal 2, t.test1(2)
+ assert_equal "12", t.a
+ assert_equal 2, t.test1(2)
+ assert_equal "12", t.a
+ assert_equal 1, t.test1(1)
+ assert_equal "12", t.a
+ end
+
+ def test_simple_inherited
+ t = B.new
+ assert_equal 1, t.test1(1)
+ assert_equal "1", t.a
+ assert_equal 1, t.test1(1)
+ assert_equal "1", t.a
+ assert_equal 2, t.test1(2)
+ assert_equal "12", t.a
+ assert_equal 2, t.test1(2)
+ assert_equal "12", t.a
+ assert_equal 1, t.test1(1)
+ assert_equal "12", t.a
+ end
+
+ def test_override
+ t = C.new
+ assert_equal 1, t.test1(1)
+ assert_equal "1", t.a
+ assert_equal 1, t.test1(1)
+ assert_equal "1", t.a
+ assert_equal 2, t.test1(2)
+ assert_equal "21", t.a
+ assert_equal 2, t.test1(2)
+ assert_equal "21", t.a
+ assert_equal 1, t.test1(1)
+ assert_equal "21", t.a
+ end
+
+ def test_class_method
+ D.init
+ assert_equal 1, D.test1(1)
+ assert_equal "ab", D.a
+ assert_equal 1, D.test1(1)
+ assert_equal "ab", D.a
+ assert_equal 2, D.test1(2)
+ assert_equal "abbb", D.a
+ assert_equal 2, D.test1(2)
+ assert_equal "abbb", D.a
+ assert_equal 1, D.test1(1)
+ assert_equal "abbb", D.a
+ end
+
+ def test_freeze_or_dup
+ t = E.new
+ assert_equal "aa", t.test2
+ # When modification attempted on frozen objects,
+ # ruby 1.9 raises RuntimeError instead of TypeError.
+ # http://redmine.ruby-lang.org/issues/show/409
+ # http://redmine.ruby-lang.org/repositories/diff/ruby-19/error.c?rev=7294
+ if RUBY_VERSION < '1.9.0'
+ assert_raise(TypeError){ t.test2 << "a" }
+ else
+ assert_raise(RuntimeError){ t.test2 << "a" }
+ end
+ assert_equal "bb", t.test2_dup
+ assert_equal "bbb", t.test2_dup << "b"
+ assert_equal "bb", t.test2_dup
+ end
+end
diff --git a/vendor/gems/locale-2.0.5/test/test_tag.rb b/vendor/gems/locale-2.0.5/test/test_tag.rb
new file mode 100644
index 000000000..ded243995
--- /dev/null
+++ b/vendor/gems/locale-2.0.5/test/test_tag.rb
@@ -0,0 +1,1233 @@
+require 'locale/tag'
+require 'test/unit'
+
+class TagTest < Test::Unit::TestCase
+
+ def test_simple_lang
+ #ja-JP, ja-392
+ lang = Locale::Tag.parse("ja")
+ assert_equal Locale::Tag::Simple, lang.class
+ assert_equal "ja", lang.language
+ assert_equal nil, lang.region
+ assert_equal [Locale::Tag::Simple.parse("ja"),
+ Locale::Tag::Simple.parse("ja")], lang.candidates
+
+ assert_equal Locale::Tag::Simple.parse("ja"), lang.to_simple
+ assert_equal Locale::Tag::Common.parse("ja"), lang.to_common
+ assert_equal Locale::Tag::Rfc.parse("ja"), lang.to_rfc
+ assert_equal Locale::Tag::Cldr.parse("ja"), lang.to_cldr
+ assert_equal Locale::Tag::Posix.parse("ja"), lang.to_posix
+
+ lang = Locale::Tag.parse("kok")
+ assert_equal Locale::Tag::Simple, lang.class
+ assert_equal "kok", lang.language
+ assert_equal nil, lang.region
+ assert_equal [Locale::Tag::Simple.parse("kok"),
+ Locale::Tag::Simple.parse("kok")], lang.candidates
+
+ assert_equal Locale::Tag::Simple.parse("kok"), lang.to_simple
+ assert_equal Locale::Tag::Common.parse("kok"), lang.to_common
+ assert_equal Locale::Tag::Rfc.parse("kok"), lang.to_rfc
+ assert_equal Locale::Tag::Cldr.parse("kok"), lang.to_cldr
+ assert_equal Locale::Tag::Posix.parse("kok"), lang.to_posix
+ end
+
+ def test_simple_lang_region
+ lang = Locale::Tag.parse("ja-JP")
+ assert_equal Locale::Tag::Simple, lang.class
+ assert_equal "ja", lang.language
+ assert_equal "JP", lang.region
+ assert_equal [Locale::Tag::Simple.parse("ja_JP"),
+ Locale::Tag::Simple.parse("ja")], lang.candidates
+
+ assert_equal Locale::Tag::Simple.parse("ja_JP"), lang.to_simple
+ assert_equal Locale::Tag::Common.parse("ja_JP"), lang.to_common
+ assert_equal Locale::Tag::Rfc.parse("ja-JP"), lang.to_rfc
+ assert_equal Locale::Tag::Cldr.parse("ja-JP"), lang.to_cldr
+ assert_equal Locale::Tag::Posix.parse("ja_JP"), lang.to_posix
+
+ lang = Locale::Tag.parse("ja_JP")
+ assert_equal Locale::Tag::Simple, lang.class
+ assert_equal "ja", lang.language
+ assert_equal "JP", lang.region
+ assert_equal [Locale::Tag::Simple.parse("ja_JP"),
+ Locale::Tag::Simple.parse("ja")], lang.candidates
+
+ assert_equal Locale::Tag::Simple.parse("ja_JP"), lang.to_simple
+ assert_equal Locale::Tag::Common.parse("ja_JP"), lang.to_common
+ assert_equal Locale::Tag::Rfc.parse("ja-JP"), lang.to_rfc
+ assert_equal Locale::Tag::Cldr.parse("ja-JP"), lang.to_cldr
+ assert_equal Locale::Tag::Posix.parse("ja_JP"), lang.to_posix
+ end
+
+ def test_simple_unm49
+ # UN_M.49(Country code)
+ lang = Locale::Tag.parse("ja-392")
+ assert_equal Locale::Tag::Simple, lang.class
+ assert_equal "ja", lang.language
+ assert_equal "392", lang.region
+ assert_equal [Locale::Tag::Simple.parse("ja_392"),
+ Locale::Tag::Simple.parse("ja")], lang.candidates
+
+ assert_equal Locale::Tag::Simple.parse("ja-392"), lang.to_simple
+ assert_equal Locale::Tag::Common.parse("ja-392"), lang.to_common
+ assert_equal Locale::Tag::Rfc.parse("ja-392"), lang.to_rfc
+ assert_equal Locale::Tag::Cldr.parse("ja-392"), lang.to_cldr
+ assert_equal Locale::Tag::Posix.parse("ja_392"), lang.to_posix
+
+ lang = Locale::Tag.parse("jpn-392")
+ assert_equal Locale::Tag::Simple, lang.class
+ assert_equal "jpn", lang.language
+ assert_equal "392", lang.region
+ assert_equal [Locale::Tag::Simple.parse("jpn-392"),
+ Locale::Tag::Simple.parse("jpn")], lang.candidates
+
+ assert_equal Locale::Tag::Simple.parse("jpn-392"), lang.to_simple
+ assert_equal Locale::Tag::Common.parse("jpn-392"), lang.to_common
+ assert_equal Locale::Tag::Rfc.parse("jpn-392"), lang.to_rfc
+ assert_equal Locale::Tag::Cldr.parse("jpn-392"), lang.to_cldr
+ assert_equal Locale::Tag::Posix.parse("jpn_392"), lang.to_posix
+
+ lang = Locale::Tag.parse("es-419")
+ assert_equal Locale::Tag::Simple, lang.class
+ assert_equal "es", lang.language
+ assert_equal "419", lang.region
+ assert_equal [Locale::Tag::Simple.parse("es-419"),
+ Locale::Tag::Simple.parse("es")], lang.candidates
+
+ assert_equal Locale::Tag::Simple.parse("es-419"), lang.to_simple
+ assert_equal Locale::Tag::Common.parse("es-419"), lang.to_common
+ assert_equal Locale::Tag::Rfc.parse("es-419"), lang.to_rfc
+ assert_equal Locale::Tag::Cldr.parse("es_419"), lang.to_cldr
+ assert_equal Locale::Tag::Posix.parse("es_419"), lang.to_posix
+ end
+
+ def test_simple_writer
+ lang = Locale::Tag.parse("ja-JP")
+ assert_equal Locale::Tag::Simple, lang.class
+ assert_equal "ja_JP", lang.to_s
+ assert_equal [Locale::Tag::Simple.parse("ja-JP"),
+ Locale::Tag::Simple.parse("ja")], lang.candidates
+ lang.language = "en"
+ assert_equal "en", lang.language
+ assert_equal "en_JP", lang.to_s
+ assert_equal [Locale::Tag::Simple.parse("en-JP"),
+ Locale::Tag::Simple.parse("en")], lang.candidates
+
+ lang.region = "US"
+ assert_equal "en", lang.language
+ assert_equal "US", lang.region
+ assert_equal "en_US", lang.to_s
+ assert_equal [Locale::Tag::Simple.parse("en-US"),
+ Locale::Tag::Simple.parse("en")], lang.candidates
+
+ end
+
+ #lang, region, script, variants
+ def test_common_lang_script
+ lang = Locale::Tag.parse("az_Arab")
+ assert_equal Locale::Tag::Common, lang.class
+ assert_equal "az", lang.language
+ assert_equal nil, lang.region
+ assert_equal "Arab", lang.script
+ assert_equal [Locale::Tag::Common.parse("az_Arab"),
+ Locale::Tag::Common.parse("az_Arab"),
+ Locale::Tag::Common.parse("az"),
+ Locale::Tag::Common.parse("az"),
+ Locale::Tag::Common.parse("az_Arab"),
+ Locale::Tag::Common.parse("az_Arab"),
+ Locale::Tag::Common.parse("az"),
+ Locale::Tag::Common.parse("az"),
+ ], lang.candidates
+
+ assert_equal Locale::Tag::Simple.parse("az"), lang.to_simple
+ assert_equal Locale::Tag::Common.parse("az_Arab"), lang.to_common
+ assert_equal Locale::Tag::Rfc.parse("az-Arab"), lang.to_rfc
+ assert_equal Locale::Tag::Cldr.parse("az_Arab"), lang.to_cldr
+ assert_equal Locale::Tag::Posix.parse("az"), lang.to_posix
+
+
+ lang = Locale::Tag.parse("uz-Cyrl")
+ assert_equal Locale::Tag::Common, lang.class
+ assert_equal "uz", lang.language
+ assert_equal nil, lang.region
+ assert_equal "Cyrl", lang.script
+ assert_equal [Locale::Tag::Common.parse("uz-Cyrl"),
+ Locale::Tag::Common.parse("uz-Cyrl"),
+ Locale::Tag::Common.parse("uz"),
+ Locale::Tag::Common.parse("uz"),
+ Locale::Tag::Common.parse("uz-Cyrl"),
+ Locale::Tag::Common.parse("uz-Cyrl"),
+ Locale::Tag::Common.parse("uz"),
+ Locale::Tag::Common.parse("uz"),
+ ], lang.candidates
+
+ assert_equal Locale::Tag::Simple.parse("uz"), lang.to_simple
+ assert_equal Locale::Tag::Common.parse("uz_Cyrl"), lang.to_common
+ assert_equal Locale::Tag::Rfc.parse("uz-Cyrl"), lang.to_rfc
+ assert_equal Locale::Tag::Cldr.parse("uz_Cyrl"), lang.to_cldr
+ assert_equal Locale::Tag::Posix.parse("uz"), lang.to_posix
+ end
+
+ def test_common_lang_script_region
+ lang = Locale::Tag.parse("ja-Kana-JP")
+ assert_equal Locale::Tag::Common, lang.class
+ assert_equal "ja", lang.language
+ assert_equal "JP", lang.region
+ assert_equal "Kana", lang.script
+ assert_equal [Locale::Tag::Common.parse("ja-Kana-JP"),
+ Locale::Tag::Common.parse("ja-Kana-JP"),
+ Locale::Tag::Common.parse("ja-JP"),
+ Locale::Tag::Common.parse("ja-JP"),
+ Locale::Tag::Common.parse("ja-Kana"),
+ Locale::Tag::Common.parse("ja-Kana"),
+ Locale::Tag::Common.parse("ja"),
+ Locale::Tag::Common.parse("ja")], lang.candidates
+
+ assert_equal Locale::Tag::Simple.parse("ja_JP"), lang.to_simple
+ assert_equal Locale::Tag::Common.parse("ja_Kana_JP"), lang.to_common
+ assert_equal Locale::Tag::Rfc.parse("ja-Kana-JP"), lang.to_rfc
+ assert_equal Locale::Tag::Cldr.parse("ja_Kana_JP"), lang.to_cldr
+ assert_equal Locale::Tag::Posix.parse("ja_JP"), lang.to_posix
+
+ # 3 char language
+ lang = Locale::Tag.parse("jpn-Hira-JP")
+ assert_equal Locale::Tag::Common, lang.class
+ assert_equal "jpn", lang.language
+ assert_equal "JP", lang.region
+ assert_equal "Hira", lang.script
+ assert_equal [Locale::Tag::Common.parse("jpn-Hira-JP"),
+ Locale::Tag::Common.parse("jpn-Hira-JP"),
+ Locale::Tag::Common.parse("jpn-JP"),
+ Locale::Tag::Common.parse("jpn-JP"),
+ Locale::Tag::Common.parse("jpn-Hira"),
+ Locale::Tag::Common.parse("jpn-Hira"),
+ Locale::Tag::Common.parse("jpn"),
+ Locale::Tag::Common.parse("jpn")], lang.candidates
+
+ assert_equal Locale::Tag::Simple.parse("jpn_JP"), lang.to_simple
+ assert_equal Locale::Tag::Common.parse("jpn_Hira_JP"), lang.to_common
+ assert_equal Locale::Tag::Rfc.parse("jpn-Hira-JP"), lang.to_rfc
+ assert_equal Locale::Tag::Cldr.parse("jpn_Hira_JP"), lang.to_cldr
+ assert_equal Locale::Tag::Posix.parse("jpn_JP"), lang.to_posix
+ end
+
+ def test_common_lang_script_unm49
+ lang = Locale::Tag.parse("jpn-Hira-392")
+ assert_equal Locale::Tag::Common, lang.class
+ assert_equal "jpn", lang.language
+ assert_equal "392", lang.region
+ assert_equal "Hira", lang.script
+ assert_equal [Locale::Tag::Common.parse("jpn_Hira_392"),
+ Locale::Tag::Common.parse("jpn_Hira_392"),
+ Locale::Tag::Common.parse("jpn_392"),
+ Locale::Tag::Common.parse("jpn_392"),
+ Locale::Tag::Common.parse("jpn_Hira"),
+ Locale::Tag::Common.parse("jpn_Hira"),
+ Locale::Tag::Common.parse("jpn"),
+ Locale::Tag::Common.parse("jpn")], lang.candidates
+
+
+ assert_equal Locale::Tag::Simple.parse("jpn_392"), lang.to_simple
+ assert_equal Locale::Tag::Common.parse("jpn_Hira_392"), lang.to_common
+ assert_equal Locale::Tag::Rfc.parse("jpn-Hira-392"), lang.to_rfc
+ assert_equal Locale::Tag::Cldr.parse("jpn_Hira_392"), lang.to_cldr
+ assert_equal Locale::Tag::Posix.parse("jpn_392"), lang.to_posix
+ end
+
+ def test_common_lang_script_region_variants
+ lang = Locale::Tag.parse("en_Latn_US_NYNORSK")
+ assert_equal Locale::Tag::Common, lang.class
+ assert_equal "en", lang.language
+ assert_equal "US", lang.region
+ assert_equal ["NYNORSK"], lang.variants
+ assert_equal [Locale::Tag::Common.parse("en_Latn_US_NYNORSK"),
+ Locale::Tag::Common.parse("en_Latn_US"),
+ Locale::Tag::Common.parse("en_US_NYNORSK"),
+ Locale::Tag::Common.parse("en_US"),
+ Locale::Tag::Common.parse("en_Latn_NYNORSK"),
+ Locale::Tag::Common.parse("en_Latn"),
+ Locale::Tag::Common.parse("en_NYNORSK"),
+ Locale::Tag::Common.parse("en")], lang.candidates
+
+
+ assert_equal Locale::Tag::Simple.parse("en-US"), lang.to_simple
+ assert_equal Locale::Tag::Common.parse("en_Latn_US_NYNORSK"), lang.to_common
+ assert_equal Locale::Tag::Rfc.parse("en-Latn-US-NYNORSK"), lang.to_rfc
+ assert_equal Locale::Tag::Cldr.parse("en_Latn_US_NYNORSK"), lang.to_cldr
+ assert_equal Locale::Tag::Posix.parse("en_US@NYNORSK"), lang.to_posix
+ end
+
+
+ def test_common_lang_variants
+ lang = Locale::Tag.parse("ja-osaka")
+ assert_equal Locale::Tag::Common, lang.class
+ assert_equal "ja", lang.language
+ assert_equal nil, lang.region
+ assert_equal nil, lang.script
+ assert_equal ["osaka"], lang.variants
+
+ assert_equal [Locale::Tag::Common.parse("ja-osaka"),
+ Locale::Tag::Common.parse("ja"),
+ Locale::Tag::Common.parse("ja-osaka"),
+ Locale::Tag::Common.parse("ja"),
+ Locale::Tag::Common.parse("ja-osaka"),
+ Locale::Tag::Common.parse("ja"),
+ Locale::Tag::Common.parse("ja-osaka"),
+ Locale::Tag::Common.parse("ja")
+ ], lang.candidates
+
+ assert_equal Locale::Tag::Simple.parse("ja"), lang.to_simple
+ assert_equal Locale::Tag::Common.parse("ja-osaka"), lang.to_common
+ assert_equal Locale::Tag::Rfc.parse("ja-osaka"), lang.to_rfc
+ assert_equal Locale::Tag::Cldr.parse("ja_OSAKA"), lang.to_cldr
+ assert_equal Locale::Tag::Posix.parse("ja@osaka"), lang.to_posix
+ end
+
+ def test_common_lang_region_variants
+ lang = Locale::Tag.parse("ja-JP-osaka")
+ assert_equal Locale::Tag::Common, lang.class
+ assert_equal "ja", lang.language
+ assert_equal "JP", lang.region
+ assert_equal nil, lang.script
+ assert_equal ["osaka"], lang.variants
+
+ assert_equal [Locale::Tag::Common.parse("ja_JP_osaka"),
+ Locale::Tag::Common.parse("ja_JP"),
+ Locale::Tag::Common.parse("ja_JP_osaka"),
+ Locale::Tag::Common.parse("ja_JP"),
+ Locale::Tag::Common.parse("ja_osaka"),
+ Locale::Tag::Common.parse("ja"),
+ Locale::Tag::Common.parse("ja_osaka"),
+ Locale::Tag::Common.parse("ja")
+ ], lang.candidates
+
+ assert_equal Locale::Tag::Simple.parse("ja_JP"), lang.to_simple
+ assert_equal Locale::Tag::Common.parse("ja_JP_osaka"), lang.to_common
+ assert_equal Locale::Tag::Rfc.parse("ja-JP-osaka"), lang.to_rfc
+ assert_equal Locale::Tag::Cldr.parse("ja_JP_OSAKA"), lang.to_cldr
+ assert_equal Locale::Tag::Posix.parse("ja_JP@osaka"), lang.to_posix
+ end
+
+ def test_common_lang_script_region_5length_variants
+ lang = Locale::Tag.parse("ja-Kana-JP-osaka")
+ assert_equal Locale::Tag::Common, lang.class
+ assert_equal "ja", lang.language
+ assert_equal "JP", lang.region
+ assert_equal "Kana", lang.script
+ assert_equal ["osaka"], lang.variants
+
+ assert_equal [Locale::Tag::Common.parse("ja-Kana-JP-osaka"),
+ Locale::Tag::Common.parse("ja-Kana-JP"),
+ Locale::Tag::Common.parse("ja-JP-osaka"),
+ Locale::Tag::Common.parse("ja-JP"),
+ Locale::Tag::Common.parse("ja-Kana-osaka"),
+ Locale::Tag::Common.parse("ja-Kana"),
+ Locale::Tag::Common.parse("ja-osaka"),
+ Locale::Tag::Common.parse("ja")
+ ], lang.candidates
+
+ assert_equal Locale::Tag::Simple.parse("ja_JP"), lang.to_simple
+ assert_equal Locale::Tag::Common.parse("ja_Kana-JP_osaka"), lang.to_common
+ assert_equal Locale::Tag::Rfc.parse("ja-Kana-JP-osaka"), lang.to_rfc
+ assert_equal Locale::Tag::Cldr.parse("ja_Kana_JP_OSAKA"), lang.to_cldr
+ assert_equal Locale::Tag::Posix.parse("ja_JP@osaka"), lang.to_posix
+ end
+
+ def test_common_lang_script_region_mid_length_variants
+ #middle length
+ lang = Locale::Tag.parse("ja-Kana-JP-aomori")
+ assert_equal Locale::Tag::Common, lang.class
+ assert_equal "ja", lang.language
+ assert_equal "JP", lang.region
+ assert_equal "Kana", lang.script
+ assert_equal ["aomori"], lang.variants
+
+ assert_equal [Locale::Tag::Common.parse("ja-Kana-JP-aomori"),
+ Locale::Tag::Common.parse("ja-Kana-JP"),
+ Locale::Tag::Common.parse("ja-JP-aomori"),
+ Locale::Tag::Common.parse("ja-JP"),
+ Locale::Tag::Common.parse("ja-Kana-aomori"),
+ Locale::Tag::Common.parse("ja-Kana"),
+ Locale::Tag::Common.parse("ja-aomori"),
+ Locale::Tag::Common.parse("ja")
+ ], lang.candidates
+
+ assert_equal Locale::Tag::Simple.parse("ja_JP"), lang.to_simple
+ assert_equal Locale::Tag::Common.parse("ja_Kana-JP_aomori"), lang.to_common
+ assert_equal Locale::Tag::Rfc.parse("ja-Kana-JP-aomori"), lang.to_rfc
+ assert_equal Locale::Tag::Cldr.parse("ja_Kana_JP_AOMORI"), lang.to_cldr
+ assert_equal Locale::Tag::Posix.parse("ja_JP@aomori"), lang.to_posix
+
+ end
+
+ def test_common_lang_script_region_8length_variants
+ #8 length
+ lang = Locale::Tag.parse("ja-Kana-JP-hokuriku")
+ assert_equal Locale::Tag::Common, lang.class
+ assert_equal "ja", lang.language
+ assert_equal "JP", lang.region
+ assert_equal "Kana", lang.script
+ assert_equal ["hokuriku"], lang.variants
+
+ assert_equal [Locale::Tag::Common.parse("ja-Kana-JP-hokuriku"),
+ Locale::Tag::Common.parse("ja-Kana-JP"),
+ Locale::Tag::Common.parse("ja-JP-hokuriku"),
+ Locale::Tag::Common.parse("ja-JP"),
+ Locale::Tag::Common.parse("ja-Kana-hokuriku"),
+ Locale::Tag::Common.parse("ja-Kana"),
+ Locale::Tag::Common.parse("ja-hokuriku"),
+ Locale::Tag::Common.parse("ja")
+ ], lang.candidates
+
+ assert_equal Locale::Tag::Simple.parse("ja_JP"), lang.to_simple
+ assert_equal Locale::Tag::Common.parse("ja_Kana-JP_hokuriku"), lang.to_common
+ assert_equal Locale::Tag::Rfc.parse("ja-Kana-JP-hokuriku"), lang.to_rfc
+ assert_equal Locale::Tag::Cldr.parse("ja_Kana_JP_HOKURIKU"), lang.to_cldr
+ assert_equal Locale::Tag::Posix.parse("ja_JP@hokuriku"), lang.to_posix
+ end
+
+ def test_common_lang_script_region_special_variants
+ #1 digit and 3 alpha
+ lang = Locale::Tag.parse("ja-Kana-JP-0abc")
+ assert_equal Locale::Tag::Common, lang.class
+ assert_equal "ja", lang.language
+ assert_equal "JP", lang.region
+ assert_equal "Kana", lang.script
+ assert_equal ["0abc"], lang.variants
+
+ assert_equal [Locale::Tag::Common.parse("ja-Kana-JP-0abc"),
+ Locale::Tag::Common.parse("ja-Kana-JP"),
+ Locale::Tag::Common.parse("ja-JP-0abc"),
+ Locale::Tag::Common.parse("ja-JP"),
+ Locale::Tag::Common.parse("ja-Kana-0abc"),
+ Locale::Tag::Common.parse("ja-Kana"),
+ Locale::Tag::Common.parse("ja-0abc"),
+ Locale::Tag::Common.parse("ja")
+ ], lang.candidates
+
+ assert_equal Locale::Tag::Simple.parse("ja_JP"), lang.to_simple
+ assert_equal Locale::Tag::Common.parse("ja_Kana-JP_0abc"), lang.to_common
+ assert_equal Locale::Tag::Rfc.parse("ja-Kana-JP-0abc"), lang.to_rfc
+ assert_equal Locale::Tag::Cldr.parse("ja_Kana_JP_0ABC"), lang.to_cldr
+ assert_equal Locale::Tag::Posix.parse("ja_JP@0abc"), lang.to_posix
+ end
+
+ def test_common_lang_region_4digits_variants
+ #4 digits
+ lang = Locale::Tag.parse("de-CH-1996")
+ assert_equal Locale::Tag::Common, lang.class
+ assert_equal "de", lang.language
+ assert_equal "CH", lang.region
+ assert_equal nil, lang.script
+ assert_equal ["1996"], lang.variants
+ assert_equal [Locale::Tag::Common.parse("de_CH_1996"),
+ Locale::Tag::Common.parse("de_CH"),
+ Locale::Tag::Common.parse("de_CH_1996"),
+ Locale::Tag::Common.parse("de_CH"),
+ Locale::Tag::Common.parse("de_1996"),
+ Locale::Tag::Common.parse("de"),
+ Locale::Tag::Common.parse("de_1996"),
+ Locale::Tag::Common.parse("de"),
+ ], lang.candidates
+
+ assert_equal Locale::Tag::Simple.parse("de-CH"), lang.to_simple
+ assert_equal Locale::Tag::Common.parse("de-CH-1996"), lang.to_common
+ assert_equal Locale::Tag::Rfc.parse("de-CH-1996"), lang.to_rfc
+ assert_equal Locale::Tag::Cldr.parse("de_CH_1996"), lang.to_cldr
+ assert_equal Locale::Tag::Posix.parse("de_CH@1996"), lang.to_posix
+ end
+
+ def test_common_lang_region_plural_variants
+ #Plural
+ lang = Locale::Tag.parse("ja-Kana-JP-hokuriku-aomori")
+ assert_equal Locale::Tag::Common, lang.class
+ assert_equal "ja", lang.language
+ assert_equal "JP", lang.region
+ assert_equal "Kana", lang.script
+ assert_equal ["hokuriku", "aomori"], lang.variants
+
+ assert_equal [Locale::Tag::Common.parse("ja-Kana-JP-hokuriku-aomori"),
+ Locale::Tag::Common.parse("ja-Kana-JP"),
+ Locale::Tag::Common.parse("ja-JP-hokuriku-aomori"),
+ Locale::Tag::Common.parse("ja-JP"),
+ Locale::Tag::Common.parse("ja-Kana-hokuriku-aomori"),
+ Locale::Tag::Common.parse("ja-Kana"),
+ Locale::Tag::Common.parse("ja-hokuriku-aomori"),
+ Locale::Tag::Common.parse("ja"),
+ ], lang.candidates
+
+ assert_equal Locale::Tag::Simple.parse("ja-JP"), lang.to_simple
+ assert_equal Locale::Tag::Common.parse("ja-Kana-JP-hokuriku-aomori"), lang.to_common
+ assert_equal Locale::Tag::Rfc.parse("ja-Kana-JP-hokuriku-aomori"), lang.to_rfc
+ assert_equal Locale::Tag::Cldr.parse("ja-Kana-JP_HOKURIKU_AOMORI"), lang.to_cldr
+ assert_equal Locale::Tag::Posix.parse("ja_JP@hokuriku-aomori"), lang.to_posix
+ end
+
+ def test_common_cases
+ #cases
+ lang = Locale::Tag.parse("mn-Cyrl-MN")
+ assert_equal Locale::Tag::Common, lang.class
+ assert_equal "mn", lang.language
+ assert_equal "MN", lang.region
+ assert_equal "Cyrl", lang.script
+
+ assert_equal [Locale::Tag::Common.parse("mn-Cyrl-MN"),
+ Locale::Tag::Common.parse("mn-Cyrl-MN"),
+ Locale::Tag::Common.parse("mn-MN"),
+ Locale::Tag::Common.parse("mn-MN"),
+ Locale::Tag::Common.parse("mn-Cyrl"),
+ Locale::Tag::Common.parse("mn-Cyrl"),
+ Locale::Tag::Common.parse("mn"),
+ Locale::Tag::Common.parse("mn"),
+ ], lang.candidates
+
+ assert_equal Locale::Tag::Simple.parse("mn_MN"), lang.to_simple
+ assert_equal Locale::Tag::Common.parse("mn_Cyrl_MN"), lang.to_common
+ assert_equal Locale::Tag::Rfc.parse("mn-Cyrl-MN"), lang.to_rfc
+ assert_equal Locale::Tag::Cldr.parse("mn-Cyrl-MN"), lang.to_cldr
+ assert_equal Locale::Tag::Posix.parse("mn_MN"), lang.to_posix
+
+ lang = Locale::Tag.parse("mN-cYrL-Mn")
+ assert_equal Locale::Tag::Common, lang.class
+ assert_equal "mn", lang.language
+ assert_equal "MN", lang.region
+ assert_equal "Cyrl", lang.script
+
+ assert_equal Locale::Tag::Simple.parse("mn_MN"), lang.to_simple
+ assert_equal Locale::Tag::Common.parse("mn_Cyrl_MN"), lang.to_common
+ assert_equal Locale::Tag::Rfc.parse("mn-Cyrl-MN"), lang.to_rfc
+ assert_equal Locale::Tag::Cldr.parse("mn-Cyrl-MN"), lang.to_cldr
+ assert_equal Locale::Tag::Posix.parse("mn_MN"), lang.to_posix
+
+ lang = Locale::Tag.parse("MN-cYRL-mn")
+ assert_equal Locale::Tag::Common, lang.class
+ assert_equal "mn", lang.language
+ assert_equal "MN", lang.region
+ assert_equal "Cyrl", lang.script
+
+ assert_equal Locale::Tag::Simple.parse("mn_MN"), lang.to_simple
+ assert_equal Locale::Tag::Common.parse("mn_Cyrl_MN"), lang.to_common
+ assert_equal Locale::Tag::Rfc.parse("mn-Cyrl-MN"), lang.to_rfc
+ assert_equal Locale::Tag::Cldr.parse("mn-Cyrl-MN"), lang.to_cldr
+ assert_equal Locale::Tag::Posix.parse("mn_MN"), lang.to_posix
+
+ lang = Locale::Tag.parse("zh-Latn-CN-variant1")
+ assert_equal Locale::Tag::Common, lang.class
+ assert_equal "zh", lang.language
+ assert_equal "CN", lang.region
+ assert_equal "Latn", lang.script
+ assert_equal ["variant1"], lang.variants
+
+ assert_equal [Locale::Tag::Common.parse("zh-Latn-CN-variant1"),
+ Locale::Tag::Common.parse("zh-Latn-CN"),
+ Locale::Tag::Common.parse("zh-CN-variant1"),
+ Locale::Tag::Common.parse("zh-CN"),
+ Locale::Tag::Common.parse("zh-Latn-variant1"),
+ Locale::Tag::Common.parse("zh-Latn"),
+ Locale::Tag::Common.parse("zh-variant1"),
+ Locale::Tag::Common.parse("zh"),
+ ], lang.candidates
+
+ assert_equal Locale::Tag::Simple.parse("zh_CN"), lang.to_simple
+ assert_equal Locale::Tag::Common.parse("zh_Latn_CN-variant1"), lang.to_common
+ assert_equal Locale::Tag::Rfc.parse("zh-Latn-CN-variant1"), lang.to_rfc
+ assert_equal Locale::Tag::Cldr.parse("zh-Latn-CN_VARIANT1"), lang.to_cldr
+ assert_equal Locale::Tag::Posix.parse("zh_CN@variant1"), lang.to_posix
+ end
+
+ def test_common_lang_region_variants_rfc3066
+ # RFC3066 compatible
+ lang = Locale::Tag.parse("ja-jp-mac")
+ assert_equal Locale::Tag::Common, lang.class
+ assert_equal "ja", lang.language
+ assert_equal "JP", lang.region
+ assert_equal ["mac"], lang.variants
+ assert_equal nil, lang.script
+ assert_equal [Locale::Tag::Common.parse("ja_JP_mac"),
+ Locale::Tag::Common.parse("ja_JP"),
+ Locale::Tag::Common.parse("ja_JP_mac"),
+ Locale::Tag::Common.parse("ja_JP"),
+ Locale::Tag::Common.parse("ja_mac"),
+ Locale::Tag::Common.parse("ja"),
+ Locale::Tag::Common.parse("ja_mac"),
+ Locale::Tag::Common.parse("ja"),
+ ], lang.candidates
+
+ end
+
+ def test_common_writer
+ lang = Locale::Tag.parse("zh-Latn-CN-variant1")
+ lang.language = "ja"
+ assert_equal "ja_Latn_CN_variant1", lang.to_s
+ lang.script = "Hira"
+ assert_equal "ja_Hira_CN_variant1", lang.to_s
+ lang.region = "JP"
+ assert_equal "ja_Hira_JP_variant1", lang.to_s
+ lang.variants = ["variant1", "variant2"]
+ assert_equal "ja_Hira_JP_variant1_variant2", lang.to_s
+
+ assert_equal [Locale::Tag::Common.parse("ja-Hira-JP-variant1-variant2"),
+ Locale::Tag::Common.parse("ja-Hira-JP"),
+ Locale::Tag::Common.parse("ja-JP-variant1-variant2"),
+ Locale::Tag::Common.parse("ja-JP"),
+ Locale::Tag::Common.parse("ja-Hira-variant1-variant2"),
+ Locale::Tag::Common.parse("ja-Hira"),
+ Locale::Tag::Common.parse("ja-variant1-variant2"),
+ Locale::Tag::Common.parse("ja"),
+ ], lang.candidates
+
+ end
+
+ def test_rfc_lang_script_region_variant_extension
+ lang = Locale::Tag.parse("zh-Latn-CN-variant1-a-extend1")
+ assert_equal Locale::Tag::Rfc, lang.class
+ assert_equal "zh", lang.language
+ assert_equal "CN", lang.region
+ assert_equal "Latn", lang.script
+ assert_equal ["variant1"], lang.variants
+ assert_equal ["a-extend1"], lang.extensions
+ assert_equal nil, lang.privateuse
+
+ assert_equal [Locale::Tag::Rfc.parse("zh-Latn-CN-variant1"),
+ Locale::Tag::Rfc.parse("zh-Latn-CN"),
+ Locale::Tag::Rfc.parse("zh-CN-variant1"),
+ Locale::Tag::Rfc.parse("zh-CN"),
+ Locale::Tag::Rfc.parse("zh-Latn-variant1"),
+ Locale::Tag::Rfc.parse("zh-Latn"),
+ Locale::Tag::Rfc.parse("zh-variant1"),
+ Locale::Tag::Rfc.parse("zh"),
+ ], lang.candidates
+
+ assert_equal Locale::Tag::Simple.parse("zh_CN"), lang.to_simple
+ assert_equal Locale::Tag::Common.parse("zh-Latn-CN_variant1"), lang.to_common
+ assert_equal Locale::Tag::Rfc.parse("zh-Latn-CN-variant1-a-extend1"), lang.to_rfc
+ assert_equal Locale::Tag::Cldr.parse("zh_Latn_CN_VARIANT1"), lang.to_cldr
+ assert_equal Locale::Tag::Posix.parse("zh_CN@variant1"), lang.to_posix
+ end
+
+ def test_rfc_lang_script_region_extensions
+ lang = Locale::Tag.parse("ja-Kana-JP-0abc-y-aa-z-bbccdd-b-nnnnnnnn")
+ assert_equal Locale::Tag::Rfc, lang.class
+ assert_equal "ja", lang.language
+ assert_equal "JP", lang.region
+ assert_equal "Kana", lang.script
+ assert_equal ["0abc"], lang.variants
+ assert_equal ["y-aa", "z-bbccdd", "b-nnnnnnnn"], lang.extensions
+
+ assert_equal [Locale::Tag::Rfc.parse("ja-Kana-JP-0abc"),
+ Locale::Tag::Rfc.parse("ja-Kana-JP"),
+ Locale::Tag::Rfc.parse("ja-JP-0abc"),
+ Locale::Tag::Rfc.parse("ja-JP"),
+ Locale::Tag::Rfc.parse("ja-Kana-0abc"),
+ Locale::Tag::Rfc.parse("ja-Kana"),
+ Locale::Tag::Rfc.parse("ja-0abc"),
+ Locale::Tag::Rfc.parse("ja"),
+ ], lang.candidates
+
+ assert_equal Locale::Tag::Simple.parse("ja_JP"), lang.to_simple
+ assert_equal Locale::Tag::Common.parse("ja-Kana-JP-0abc"), lang.to_common
+ assert_equal Locale::Tag::Rfc.parse("ja-Kana-JP-0abc-y-aa-z-bbccdd-b-nnnnnnnn"), lang.to_rfc
+ assert_equal Locale::Tag::Cldr.parse("ja_Kana_JP_0abc"), lang.to_cldr
+ assert_equal Locale::Tag::Posix.parse("ja_JP@0abc"), lang.to_posix
+ end
+
+ def test_rfc_lang_region_variants_extensions
+ lang = Locale::Tag.parse("ja-JP-0abc-y-aa-z-bbccdd-b-xxxnnnnn")
+ assert_equal Locale::Tag::Rfc, lang.class
+ assert_equal "ja", lang.language
+ assert_equal "JP", lang.region
+ assert_equal nil, lang.script
+ assert_equal ["0abc"], lang.variants
+ assert_equal ["y-aa", "z-bbccdd", "b-xxxnnnnn"], lang.extensions
+
+ assert_equal [Locale::Tag::Rfc.parse("ja-JP-0abc"),
+ Locale::Tag::Rfc.parse("ja-JP"),
+ Locale::Tag::Rfc.parse("ja-JP-0abc"),
+ Locale::Tag::Rfc.parse("ja-JP"),
+ Locale::Tag::Rfc.parse("ja-0abc"),
+ Locale::Tag::Rfc.parse("ja"),
+ Locale::Tag::Rfc.parse("ja-0abc"),
+ Locale::Tag::Rfc.parse("ja"),
+ ], lang.candidates
+
+ assert_equal Locale::Tag::Simple.parse("ja_JP"), lang.to_simple
+ assert_equal Locale::Tag::Common.parse("ja-JP-0abc"), lang.to_common
+ assert_equal Locale::Tag::Rfc.parse("ja-JP-0abc-y-aa-z-bbccdd-b-xxxnnnnn"), lang.to_rfc
+ assert_equal Locale::Tag::Cldr.parse("ja_JP_0abc"), lang.to_cldr
+ assert_equal Locale::Tag::Posix.parse("ja_JP@0abc"), lang.to_posix
+
+ end
+
+ def test_rfc_lang_extensions
+ lang = Locale::Tag.parse("ja-y-aa-z-bbccdd-b-xxnnnnn")
+ assert_equal Locale::Tag::Rfc, lang.class
+ assert_equal "ja", lang.language
+ assert_equal nil, lang.region
+ assert_equal nil, lang.script
+ assert_equal [], lang.variants
+ assert_equal ["y-aa", "z-bbccdd", "b-xxnnnnn"], lang.extensions
+
+ assert_equal [Locale::Tag::Rfc.parse("ja"),
+ Locale::Tag::Rfc.parse("ja"),
+ Locale::Tag::Rfc.parse("ja"),
+ Locale::Tag::Rfc.parse("ja"),
+ Locale::Tag::Rfc.parse("ja"),
+ Locale::Tag::Rfc.parse("ja"),
+ Locale::Tag::Rfc.parse("ja"),
+ Locale::Tag::Rfc.parse("ja"),
+ ], lang.candidates
+
+ assert_equal Locale::Tag::Simple.parse("ja"), lang.to_simple
+ assert_equal Locale::Tag::Common.parse("ja"), lang.to_common
+ assert_equal Locale::Tag::Rfc.parse("ja-y-aa-z-bbccdd-b-xxnnnnn"), lang.to_rfc
+ assert_equal Locale::Tag::Cldr.parse("ja"), lang.to_cldr
+ assert_equal Locale::Tag::Posix.parse("ja"), lang.to_posix
+ end
+
+ def test_rfc_privateuse
+ #Privateuse
+ lang = Locale::Tag.parse("zh-Latn-CN-variant1-a-extend1-x-wadegile-private1")
+ assert_equal Locale::Tag::Rfc, lang.class
+ assert_equal "zh", lang.language
+ assert_equal "CN", lang.region
+ assert_equal "Latn", lang.script
+ assert_equal ["variant1"], lang.variants
+ assert_equal ["a-extend1"], lang.extensions
+ assert_equal "x-wadegile-private1", lang.privateuse
+
+ assert_equal [Locale::Tag::Rfc.parse("zh-Latn-CN-variant1"),
+ Locale::Tag::Rfc.parse("zh-Latn-CN"),
+ Locale::Tag::Rfc.parse("zh-CN-variant1"),
+ Locale::Tag::Rfc.parse("zh-CN"),
+ Locale::Tag::Rfc.parse("zh-Latn-variant1"),
+ Locale::Tag::Rfc.parse("zh-Latn"),
+ Locale::Tag::Rfc.parse("zh-variant1"),
+ Locale::Tag::Rfc.parse("zh"),
+ ], lang.candidates
+
+ assert_equal Locale::Tag::Simple.parse("zh_CN"), lang.to_simple
+ assert_equal Locale::Tag::Common.parse("zh-Latn-CN_variant1"), lang.to_common
+ assert_equal Locale::Tag::Rfc.parse("zh-Latn-CN-variant1-a-extend1-x-wadegile-private1"), lang.to_rfc
+ assert_equal Locale::Tag::Cldr.parse("zh_Latn_CN_VARIANT1"), lang.to_cldr
+ assert_equal Locale::Tag::Posix.parse("zh_CN@variant1"), lang.to_posix
+ end
+
+ def test_rfc_cldr_conversion
+ #Privateuse with x-ldml (CLDR conversion)
+ lang = Locale::Tag.parse("en-US-x-ldml-POSIX-k-calendar-islamic-k-collatio-traditio-k-colStren-secondar")
+ assert_equal Locale::Tag::Rfc, lang.class
+ assert_equal "en", lang.language
+ assert_equal "US", lang.region
+ assert_equal ["POSIX"], lang.variants
+ assert_equal ["k-calendar-islamic", "k-collatio-traditio", "k-colStren-secondar"], lang.extensions
+ assert_equal "x-ldml-POSIX-k-calendar-islamic-k-collatio-traditio-k-colStren-secondar", lang.privateuse
+
+ assert_equal [Locale::Tag::Rfc.parse("en-US-POSIX"),
+ Locale::Tag::Rfc.parse("en-US"),
+ Locale::Tag::Rfc.parse("en-US-POSIX"),
+ Locale::Tag::Rfc.parse("en-US"),
+ Locale::Tag::Rfc.parse("en-POSIX"),
+ Locale::Tag::Rfc.parse("en"),
+ Locale::Tag::Rfc.parse("en-POSIX"),
+ Locale::Tag::Rfc.parse("en"),
+ ], lang.candidates
+
+ assert_equal Locale::Tag::Simple.parse("en_US"), lang.to_simple
+ assert_equal Locale::Tag::Common.parse("en-US_POSIX"), lang.to_common
+ assert_equal Locale::Tag::Rfc.parse("en-US-x-ldml-POSIX-k-calendar-islamic-k-collatio-traditio-k-colStren-secondar"), lang.to_rfc
+ assert_equal Locale::Tag::Cldr.parse("en_US_POSIX@calendar=islamic;collatio=traditio;colStren=secondar"), lang.to_cldr
+ assert_equal Locale::Tag::Posix.parse("en_US@POSIX"), lang.to_posix
+
+ lang = Locale::Tag.parse("en-US-x-ldml-k-calendar-islamic-k-collatio-traditio-k-colStren-secondar")
+ assert_equal Locale::Tag::Rfc, lang.class
+ assert_equal "en", lang.language
+ assert_equal "US", lang.region
+ assert_equal [], lang.variants
+ assert_equal ["k-calendar-islamic", "k-collatio-traditio", "k-colStren-secondar"], lang.extensions
+ assert_equal "x-ldml-k-calendar-islamic-k-collatio-traditio-k-colStren-secondar", lang.privateuse
+
+ assert_equal [Locale::Tag::Rfc.parse("en-US"),
+ Locale::Tag::Rfc.parse("en-US"),
+ Locale::Tag::Rfc.parse("en-US"),
+ Locale::Tag::Rfc.parse("en-US"),
+ Locale::Tag::Rfc.parse("en"),
+ Locale::Tag::Rfc.parse("en"),
+ Locale::Tag::Rfc.parse("en"),
+ Locale::Tag::Rfc.parse("en"),
+ ], lang.candidates
+
+ assert_equal Locale::Tag::Simple.parse("en_US"), lang.to_simple
+ assert_equal Locale::Tag::Common.parse("en-US"), lang.to_common
+ assert_equal Locale::Tag::Rfc.parse("en-US-x-ldml-k-calendar-islamic-k-collatio-traditio-k-colStren-secondar"), lang.to_rfc
+ assert_equal Locale::Tag::Cldr.parse("en_US@calendar=islamic;collatio=traditio;colStren=secondar"), lang.to_cldr
+ assert_equal Locale::Tag::Posix.parse("en_US"), lang.to_posix
+ end
+
+ def test_rfc_writer
+ lang = Locale::Tag.parse("zh-Latn-CN-variant1-a-extend1-x-wadegile-private1")
+ lang.language = "ja"
+ assert_equal "ja-Latn-CN-variant1-a-extend1-x-wadegile-private1", lang.to_s
+ lang.script = "Hira"
+ assert_equal "ja-Hira-CN-variant1-a-extend1-x-wadegile-private1", lang.to_s
+ lang.region = "JP"
+ assert_equal "ja-Hira-JP-variant1-a-extend1-x-wadegile-private1", lang.to_s
+ lang.variants = ["variant2"]
+ assert_equal "ja-Hira-JP-variant2-a-extend1-x-wadegile-private1", lang.to_s
+ lang.extensions = ["b-extend2"]
+ assert_equal "ja-Hira-JP-variant2-b-extend2-x-wadegile-private1", lang.to_s
+ lang.privateuse = "x-foooo"
+ assert_equal "ja-Hira-JP-variant2-b-extend2-x-foooo", lang.to_s
+
+ assert_equal [Locale::Tag::Rfc.parse("ja-Hira-JP-variant2"),
+ Locale::Tag::Rfc.parse("ja-Hira-JP"),
+ Locale::Tag::Rfc.parse("ja-JP-variant2"),
+ Locale::Tag::Rfc.parse("ja-JP"),
+ Locale::Tag::Rfc.parse("ja-Hira-variant2"),
+ Locale::Tag::Rfc.parse("ja-Hira"),
+ Locale::Tag::Rfc.parse("ja-variant2"),
+ Locale::Tag::Rfc.parse("ja"),
+ ], lang.candidates
+ end
+
+ def test_cldr_lang_extensions
+ lang = Locale::Tag.parse("de@collation=phonebook")
+ assert_equal Locale::Tag::Cldr, lang.class
+ assert_equal "de", lang.language
+ assert_equal nil, lang.region
+ assert_equal "phonebook", lang.extensions["collation"]
+
+ assert_equal [Locale::Tag::Cldr.parse("de"),
+ Locale::Tag::Cldr.parse("de"),
+ Locale::Tag::Cldr.parse("de"),
+ Locale::Tag::Cldr.parse("de"),
+ Locale::Tag::Cldr.parse("de"),
+ Locale::Tag::Cldr.parse("de"),
+ Locale::Tag::Cldr.parse("de"),
+ Locale::Tag::Cldr.parse("de"),
+ ], lang.candidates
+
+ assert_equal Locale::Tag::Simple.parse("de"), lang.to_simple
+ assert_equal Locale::Tag::Common.parse("de"), lang.to_common
+ assert_equal Locale::Tag::Rfc.parse("de-k-collatio-phoneboo"), lang.to_rfc
+ assert_equal Locale::Tag::Cldr.parse("de@collation=phonebook"), lang.to_cldr
+ assert_equal Locale::Tag::Posix.parse("de"), lang.to_posix
+ end
+
+ def test_cldr_lang_script_extension
+ lang = Locale::Tag.parse("az_Arab@collation=phonebook")
+ assert_equal Locale::Tag::Cldr, lang.class
+ assert_equal "az", lang.language
+ assert_equal nil, lang.region
+ assert_equal "Arab", lang.script
+ assert_equal "phonebook", lang.extensions["collation"]
+
+ assert_equal [Locale::Tag::Cldr.parse("az_Arab"),
+ Locale::Tag::Cldr.parse("az_Arab"),
+ Locale::Tag::Cldr.parse("az"),
+ Locale::Tag::Cldr.parse("az"),
+ Locale::Tag::Cldr.parse("az_Arab"),
+ Locale::Tag::Cldr.parse("az_Arab"),
+ Locale::Tag::Cldr.parse("az"),
+ Locale::Tag::Cldr.parse("az"),
+ ], lang.candidates
+
+ assert_equal Locale::Tag::Simple.parse("az"), lang.to_simple
+ assert_equal Locale::Tag::Common.parse("az_Arab"), lang.to_common
+ assert_equal Locale::Tag::Rfc.parse("az-Arab-k-collatio-phoneboo"), lang.to_rfc
+ assert_equal Locale::Tag::Cldr.parse("az_Arab@collation=phonebook"), lang.to_cldr
+ assert_equal Locale::Tag::Posix.parse("az"), lang.to_posix
+
+ end
+
+ def test_cldr_lang_region_extensions
+ lang = Locale::Tag.parse("de_DE@collation=phonebook;currency=DDM")
+ assert_equal Locale::Tag::Cldr, lang.class
+ assert_equal "de", lang.language
+ assert_equal "DE", lang.region
+ assert_equal "phonebook", lang.extensions["collation"]
+ assert_equal "DDM", lang.extensions["currency"]
+
+ assert_equal [Locale::Tag::Cldr.parse("de_DE"),
+ Locale::Tag::Cldr.parse("de_DE"),
+ Locale::Tag::Cldr.parse("de_DE"),
+ Locale::Tag::Cldr.parse("de_DE"),
+ Locale::Tag::Cldr.parse("de"),
+ Locale::Tag::Cldr.parse("de"),
+ Locale::Tag::Cldr.parse("de"),
+ Locale::Tag::Cldr.parse("de"),
+ ], lang.candidates
+
+ assert_equal Locale::Tag::Simple.parse("de_DE"), lang.to_simple
+ assert_equal Locale::Tag::Common.parse("de_DE"), lang.to_common
+ assert_equal Locale::Tag::Rfc.parse("de-DE-k-collatio-phoneboo-k-currency-DDM"), lang.to_rfc
+ assert_equal Locale::Tag::Cldr.parse("de_DE@collation=phonebook;currency=DDM"), lang.to_cldr
+ assert_equal Locale::Tag::Posix.parse("de_DE"), lang.to_posix
+
+ lang = Locale::Tag.parse("en_US@calendar=islamic;collation=traditional;colStrength=secondary")
+ assert_equal Locale::Tag::Cldr, lang.class
+ assert_equal "en", lang.language
+ assert_equal "US", lang.region
+ assert_equal [], lang.variants
+ assert_equal "islamic", lang.extensions["calendar"]
+ assert_equal "traditional", lang.extensions["collation"]
+ assert_equal "secondary", lang.extensions["colStrength"]
+
+ assert_equal [Locale::Tag::Cldr.parse("en_US"),
+ Locale::Tag::Cldr.parse("en_US"),
+ Locale::Tag::Cldr.parse("en_US"),
+ Locale::Tag::Cldr.parse("en_US"),
+ Locale::Tag::Cldr.parse("en"),
+ Locale::Tag::Cldr.parse("en"),
+ Locale::Tag::Cldr.parse("en"),
+ Locale::Tag::Cldr.parse("en"),
+ ], lang.candidates
+
+ assert_equal Locale::Tag::Simple.parse("en_US"), lang.to_simple
+ assert_equal Locale::Tag::Common.parse("en_US"), lang.to_common
+ assert_equal Locale::Tag::Rfc.parse("en-US-k-calendar-islamic-k-collatio-traditio-k-colStren-secondar"), lang.to_rfc
+ assert_equal Locale::Tag::Cldr.parse("en_US@calendar=islamic;collation=traditional;colStrength=secondary"), lang.to_cldr
+ assert_equal Locale::Tag::Posix.parse("en_US"), lang.to_posix
+
+ end
+
+ def test_cldr_lang_region_variants_extensions
+ lang = Locale::Tag.parse("en_US_POSIX@calendar=islamic;collation=traditional;colStrength=secondary")
+ assert_equal Locale::Tag::Cldr, lang.class
+ assert_equal "en", lang.language
+ assert_equal "US", lang.region
+ assert_equal ["POSIX"], lang.variants
+ assert_equal "islamic", lang.extensions["calendar"]
+ assert_equal "traditional", lang.extensions["collation"]
+ assert_equal "secondary", lang.extensions["colStrength"]
+
+ assert_equal [Locale::Tag::Cldr.parse("en_US_POSIX"),
+ Locale::Tag::Cldr.parse("en_US"),
+ Locale::Tag::Cldr.parse("en_US_POSIX"),
+ Locale::Tag::Cldr.parse("en_US"),
+ Locale::Tag::Cldr.parse("en_POSIX"),
+ Locale::Tag::Cldr.parse("en"),
+ Locale::Tag::Cldr.parse("en_POSIX"),
+ Locale::Tag::Cldr.parse("en"),
+ ], lang.candidates
+
+ assert_equal Locale::Tag::Simple.parse("en_US"), lang.to_simple
+ assert_equal Locale::Tag::Common.parse("en_US_POSIX"), lang.to_common
+ assert_equal Locale::Tag::Rfc.parse("en-US-POSIX-k-calendar-islamic-k-collatio-traditio-k-colStren-secondar"), lang.to_rfc
+ assert_equal Locale::Tag::Cldr.parse("en_US_POSIX@calendar=islamic;collation=traditional;colStrength=secondary"), lang.to_cldr
+ assert_equal Locale::Tag::Posix.parse("en_US@POSIX"), lang.to_posix
+ end
+
+ def test_cldr_writer
+ lang = Locale::Tag.parse("en_US@calendar=islamic;colStrength=secondary")
+ lang.language = "ja"
+ assert_equal "ja_US@calendar=islamic;colStrength=secondary", lang.to_s
+ lang.script = "Hira"
+ assert_equal "ja_Hira_US@calendar=islamic;colStrength=secondary", lang.to_s
+ lang.region = "JP"
+ assert_equal "ja_Hira_JP@calendar=islamic;colStrength=secondary", lang.to_s
+ lang.variants = ["POSIX"]
+ assert_equal "ja_Hira_JP_POSIX@calendar=islamic;colStrength=secondary", lang.to_s
+ lang.extensions = {:collation => "traditional"}
+ assert_equal "ja_Hira_JP_POSIX@collation=traditional", lang.to_s
+
+ assert_equal [Locale::Tag::Cldr.parse("ja_Hira_JP_POSIX"),
+ Locale::Tag::Cldr.parse("ja_Hira_JP"),
+ Locale::Tag::Cldr.parse("ja_JP_POSIX"),
+ Locale::Tag::Cldr.parse("ja_JP"),
+ Locale::Tag::Cldr.parse("ja_Hira_POSIX"),
+ Locale::Tag::Cldr.parse("ja_Hira"),
+ Locale::Tag::Cldr.parse("ja_POSIX"),
+ Locale::Tag::Cldr.parse("ja"),
+ ], lang.candidates
+ end
+
+ def test_posix_c_and_posix
+ lang = Locale::Tag.parse("C")
+ assert_equal Locale::Tag::Posix, lang.class
+ assert_equal "en", lang.language
+ assert_equal "US", lang.region
+ assert_equal "C", lang.tag
+
+ assert_equal [Locale::Tag::Posix.parse("en_US"),
+ Locale::Tag::Posix.parse("en_US"),
+ Locale::Tag::Posix.parse("en_US"),
+ Locale::Tag::Posix.parse("en_US"),
+ Locale::Tag::Posix.parse("en"),
+ Locale::Tag::Posix.parse("en"),
+ Locale::Tag::Posix.parse("en"),
+ Locale::Tag::Posix.parse("en"),
+ ], lang.candidates
+
+ assert_equal Locale::Tag::Simple.parse("en_US"), lang.to_simple
+ assert_equal Locale::Tag::Common.parse("en_US"), lang.to_common
+ assert_equal Locale::Tag::Rfc.parse("en-US"), lang.to_rfc
+ assert_equal Locale::Tag::Cldr.parse("en_US"), lang.to_cldr
+ assert_equal Locale::Tag::Posix.parse("en_US"), lang.to_posix
+
+ lang = Locale::Tag.parse("POSIX")
+ assert_equal Locale::Tag::Posix, lang.class
+ assert_equal "en", lang.language
+ assert_equal "US", lang.region
+ assert_equal "POSIX", lang.tag
+
+ assert_equal [Locale::Tag::Posix.parse("en_US"),
+ Locale::Tag::Posix.parse("en_US"),
+ Locale::Tag::Posix.parse("en_US"),
+ Locale::Tag::Posix.parse("en_US"),
+ Locale::Tag::Posix.parse("en"),
+ Locale::Tag::Posix.parse("en"),
+ Locale::Tag::Posix.parse("en"),
+ Locale::Tag::Posix.parse("en"),
+ ], lang.candidates
+
+ assert_equal Locale::Tag::Simple.parse("en_US"), lang.to_simple
+ assert_equal Locale::Tag::Common.parse("en_US"), lang.to_common
+ assert_equal Locale::Tag::Rfc.parse("en-US"), lang.to_rfc
+ assert_equal Locale::Tag::Cldr.parse("en_US"), lang.to_cldr
+ assert_equal Locale::Tag::Posix.parse("en_US"), lang.to_posix
+ end
+
+ def test_posix_irregular_format
+ lang = Locale::Tag.parse("japanese.euc")
+ assert_equal Locale::Tag::Posix, lang.class
+ assert_equal "japanese", lang.language
+ assert_equal nil, lang.region
+ assert_equal "euc", lang.charset
+
+ assert_equal [Locale::Tag::Posix.parse("japanese.euc"),
+ Locale::Tag::Posix.parse("japanese.euc"),
+ Locale::Tag::Posix.parse("japanese"),
+ Locale::Tag::Posix.parse("japanese"),
+ Locale::Tag::Posix.parse("japanese.euc"),
+ Locale::Tag::Posix.parse("japanese.euc"),
+ Locale::Tag::Posix.parse("japanese"),
+ Locale::Tag::Posix.parse("japanese"),
+ ], lang.candidates
+
+ lang = Locale::Tag.parse("univ.utf8")
+ assert_equal Locale::Tag::Posix, lang.class
+ assert_equal "univ", lang.language
+ assert_equal nil, lang.region
+ assert_equal "utf8", lang.charset
+
+ assert_equal [Locale::Tag::Posix.parse("univ.utf8"),
+ Locale::Tag::Posix.parse("univ.utf8"),
+ Locale::Tag::Posix.parse("univ"),
+ Locale::Tag::Posix.parse("univ"),
+ Locale::Tag::Posix.parse("univ.utf8"),
+ Locale::Tag::Posix.parse("univ.utf8"),
+ Locale::Tag::Posix.parse("univ"),
+ Locale::Tag::Posix.parse("univ"),
+ ], lang.candidates
+ end
+
+ def test_posix_lang_charset
+ lang = Locale::Tag.parse("es.iso885915")
+ assert_equal Locale::Tag::Posix, lang.class
+ assert_equal "es", lang.language
+ assert_equal nil, lang.region
+ assert_equal "iso885915", lang.charset
+ assert_equal nil, lang.modifier
+
+ assert_equal [Locale::Tag::Posix.parse("es.iso885915"),
+ Locale::Tag::Posix.parse("es.iso885915"),
+ Locale::Tag::Posix.parse("es"),
+ Locale::Tag::Posix.parse("es"),
+ Locale::Tag::Posix.parse("es.iso885915"),
+ Locale::Tag::Posix.parse("es.iso885915"),
+ Locale::Tag::Posix.parse("es"),
+ Locale::Tag::Posix.parse("es"),
+ ], lang.candidates
+
+ assert_equal Locale::Tag::Simple.parse("es"), lang.to_simple
+ assert_equal Locale::Tag::Common.parse("es"), lang.to_common
+ assert_equal Locale::Tag::Rfc.parse("es"), lang.to_rfc
+ assert_equal Locale::Tag::Cldr.parse("es"), lang.to_cldr
+ assert_equal Locale::Tag::Posix.parse("es.iso885915"), lang.to_posix
+ end
+
+ def test_posix_lang_region_charset
+ lang = Locale::Tag.parse("es_ES.iso885915")
+ assert_equal Locale::Tag::Posix, lang.class
+ assert_equal "es", lang.language
+ assert_equal "ES", lang.region
+ assert_equal "iso885915", lang.charset
+ assert_equal nil, lang.modifier
+
+ assert_equal [Locale::Tag::Posix.parse("es_ES.iso885915"),
+ Locale::Tag::Posix.parse("es_ES.iso885915"),
+ Locale::Tag::Posix.parse("es_ES"),
+ Locale::Tag::Posix.parse("es_ES"),
+ Locale::Tag::Posix.parse("es.iso885915"),
+ Locale::Tag::Posix.parse("es.iso885915"),
+ Locale::Tag::Posix.parse("es"),
+ Locale::Tag::Posix.parse("es"),
+ ], lang.candidates
+
+ assert_equal Locale::Tag::Simple.parse("es_ES"), lang.to_simple
+ assert_equal Locale::Tag::Common.parse("es_ES"), lang.to_common
+ assert_equal Locale::Tag::Rfc.parse("es-ES"), lang.to_rfc
+ assert_equal Locale::Tag::Cldr.parse("es_ES"), lang.to_cldr
+ assert_equal Locale::Tag::Posix.parse("es_ES.iso885915"), lang.to_posix
+
+ lang = Locale::Tag.parse("ja_JP.UTF-8")
+ assert_equal Locale::Tag::Posix, lang.class
+ assert_equal "ja", lang.language
+ assert_equal "JP", lang.region
+ assert_equal "UTF-8", lang.charset
+
+ assert_equal [Locale::Tag::Posix.parse("ja_JP.UTF-8"),
+ Locale::Tag::Posix.parse("ja_JP.UTF-8"),
+ Locale::Tag::Posix.parse("ja_JP"),
+ Locale::Tag::Posix.parse("ja_JP"),
+ Locale::Tag::Posix.parse("ja.UTF-8"),
+ Locale::Tag::Posix.parse("ja.UTF-8"),
+ Locale::Tag::Posix.parse("ja"),
+ Locale::Tag::Posix.parse("ja"),
+ ], lang.candidates
+
+ assert_equal Locale::Tag::Simple.parse("ja_JP"), lang.to_simple
+ assert_equal Locale::Tag::Common.parse("ja_JP"), lang.to_common
+ assert_equal Locale::Tag::Rfc.parse("ja-JP"), lang.to_rfc
+ assert_equal Locale::Tag::Cldr.parse("ja_JP"), lang.to_cldr
+ assert_equal Locale::Tag::Posix.parse("ja_JP.UTF-8"), lang.to_posix
+ end
+
+ def test_posix_lang_modifier
+ lang = Locale::Tag.parse("es@euro")
+ assert_equal Locale::Tag::Posix, lang.class
+ assert_equal "es", lang.language
+ assert_equal nil, lang.region
+ assert_equal nil, lang.charset
+ assert_equal "euro", lang.modifier
+
+ assert_equal [Locale::Tag::Posix.parse("es@euro"),
+ Locale::Tag::Posix.parse("es"),
+ Locale::Tag::Posix.parse("es@euro"),
+ Locale::Tag::Posix.parse("es"),
+ Locale::Tag::Posix.parse("es@euro"),
+ Locale::Tag::Posix.parse("es"),
+ Locale::Tag::Posix.parse("es@euro"),
+ Locale::Tag::Posix.parse("es"),
+ ], lang.candidates
+
+ # A modifier is converted to a variant.
+ # If the modifier is less than 5 characters, it is not canonical value.
+ assert_equal Locale::Tag::Simple.parse("es"), lang.to_simple
+ assert_equal Locale::Tag::Common.new("es", nil, nil, ["euro"]), lang.to_common
+ assert_equal Locale::Tag::Rfc.new("es", nil, nil, ["euro"]), lang.to_rfc
+ assert_equal Locale::Tag::Cldr.new("es", nil, nil, ["euro"]), lang.to_cldr
+ assert_equal Locale::Tag::Posix.parse("es@euro"), lang.to_posix
+ end
+
+ def test_posix_lang_region_modifier
+ lang = Locale::Tag.parse("es_ES@euro")
+ assert_equal Locale::Tag::Posix, lang.class
+ assert_equal "es", lang.language
+ assert_equal "ES", lang.region
+ assert_equal nil, lang.charset
+ assert_equal "euro", lang.modifier
+
+ assert_equal [Locale::Tag::Posix.parse("es_ES@euro"),
+ Locale::Tag::Posix.parse("es_ES"),
+ Locale::Tag::Posix.parse("es_ES@euro"),
+ Locale::Tag::Posix.parse("es_ES"),
+ Locale::Tag::Posix.parse("es@euro"),
+ Locale::Tag::Posix.parse("es"),
+ Locale::Tag::Posix.parse("es@euro"),
+ Locale::Tag::Posix.parse("es"),
+ ], lang.candidates
+
+ assert_equal Locale::Tag::Simple.parse("es_ES"), lang.to_simple
+ assert_equal Locale::Tag::Common.new("es", nil, "ES", ["euro"]), lang.to_common
+ assert_equal Locale::Tag::Rfc.new("es", nil, "ES", ["euro"]), lang.to_rfc
+ assert_equal Locale::Tag::Cldr.new("es", nil, "ES", ["EURO"]), lang.to_cldr
+ assert_equal Locale::Tag::Posix.parse("es_ES@euro"), lang.to_posix
+
+ end
+
+ def test_posix_lang_region_charset_modifier
+ lang = Locale::Tag.parse("es_ES.iso885915@euro")
+ assert_equal Locale::Tag::Posix, lang.class
+ assert_equal "es", lang.language
+ assert_equal "ES", lang.region
+ assert_equal "iso885915", lang.charset
+ assert_equal "euro", lang.modifier
+
+ assert_equal [Locale::Tag::Posix.parse("es_ES.iso885915@euro"),
+ Locale::Tag::Posix.parse("es_ES.iso885915"),
+ Locale::Tag::Posix.parse("es_ES@euro"),
+ Locale::Tag::Posix.parse("es_ES"),
+ Locale::Tag::Posix.parse("es.iso885915@euro"),
+ Locale::Tag::Posix.parse("es.iso885915"),
+ Locale::Tag::Posix.parse("es@euro"),
+ Locale::Tag::Posix.parse("es"),
+ ], lang.candidates
+
+ assert_equal Locale::Tag::Simple.parse("es_ES"), lang.to_simple
+ assert_equal Locale::Tag::Common.new("es", nil, "ES", ["euro"]), lang.to_common
+ assert_equal Locale::Tag::Rfc.new("es", nil, "ES", ["euro"]), lang.to_rfc
+ assert_equal Locale::Tag::Cldr.new("es", nil, "ES", ["EURO"]), lang.to_cldr
+ assert_equal Locale::Tag::Posix.parse("es_ES.iso885915@euro"), lang.to_posix
+
+ end
+
+ def test_posix_writer
+ lang = Locale::Tag.parse("es_ES.iso885915@euro")
+ lang.language = "ja"
+ assert_equal "ja_ES.iso885915@euro", lang.to_s
+ lang.region = "JP"
+ assert_equal "ja_JP.iso885915@euro", lang.to_s
+ lang.charset = "EUC-JP"
+ assert_equal "ja_JP.EUC-JP@euro", lang.to_s
+ lang.modifier = "osaka"
+ assert_equal "ja_JP.EUC-JP@osaka", lang.to_s
+ assert_equal [Locale::Tag::Posix.parse("ja_JP.EUC-JP@osaka"),
+ Locale::Tag::Posix.parse("ja_JP.EUC-JP"),
+ Locale::Tag::Posix.parse("ja_JP@osaka"),
+ Locale::Tag::Posix.parse("ja_JP"),
+ Locale::Tag::Posix.parse("ja.EUC-JP@osaka"),
+ Locale::Tag::Posix.parse("ja.EUC-JP"),
+ Locale::Tag::Posix.parse("ja@osaka"),
+ Locale::Tag::Posix.parse("ja"),
+ ], lang.candidates
+ end
+
+ def test_invaild
+ lang = Locale::Tag.parse("")
+ assert_equal Locale::Tag::Irregular, lang.class
+ assert_equal "en", lang.language
+ assert_equal nil, lang.region
+
+ assert_equal [Locale::Tag::Irregular.new("en"),
+ ], lang.candidates
+
+ assert_equal Locale::Tag::Simple.parse("en"), lang.to_simple
+ assert_equal Locale::Tag::Common.parse("en"), lang.to_common
+ assert_equal Locale::Tag::Rfc.parse("en"), lang.to_rfc
+ assert_equal Locale::Tag::Cldr.parse("en"), lang.to_cldr
+ assert_equal Locale::Tag::Posix.parse("en"), lang.to_posix
+
+ lang = Locale::Tag.parse(nil)
+ assert_equal Locale::Tag::Irregular, lang.class
+ assert_equal "en", lang.language
+ assert_equal nil, lang.region
+
+ assert_equal [Locale::Tag::Irregular.new("en"),
+ ], lang.candidates
+
+ assert_equal Locale::Tag::Simple.parse("en"), lang.to_simple
+ assert_equal Locale::Tag::Common.parse("en"), lang.to_common
+ assert_equal Locale::Tag::Rfc.parse("en"), lang.to_rfc
+ assert_equal Locale::Tag::Cldr.parse("en"), lang.to_cldr
+ assert_equal Locale::Tag::Posix.parse("en"), lang.to_posix
+ end
+
+ def test_raise_error
+ assert_raise(RuntimeError){
+ Locale::Tag::Simple.new(nil)
+ }
+ end
+
+end
diff --git a/vendor/gems/locale-2.0.5/test/test_taglist.rb b/vendor/gems/locale-2.0.5/test/test_taglist.rb
new file mode 100644
index 000000000..5a426a7d3
--- /dev/null
+++ b/vendor/gems/locale-2.0.5/test/test_taglist.rb
@@ -0,0 +1,34 @@
+# encoding: UTF-8
+
+require 'locale/tag'
+require 'locale/taglist'
+require 'test/unit'
+
+class TestTagList < Test::Unit::TestCase
+ def test_taglist_posix
+ list = Locale::TagList.new([Locale::Tag.parse("ja_JP.eucJP@mobile"),
+ Locale::Tag.parse("en_US.iso8859-1")])
+
+ assert_equal "ja", list.language
+ assert_equal "JP", list.region
+ assert_equal "eucJP", list.charset
+ assert_equal "mobile", list.modifier
+ assert_equal "ja_JP.eucJP@mobile", list.to_s
+ assert_equal Locale::Tag::Common.parse("ja_JP_mobile"), list.to_common
+ assert_equal Locale::Tag::Rfc.parse("ja-JP-mobile"), list.to_rfc
+ assert_equal Locale::Tag::Cldr.parse("ja_JP_mobile"), list.to_cldr
+ assert_equal Locale::Tag::Posix.parse("ja_JP.eucJP@mobile"), list.to_posix
+ assert_equal Locale::Tag::Posix.parse("en_US.iso8859-1"), list[1]
+ end
+
+ def test_taglist_rfc
+ list = Locale::TagList.new([Locale::Tag.parse("ja-Hira-JP-MOBILE-y-aaa-x-bbb"),
+ Locale::Tag.parse("en-US-mobile")])
+ assert_equal "ja", list.language
+ assert_equal "Hira", list.script
+ assert_equal "JP", list.region
+ assert_equal ["MOBILE"], list.variants
+ assert_equal ["y-aaa"], list.extensions
+ assert_equal "x-bbb", list.privateuse
+ end
+end
diff --git a/vendor/gems/locale-2.0.5/test/test_thread.rb b/vendor/gems/locale-2.0.5/test/test_thread.rb
new file mode 100644
index 000000000..43dba513e
--- /dev/null
+++ b/vendor/gems/locale-2.0.5/test/test_thread.rb
@@ -0,0 +1,37 @@
+require 'locale'
+require 'thread'
+require 'test/unit'
+
+class TestThread < Test::Unit::TestCase
+
+ def setup
+ Locale.init(:driver => :env)
+ @mutex = Mutex.new
+ end
+
+ def invoke_thread(tag, sleep_time)
+ Thread.start do
+ @mutex.synchronize {
+ ENV["LC_ALL"] = tag
+ Locale.current
+ }
+ (1..10).each do |v|
+# puts "#{tag}: locale = #{Locale.current}"
+ assert_equal tag, Locale.current.to_posix.to_s
+ print "."
+ $stdout.flush
+ sleep sleep_time
+ end
+ Locale.clear # Clear this thread only.
+ end
+ end
+
+ def test_thread
+ th1 = invoke_thread("ja_JP.eucJP", 0.3)
+ th2 = invoke_thread("zh_CN.UTF-8", 0.2)
+ th3 = invoke_thread("en", 0.1)
+ th1.join
+ th2.join
+ th3.join
+ end
+end