0
0

Java ローカライズ

Last updated at Posted at 2024-07-21

Java 11 Gold 取得に向けた学習記録

ローカライズとは

localize

アプリケーションを異なる国、地域に対応させるプロセスをローカライズ、または i18n と言う。

i18n は、internationalization の in の間の文字数が 18 文字であることに由来する用語。

ローカライズの対象には以下のものが含まれる。

  • 言語
  • 日付の表示形式
  • 時刻の表示形式
  • 暦の表示形式
  • 通貨の表示形式

Locale

locale = (物語の)舞台、現場、場所

ソフトウェアにおける言語、国、地域などの設定のことをロケール(locale)と呼ぶ。(最初 local だと思っていた。。。locale ≠ local)

ロケールは単に「国」のことではない。例えば英語とフランス語が公用語とされているカナダのような国においては、「カナダ」がロケールに相当するのではなく、「カナダで英語を使用する地域」と「カナダでフランス語を使用する地域」がロケールに相当する。

Javaではjava.util.Localeクラスがロケールを表現する。

ロケールは主に以下の要素で構成される。これらはLocaleクラスのフィールドでもあり、コンストラクタの引数で指定することができる。

フィールド名 説明
language 言語 enjade(ドイツ語)、zh(中国語)、fr(フランス語)
script 文字体系 Latn(ラテン文字)、Cyrl(キリル文字)、Hans(簡体字)、Hant(繁体字)
contry / region 国、地域
contryregion は同じものを参照している
USJPDE(ドイツ)、FR(フランス)
variant ロケールのバリエーション
(ロケール以外のバリエーションに使用されることもある)
優先順に _ で繋いで複数指定することができる
WIN(Windows)、MAC(Mac)、POSIX
extension 拡張

deはドイツ語で「ドイツの」「ドイツ語」を意味する deutsch が語源。

zhは中国語で「中文」を意味する Zhōngwén が語源。「漢語」は Hànyǔ。

POSIX とは、IEEE が管理する Portable Operation System Interface と言う規格を指す。異なるOS間での互換性を確保するための仕様を定義したもの。

異なるOSにシステムを移植できるように、ファイル操作、プロセス・スレッド管理、入出力操作など標準的な機能を提供するためのAPIなどがPOSIXによって定義されている。

Locale クラスの variant として POSIX を指定する場合、そのロケール設定がPOSIXに準拠していることを表す。

Localeの取得

Localeオブジェクトの取得方法はいくつかある。

Locale.getDefault()

Javaプログラムが実行されている環境のロケールのデフォルト値を取得することができる。

Locale.getDefault()
import java.util.Locale;

Locale defaultLocale = Locale.getDefault();

コンストラクタ

コンストラクタを利用すると、各引数を細かく指定してLocaleオグジェクトを作成することができる。

Locale(String language)
Locale(String language, String country)
Locale(String language, String country, String variant)

コンストラクタ
import java.util.Locale;

Locale locale = new Locale("en", "US", "POSIX");

コンストラクタでは引数が正しいかどうかの確認が行われない。

ロケール定数

コンストラクタを利用した方法では、引数の誤りに気が付かないことがある。そこで事前に定義された定数を利用することで、誤りを防ぐことができる。

Locale. language country
CANADA en CA
CANADA_FRENCH fr CA
JAPAN ja JP
JAPANESE - JP
UK en GB
US en US
ロケール定数
import java.util.Locale;

Locale locale = Locale.JAPAN;

Locale.Builder

Builderパターンを利用する方法。

Locale.Builder
import java.util.Locale;

Locale locale = new Locale.Builder()
        .setLanguage("fr")
        .setRegion("CA")
        .setVariant("POSIX")
        .setScript("Latn")
        .build();

Locale.forLanguageTag(ファクトリメソッド)

Localeにで定義されたファクトリメソッドを使用して、Localeオブジェクトを取得することもできる。

Locale.forLanguageTag(String languageTag)

languageTag 文字列は、ISO や IETF によって策定された仕様で、通常 languagescriptcountry または regionvariant で構成される。IETF によって作成された BCP 47(Best Current Practice 47)という文書で詳細な仕様が策定されている。

Locale.forLanguageTag(ファクトリメソッド)
import java.util.Locale;

Locale locale = Locale.forLanguageTag("ja-JP");

HttpServletRequest

Webアプリではjavax.servlet.http.HttpServletRequestインターフェースのgetLocale()メソッドを使用することでロケールを取得することができる。

import java.util.Locale;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class MyServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        Locale locale = request.getLocale();
    }
}

参考

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0