Locale.getDefault()が期待した値を返さない?

6,386 views
Skip to first unread message

トムキャット

unread,
Mar 14, 2013, 10:11:34 AM3/14/13
to android-g...@googlegroups.com
トムキャットです。

僕のアプリのユーザーからの問題報告で、端末の言語設定は日本語なのに、ある時から突然アプリが表示する説明文が英語になった、というのがありました。説明文が英語になるというのは、次のコードが期待した動作をしないために、英語版のhtmlファイルを開くからだと考えています。(それ以外に理由を思いつきません。)

            Locale locale = Locale.getDefault();
            String    url;
            if(locale.equals(Locale.JAPAN))
            {
                url = "file:///android_asset/register-account-jp.html";
            }
            else
            {
                url = "file:///android_asset/register-account-en.html";
            }

そのアプリはデフォルトのstringsリソースは英語、values-jaには日本語のリソースを入れてあり、当然日本語が表示されています。ところが、上記コードはtrueのブロックを実行していません。
端末を再起動しても変わらず、再インストールしても変わらずだそうです。

OSがvalues-jaを参照するのに上記コードがfalseブロックを実行するというのは一体どういう状況なのでしょうか。
心当たりのある方、よろしくお願いします。

Hirokazu Fukami

unread,
Mar 14, 2013, 10:14:33 AM3/14/13
to android-g...@googlegroups.com
こんばんはfkmです。

問題報告されている方に、Locale.getDefault()の値をTextViewに表示するだけのapkをお渡しして、
どう表示されているかを教えてもらう という手はどうでしょうか?

2013/3/14 トムキャット <daily...@gmail.com>:
> --
> このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
> このグループから退会し、メールの受信を停止するには、android-group-j...@googlegroups.com
> にメールを送信します。
> このグループに投稿するには、android-g...@googlegroups.com にメールを送信してください。
> http://groups.google.com/group/android-group-japan?hl=ja
> からこのグループにアクセスしてください。
> その他のオプションについては、https://groups.google.com/groups/opt_out にアクセスしてください。
>
>



--
-------------------------------------------------------------
深見 浩和(Hirokazu Fukami)

URI:http://www.fkmsoft.jp
email: f...@fkmsoft.jp

Makoto Yamazaki

unread,
Mar 14, 2013, 10:23:26 AM3/14/13
to android-g...@googlegroups.com
zaki です。

http://developer.android.com/guide/topics/resources/localization.html
の Use the Android Context object for manual locale lookup に書かれていますが、
コードから Locale を取得する場合は
context.getResources().getConfiguration().locale
を使うのが正しい方法です。

記憶では Locale.getDefault() は固定値を返すように変更されました。


2013/3/14 トムキャット <daily...@gmail.com>:
> --
> このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
> このグループから退会し、メールの受信を停止するには、android-group-j...@googlegroups.com
> にメールを送信します。
> このグループに投稿するには、android-g...@googlegroups.com にメールを送信してください。
> http://groups.google.com/group/android-group-japan?hl=ja
> からこのグループにアクセスしてください。
> その他のオプションについては、https://groups.google.com/groups/opt_out にアクセスしてください。
>
>



--
YAMAZAKI Makoto

トムキャット

unread,
Mar 14, 2013, 11:40:10 PM3/14/13
to android-g...@googlegroups.com
fkmさん、zakiさん、コメントありがとうございます。

この件を確認するにはその方の端末で情報を収集できるアプリを実行するしかないので、
そうします。

zakiさんが示された方法は、ここで質問する前のGoogle検索結果で出てきていましたので、
ロケールの判定方法が2つあるというのは気付いていました。が、多く目にする(僕も使っている)
方法がダメだよ、という記述は見つかりませんでした。

>記憶では Locale.getDefault() は固定値を返すように変更されました。

これが本当だとすると血の気が失せますが、僕には見つけられませんでした。

トムキャット

2013年3月14日木曜日 23時23分26秒 UTC+9 zaki:
zaki です。

http://developer.android.com/guide/topics/resources/localization.html
の Use the Android Context object for manual locale lookup に書かれていますが、
コードから Locale を取得する場合は
context.getResources().getConfiguration().locale
を使うのが正しい方法です。

記憶では Locale.getDefault() は固定値を返すように変更されました。


2013/3/14 トムキャット <daily...@gmail.com>:
> トムキャットです。
>
> 僕のアプリのユーザーからの問題報告で、端末の言語設定は日本語なのに、ある時から突然アプリが表示する説明文が英語になった、というのがありました。説明文が英語になるというのは、次のコードが期待した動作をしないために、英語版のhtmlファイルを開くからだと考えています。(それ以外に理由を思いつきません。)
>
>             Locale locale = Locale.getDefault();
>             String    url;
>             if(locale.equals(Locale.JAPAN))
>             {
>                 url = "file:///android_asset/register-account-jp.html";
>             }
>             else
>             {
>                 url = "file:///android_asset/register-account-en.html";
>             }
>
> そのアプリはデフォルトのstringsリソースは英語、values-jaには日本語のリソースを入れてあり、当然日本語が表示されています。ところが、上記コードはtrueのブロックを実行していません。
> 端末を再起動しても変わらず、再インストールしても変わらずだそうです。
>
> OSがvalues-jaを参照するのに上記コードがfalseブロックを実行するというのは一体どういう状況なのでしょうか。
> 心当たりのある方、よろしくお願いします。
>
> --
> このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
> このグループから退会し、メールの受信を停止するには、android-group-japan+unsubscribe@googlegroups.com
> にメールを送信します。
> このグループに投稿するには、android-group-ja...@googlegroups.com にメールを送信してください。

長田努

unread,
Mar 15, 2013, 12:20:43 AM3/15/13
to android-g...@googlegroups.com
トムキャットさん、こんにちは。長田と申します。

解決策の提示という訳ではないので恐縮なのですが、現象のヒントになりそうな記述を見掛けましたのでお伝えさせて頂きます。

http://developer.android.com/reference/java/util/Locale.html

上記URLの【Be wary of the default locale】の節にあります記述ですが、下記あたりが共通事項にあたりそうな文面です。

「The default locale is not appropriate for machine-readable output.
The best choice there is usually Locale.US - this locale is guaranteed
to be available on all devices, and the fact that it has no surprising
special cases and is frequently used (especially for computer-computer
communication) means that it tends to be the most efficient choice
too.

A common mistake is to implicitly use the default locale when
producing output meant to be machine-readable. This tends to work on
the developer's test devices (especially because so many developers
use en_US), but fails when run on a device whose user is in a more
complex locale.」

default localは適切ではありませんと言う記述があり、デバッグ環境や実機でも時折default値がen_USとして返って来る旨の説明になっているかと思います。
端末によっては、定義文字列がlowercaseとuppercaseにバラつきがある可能性があるので、どちらかに統一して比較する…という処理をなさっている方もいらっしゃるようですので、必ずしもen_USになっているかは定かではありませんが、原因分析のヒントとしてお心に留めて頂けたらと存じます。

的を射ていない内容でしたら大変失礼いたしました。

長田

2013年3月15日 12:40 トムキャット <daily...@gmail.com>:
>> > このグループから退会し、メールの受信を停止するには、android-group-j...@googlegroups.com
>> > にメールを送信します。
>> > このグループに投稿するには、android-g...@googlegroups.com にメールを送信してください。
>> > http://groups.google.com/group/android-group-japan?hl=ja
>> > からこのグループにアクセスしてください。
>> > その他のオプションについては、https://groups.google.com/groups/opt_out にアクセスしてください。
>> >
>> >
>>
>>
>>
>> --
>> YAMAZAKI Makoto
>
> --
> このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
> このグループから退会し、メールの受信を停止するには、android-group-j...@googlegroups.com
> にメールを送信します。
> このグループに投稿するには、android-g...@googlegroups.com にメールを送信してください。

Makoto Yamazaki

unread,
Mar 15, 2013, 2:02:28 AM3/15/13
to android-g...@googlegroups.com
zaki です。

>>記憶では Locale.getDefault() は固定値を返すように変更されました。

これは記憶違いだったかもしれません。
今試してみたところ、 4.2.1 の端末でもシステムの設定が日本語なら Locale.getDefault() は
ja_JP になっていました。

2013/3/15 トムキャット <daily...@gmail.com>:
>> > このグループから退会し、メールの受信を停止するには、android-group-j...@googlegroups.com
>> > にメールを送信します。
>> > このグループに投稿するには、android-g...@googlegroups.com にメールを送信してください。
>> > http://groups.google.com/group/android-group-japan?hl=ja
>> > からこのグループにアクセスしてください。
>> > その他のオプションについては、https://groups.google.com/groups/opt_out にアクセスしてください。
>> >
>> >
>>
>>
>>
>> --
>> YAMAZAKI Makoto
>
> --
> このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
> このグループから退会し、メールの受信を停止するには、android-group-j...@googlegroups.com
> にメールを送信します。
> このグループに投稿するには、android-g...@googlegroups.com にメールを送信してください。

トムキャット

