我正在创建一个可以在所有3个移动平台上运行的HTML5移动应用程序(Android,iOS a,d Windows Mobile8)。我正在使用javascript进行本地化(https://github.com/eligrey/l10n.js/#readme)。
这款应用在浏览器上运行良好。但是当我在移动模拟器上部署它时,本地化就不起作用了。
我认为问题在于javascript从浏览器获取语言信息,但在移动设备中我们使用PhoneGap运行HTML5。
有没有办法在PhoeGap中使用javascript启用本地化?
发布于 2013-02-14 16:42:18
我刚刚为每个平台创建了一个定制的PhoneGap插件,只返回用户的当前语言环境,从而解决了类似的问题。
例如,在Android上,插件只检查:
var message = Locale.getDefault().getLanguage();
然后在Javascript端,当你拿回那个语言名称时,例如。JSON,您将使用它以该语言命名的en
对象。JSON对象的示例如下所示:
MyApp.Language = en: {
'Player' : 'Player',
'Players' : 'Players',
'Not Set' : 'Not Set'
},
fi: {
'Player' : 'Pelaaja',
'Players' : 'Pelaajat',
'Not Set' : 'Ei määritetty'
}
Android的插件很简单:
JS文件
window.localizeMe = {
getDefaultLocale: function( callback ) {
cordova.exec(
callback,
function(err) {
callback( 'Error: ' + err.code );
},
"LocalizeMe",
"getDefaultLocale",
[]);
}
}
Java文件
public class LocalizeMe extends CordovaPlugin {
@Override
public boolean execute(String action, JSONArray args, CallbackContext callbackContext) throws JSONException {
if (action.equals("getDefaultLocale")) {
String message = Locale.getDefault().getLanguage();
this.getDefaultLocale(message, callbackContext);
return true;
}
return false;
}
private void getDefaultLocale(String message, CallbackContext callbackContext) {
if (message != null && message.length() > 0) {
callbackContext.success(message);
} else {
callbackContext.error("Expected one non-empty string argument.");
}
}
}
最后,在主JS文件中设置应用程序的语言:
window.localizeMe.getDefaultLocale( function( result ) {
if ( result != null && result.length > 0 ) {
if ( result.toLowerCase().indexOf( 'fi' ) !== -1 ) {
MyApp.Lang = MyApp.Language.fi;
} else {
MyApp.Lang = MyApp.Language.en;
}
}
});
发布于 2013-02-14 16:33:49
您可以编写自己的JavaScript来获取本地化语言。这与我在这里的其他地方写的回复完全相同。
一般来说,JavaScript window.navigator.language
通常适用于iOS和较新的安卓系统,但安卓的早期版本将其硬编码为en
。
对于较老的Android,我建议从UserAgent字符串中提取语言参数(是的,嗅探!)
if (navigator && navigator.userAgent && (androidLang = navigator.userAgent.match(/android.*\W(\w\w)-(\w\w)\W/i))) {
lang = androidLang[1];
}
在这里,lang可能还包含国家/地区代码(例如'en-IE'),因此您可能还需要删除该代码:
if (lang.indexOf('-') != -1) lang = lang.substring(0, lang.indexOf('-'));
这是我在最近的一个应用程序中使用的,使用的是HTML5和PhoneGap,它工作得很好。
发布于 2013-04-15 05:16:56
本地化有一个常见的陷阱,也许这就是你的问题:
许多设备以de_DE
、en_GB
等形式报告区域设置。-注意下划线。
l10n (或者在我的例子中是globalize.js)使用连字符来分隔语言和国家-因此找不到匹配的区域性,并使用默认的后备。
在你的应用程序中添加一个console.log
来转储你正在获取的区域设置字符串,然后转到控制台并与adb logcat
一起检查在你的设备上是否存在这种情况。然后只需修改字符串以允许匹配(例如locale.value.replace('_', '-')
)
https://stackoverflow.com/questions/14870587
复制相似问题