質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.12%

日本語以外に対応した表示の仕方「ロケール」

解決済

回答 4

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,720

suu

score 11

import java.util.Locale;

public class LocaleDisplay {
    public static void main(String[] args) {

        // 現在のロケール取得 
        Locale local = Locale.getDefault();
        // jaを得る
        String language = local.getLanguage();

        if( "ja".equals(language) ){
            System.out.println("こんにちは");
        }else{
            System.out.println("hello");
        }

    }
}
使うPC環境によって言語が違いますが、例えば英語表示させたい場合
上のを思いついたのですが、表示する言葉が多い場合、if文が多くなるので
下の配列にデータベースみたいに入れてみました
import java.util.Locale;

public class LocaleDisplay_Allay {
    public static void main(String[] args) {

        Locale local = Locale.getDefault();
        String language = local.getLanguage();

        String[] asa = {"おはよう","morning"};
        String[] hiru = {"こんにちは","hello"};
        String[] ban = {"さよなら","bye"};
        int a;

        if( "ja".equals(language) ){
            a = 0;
        }else{
            a = 1;
        }

        System.out.println(asa[a]);
        System.out.println(hiru[a]);
        System.out.println(ban[a]);

    }
}

これらはよく使われる記述なのか? 他にやり方があるのか知りたいです。


今はandroidアプリが作りたくてjavaを勉強してます
android studioにはエディタで弄れるローカライズ方法が備わっていると聞いたのですが
javaではどうするのだろうと気になったので質問しました


>>>>>>>>
みなさんの言っていたPropertiesで書いてみました
try分の例外の書き方がわからなかったのでテキトウですがなんとか表示されました
あと文字化けに苦労しましたがnative2asciiで出来ました
自分の参考にコードを載せときます

jp.properties
asa=おはよう
hiru=こんにちは
ban=さよなら

en.properties
asa = morning
hiru = hello
ban = bye


import java.util.Locale;
import java.util.Properties;
import java.io.FileInputStream;

public class LocaleDisplay_Properties {
    public static void main(String[] args) {

        Locale local = Locale.getDefault();
        String language = local.getLanguage();

        String country;

        if( "ja".equals(language) ){
            country = "jp.properties";
        }else{
            country = "english.properties";
        }

        Properties properties = new Properties();

        try {
            FileInputStream myConfFileIn = new FileInputStream(country);
            properties.load(myConfFileIn);
        } catch (Exception ex) {
            System.out.println("error");
        }

        System.out.println(properties.getProperty("asa"));
        System.out.println(properties.getProperty("hiru"));
        System.out.println(properties.getProperty("ban"));

    }
}
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 4

+1

考え方はあっています。
同じ変数に、日本語、英語、フランス語…と対応する言葉を当てはめていきます。

今回は配列に入れていますが、jiu3bao3さんがおっしゃるようにpropertiesというファイルで対応するのがメインになります。
propertyファイルごとに、日本語、英語、と作っていくイメージです。

英語圏であれば、英語のpropertyファイルを読み込み、日本語圏であれば日本語のpropertyファイルを読み込むという手法で対応しているのです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/11/19 00:22 編集

    propertiesファイルで作ってみました。ありがとうございます

    キャンセル

+1

既に他の回答者さま方が書かれていますように、プロパティーファイルに書いておくことで、言語ごとにメッセージを切り替えることができます。
java.util.ResourceBundleというクラスを使います。詳しくは、参考リンクのページをご覧ください。

少し面倒なのが、マルチバイト文字(日本語の全角文字など)を格納する際に、native2asciiというコマンドを通して変換しなければならないという点です。

EclipseなどのIDEではプラグインによってその手間を省くことができます。



余談:ResourceBundleはいろいろ使い勝手が悪いので、私は独自のライブラリー(まだ未完成ですが)を使っています。


参考リンク:

ResourceBundle - NAVER まとめ
http://matome.naver.jp/odai/2142034276402703301


※少し古い記事↓ですが...

プログラマーの常識をJavaで身につける(9):コードから情報を追い出せ!プロパティファイルの常識 (3/3) - @IT
http://www.atmarkit.co.jp/ait/articles/0711/29/news143_3.html

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/11/19 00:35

    文字化けに苦労しましたがnative2asciiで解決しました。ありがとうございます

    キャンセル

+1

java で用意されている property については、他の回答の通りです。

私はjava で用意されている property を使わない場合についてコメントをしたいと思います。

質問文のコードでは、asa, hiru, ban をそれぞれ配列にしています。

大きいプログラムでは、文字列の種類数が大きくなります。
ひとつひとつに配列名をわりあてるのは大変です。
そこで、次のよう対処する案があります。

Messages として Hash を用意し、
Mesages["ja"]['asa"] とすると "おはよう"
Mesages["en"]['asa"] とすると "moning"

Messages["ja"]["hiru"] とすると "こんにちは"
Messages["en"]["hiru"] とすると "hello"

Messages["ja"]["ban"] とすると "さよなら"
Messages["en"]["ban"] とすると "bye"
となるようにするのです。

Messages の値設定は
  ソースコード中で文字列を直接 書いて組み立てていく
という方法がまずは頭に浮かびます。
でも Database に
  "ja", "asa", ”おはよう”
のような行を登録して、プログラム起動時にデータベースから値を持ってくる
という方法もあるとおもいます。

java のproperty の方法は,
Database でなく、ロケール毎に分割させたテキストファイル
から読み込むようにしているわけです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/11/19 00:34

    こんなやり方もあるのですね。参考にさせてもらいます

    キャンセル

checkベストアンサー

0

私はロケール別にpropertyファイルを作成して、そこからメッセージを取り出すようにしています。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/11/19 00:36

    ありがとうございました

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.12%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる