Coronaでは素直に言語環境を取得するメソッドが無いので(多分。あったら教えてください)、それを無理やり取得する方法です。
英語版とか日本語版とかでテキストやアセットが異なり、かつ別々にバイナリ準備するのが面倒な場合はこんな感じで実装すると便利かと。
拙作のVRITRAでも同じような手法で振り分けを行っています。
main.lua
local lang = "checking...";
local lang_text = display.newText( lang , display.contentWidth/2 , display.contentHeight/2 );
local function getLangListener( event )
local shouldLoad = true;
local url = event.url;
if 1 == string.find( url, "lang:" ) then
lang = url:sub(6, 7);
lang_text.text = "この環境の言語は「"..lang.."」ですかね?";
shouldLoad = false;
end
return shouldLoad;
end
local options = { hasBackground=false, baseUrl=system.ResourceDirectory, urlRequest=getLangListener };
native.showWebPopup( 0,0,0,0, "get_language.html" , options );
get_language.html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>get_language</title>
</head>
<body onLoad="document.getElementById('getlangform').submit();">
<script language="JavaScript">
function getLanguage() {
try{
return ( navigator.browserLanguage || navigator.language || navigator.userLanguage ).substr(0,2);
}catch(e){
return "en"; //デフォルトの言語入れておく
}
}
document.write('<form action="lang:'+getLanguage()+'" id="getlangform" ></form>');
</script>
</body>
</html>
処理の流れとしては
言語判定用のhtmlをwebPopupで起動->jsで言語判定->main側にレスポンス->webPopupを自動クローズ
という感じになります。
ちょっとだけトリッキーですが、main.luaの変数lang
に"ja"
やら"en"
やらが格納されるはずです。
実際には、様々な言語が入ってくるのが想定されるので**"ja"以外が格納されたら全て"en"**扱いにする。だとか
webPopupの起動に時間が掛かったりするのでちゃんとevent張るとか、裏でこっそり行うとか
する必要があるかもしれません。
そういえば、webPopup内の関数をCorona側から実行する方法ってあるんでしょうかね?
もしあれば、jsに一部処理を委ねることも出来そうなのですけど…。
(単にsocket.io.jsが使いたいだけではある)