unread,
Mar 15, 2013, 10:47:29 AM3/15/13
to android-g...@googlegroups.com
トムキャットです。

問題を探るためのアプリを作りました。

躊躇しましたが、問題を起こしている方に野良アプリをインストールしてもらうのは難しいと思い、Google Playで公開しました。

https://play.google.com/store/apps/details?id=net.DailyTimer.activitymonitor#?t=W251bGwsMSwxLDIxMiwibmV0LkRhaWx5VGltZXIuYWN0aXZpdHltb25pdG9yIl0.

用が済んだら消します。その方にはインストールと報告を依頼中です。



2013年3月15日金曜日 15時02分28秒 UTC+9 zaki:
>> > このグループから退会し、メールの受信を停止するには、android-group-japan+unsubscribe@googlegroups.com
>> > にメールを送信します。
>> > このグループに投稿するには、android-group-ja...@googlegroups.com にメールを送信してください。
>> > http://groups.google.com/group/android-group-japan?hl=ja
>> > からこのグループにアクセスしてください。
>> > その他のオプションについては、https://groups.google.com/groups/opt_out にアクセスしてください。
>> >
>> >
>>
>>
>>
>> --
>> YAMAZAKI Makoto
>
> --
> このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
> このグループから退会し、メールの受信を停止するには、android-group-japan+unsubscribe@googlegroups.com
> にメールを送信します。
> このグループに投稿するには、android-group-ja...@googlegroups.com にメールを送信してください。

トムキャット

unread,
Mar 15, 2013, 11:33:19 AM3/15/13
to android-g...@googlegroups.com
トムキャットです。

結果がもらえました。

Locale.getDefault().toString()=ja
Locale.JAPAN.toString()=ja_JP
Locale.getDefault().equals(Locale.JAPAN)=false
context.getResources().getConfiguration().locale.toString()=ja
context.getResources().getConfiguration().locale.equals(Locale.JAPAN)=false

どうしてこんなことになるのでしょうか。端末はGALAXY sⅡ LTEだそうです。
これだとその端末上ではロケールが日本かどうか判定しているアプリは全滅だと思います。

困りました。

2013年3月15日金曜日 23時47分29秒 UTC+9 トムキャット:

ssももんが

unread,
Mar 15, 2013, 12:31:47 PM3/15/13
to android-g...@googlegroups.com
ももんがです。
ちょっと気になったので、微力ながら調べてみました。

他人のサイトの引用になってしまいますが、Locale.getDefault()の返す値が異なることがあるようです。


原因がHWなのかROMなのか分かりませんが、もかしたらカスタムROMを使っているのでは?
Galasy S2 LTEが対象かはっきり分かりませんが、3月上旬にCyanogenModのバージョンアップもあったようです。



また、getDefault()ではなく、getDisplayLanguage()を使えば対応できる気もします。
(そういう問題ではないとは思いますが)



2013年3月16日 0:33 トムキャット <daily...@gmail.com>:
このグループから退会し、メールの受信を停止するには、android-group-j...@googlegroups.com にメールを送信します。
このグループに投稿するには、android-g...@googlegroups.com にメールを送信してください。

Makoto Yamazaki

unread,
Mar 15, 2013, 12:46:35 PM3/15/13
to android-g...@googlegroups.com
zaki です。

toString() して ja になるということは Locale.JAPAN じゃなくて Locale.JAPANESE の方ですね。
なんででしょうね...

2013/3/16 トムキャット <daily...@gmail.com>:
>>> >> > このグループから退会し、メールの受信を停止するには、android-group-j...@googlegroups.com
>>> >> > にメールを送信します。
>>> >> > このグループに投稿するには、android-g...@googlegroups.com にメールを送信してください。
>>> >> > http://groups.google.com/group/android-group-japan?hl=ja
>>> >> > からこのグループにアクセスしてください。
>>> >> > その他のオプションについては、https://groups.google.com/groups/opt_out にアクセスしてください。
>>> >> >
>>> >> >
>>> >>
>>> >>
>>> >>
>>> >> --
>>> >> YAMAZAKI Makoto
>>> >
>>> > --
>>> > このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
>>> >
>>> > このグループから退会し、メールの受信を停止するには、android-group-j...@googlegroups.com
>>> > にメールを送信します。
>>> > このグループに投稿するには、android-g...@googlegroups.com にメールを送信してください。
>>> > http://groups.google.com/group/android-group-japan?hl=ja
>>> > からこのグループにアクセスしてください。
>>> > その他のオプションについては、https://groups.google.com/groups/opt_out にアクセスしてください。
>>> >
>>> >
>>>
>>>
>>>
>>> --
>>> YAMAZAKI Makoto
>
> --
> このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
> このグループから退会し、メールの受信を停止するには、android-group-j...@googlegroups.com
> にメールを送信します。
> このグループに投稿するには、android-g...@googlegroups.com にメールを送信してください。

田代透

unread,
Mar 15, 2013, 12:59:12 PM3/15/13
to android-g...@googlegroups.com
localeの文字列の
xx_yy が xxが大分類 yyが小分類と考えれば、全体一致で一致しなければ頭2文字で比較して一致するか、と確認することも出来るかと思います。

が、
values-ja の中に日本語向けのファイルパスを格納し
values   の中にデフォルト言語向けのファイルパスを格納して
どれを使うかはシステムにお任せすればよいのじゃないでしょうか。



2013年3月16日 1:46 Makoto Yamazaki <makot...@gmail.com>:



--
--
Toru Tashiro
toru...@gmail.com

トムキャット

unread,
Mar 15, 2013, 7:13:31 PM3/15/13
to android-g...@googlegroups.com
トムキャットです。

ももんがさん、その方はカスタムROMユーザーではないです。2月に突然起こり始めたそうです。

Toruさん、ファイルパスの選択をシステムに任せるのはいい案ですね。でも対象のファイルが40個以上あり、
今から修正するのは大変なので、jaかja_JPなら日本語だと判断するようにします。

みなさん、ありがとうございました。


2013年3月16日土曜日 1時59分12秒 UTC+9 Toru:
>>> >> > このグループから退会し、メールの受信を停止するには、android-group-japan+unsubscribe@googlegroups.com
>>> >> > にメールを送信します。
>>> >> > このグループに投稿するには、android-group-ja...@googlegroups.com にメールを送信してください。

>>> >> > http://groups.google.com/group/android-group-japan?hl=ja
>>> >> > からこのグループにアクセスしてください。
>>> >> > その他のオプションについては、https://groups.google.com/groups/opt_out にアクセスしてください。
>>> >> >
>>> >> >
>>> >>
>>> >>
>>> >>
>>> >> --
>>> >> YAMAZAKI Makoto
>>> >
>>> > --
>>> > このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
>>> >
>>> > このグループから退会し、メールの受信を停止するには、android-group-japan+unsubscribe@googlegroups.com
>>> > にメールを送信します。
>>> > このグループに投稿するには、android-group-ja...@googlegroups.com にメールを送信してください。

>>> > http://groups.google.com/group/android-group-japan?hl=ja
>>> > からこのグループにアクセスしてください。
>>> > その他のオプションについては、https://groups.google.com/groups/opt_out にアクセスしてください。
>>> >
>>> >
>>>
>>>
>>>
>>> --
>>> YAMAZAKI Makoto
>
> --
> このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
> このグループから退会し、メールの受信を停止するには、android-group-japan+unsubscribe@googlegroups.com
> にメールを送信します。
> このグループに投稿するには、android-group-ja...@googlegroups.com にメールを送信してください。

> http://groups.google.com/group/android-group-japan?hl=ja
> からこのグループにアクセスしてください。
> その他のオプションについては、https://groups.google.com/groups/opt_out にアクセスしてください。
>
>



--
YAMAZAKI Makoto

--
このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
このグループから退会し、メールの受信を停止するには、android-group-japan+unsubscribe@googlegroups.com にメールを送信します。
このグループに投稿するには、android-group-ja...@googlegroups.com にメールを送信してください。

http://groups.google.com/group/android-group-japan?hl=ja からこのグループにアクセスしてください。
その他のオプションについては、https://groups.google.com/groups/opt_out にアクセスしてください。


田代透

unread,
Mar 15, 2013, 10:56:54 PM3/15/13
to android-g...@googlegroups.com
今回はかなり大変とのことなので、jaでの比較して対応するとしても、
将来的に、日本語英語以外の対応とかも考えた場合はプログラムのコードを増やすこと無く
リソースを増やすだけで多言語に対応できるので、次回からは考えてみると良いのじゃないかなと思います。


2013年3月16日 8:13 トムキャット <daily...@gmail.com>:
このグループから退会し、メールの受信を停止するには、android-group-j...@googlegroups.com にメールを送信します。
このグループに投稿するには、android-g...@googlegroups.com にメールを送信してください。

http://groups.google.com/group/android-group-japan?hl=ja からこのグループにアクセスしてください。
その他のオプションについては、https://groups.google.com/groups/opt_out にアクセスしてください。
 
 
Reply all
Reply to author
Forward
0 new messages