test language

This commit is contained in:
StageGuard
2020-12-22 17:16:05 +08:00
parent 82e271415a
commit d56b56e2f4

View File

@@ -521,7 +521,38 @@ config = {
res_download_failed: "以下资源下载失败:{0}",
res_download_successful: "资源下载完成",
res_error_while_downloading: "资源下载时发生了问题: {0}",
res_use_language: "使用语言: {0}",
res_language_download_failed: "语言下载失败:{0}",
res_language_dialog_tip: "找不到你的语言?欢迎贡献翻译:<br><a href=>https://github.com/StageGuard/SkyAutoPlayerScript</a>",
res_language_failed_fetch_online_list: "无法获取在线语言列表",
res_language_dialog_title: "选择语言"
},
},
initLocalLang: function(listener) {
var langPath = android.os.Environment.getExternalStorageDirectory() + "/Documents/SkyAutoPlayer/lang/";
files.ensureDir(langPath);
var langs = files.listDir(langPath)
for(var i in langs) {
var code = files.getNameWithoutExtension(langs[i]);
if(code == this.values.lang) {
try {
var content = JSON.parse(files.read(langPath + langs[i]));
this.languages[content.code] = content.content;
listener(String.format(this.languages[content.code].res_use_language, content.name));
return;
} catch (e) {
listener(new Error("加载 " + code + " 语言时出错:" + e))
}
}
}
if(this.values.lang != "zh_CN") {
listener("语言 " + this.values.lang + "未找到,使用缺省语言:简体中文.");
} else {
listener("使用语言:简体中文.");
}
},
init: function() {
@@ -640,31 +671,36 @@ config = {
}
},
//jsdelivr cdn需要指定repo版本, gitee和github则不用
//fetch顺序为 gitee raw content → jsdelivr cdn → github raw content
fetchRepoFile: function(path, gitVersion, successCbk, failCbk) {
//就用最蠢的if来判断吧
var resp = http.get(encodeURI("https://gitee.com/stageguard/SkyAutoPlayerScript/raw/master/" + path));
if(resp.statusCode >= 200 && resp.statusCode < 300) {
successCbk(resp.body);
return;
} else {
var errorCollector = resp.statusCode + ": " + resp.statusMessage + "\n";
resp = http.get(encodeURI("https://cdn.jsdelivr.net/gh/StageGuard/SkyAutoPlayerScript" + (gitVersion == null ? "" : ("@" + gitVersion)) + "/" + path));
try {
var resp = http.get(encodeURI("https://gitee.com/stageguard/SkyAutoPlayerScript/raw/master/" + path));
if(resp.statusCode >= 200 && resp.statusCode < 300) {
successCbk(resp.body);
return;
} else {
errorCollector += resp.statusCode + ": " + resp.statusMessage + "\n";
resp = http.get(encodeURI("https://raw.githubusercontent.com/StageGuard/SkyAutoPlayerScript/master/" + path));
var errorCollector = resp.statusCode + ": " + resp.statusMessage + "\n";
resp = http.get(encodeURI("https://cdn.jsdelivr.net/gh/StageGuard/SkyAutoPlayerScript" + (gitVersion == null ? "" : ("@" + gitVersion)) + "/" + path));
if(resp.statusCode >= 200 && resp.statusCode < 300) {
successCbk(resp.body);
return;
} else {
errorCollector += resp.statusCode + ": " + resp.statusMessage + "\n";
if(failCbk != null) failCbk(errorCollector);
resp = http.get(encodeURI("https://raw.githubusercontent.com/StageGuard/SkyAutoPlayerScript/master/" + path));
if(resp.statusCode >= 200 && resp.statusCode < 300) {
successCbk(resp.body);
return;
} else {
errorCollector += resp.statusCode + ": " + resp.statusMessage + "\n";
if(failCbk != null) failCbk(errorCollector);
}
}
}
} catch(e) {
if(failCbk != null) failCbk(e);
}
},
@@ -806,6 +842,13 @@ RhinoListAdapter = (function() {
return this.src;
}
},
getView: function(i) {
if (typeof(i) == "number") {
return this.views[i];
} else {
return this.views;
}
},
insert: function(e, i, respawn) {
this.src.splice(i, 0, e);
if (respawn) {
@@ -953,7 +996,7 @@ gui = {
frame.setOnTouchListener(new android.view.View.OnTouchListener({
onTouch: function touch(v, e) {
try {
if (e.getAction() == e.ACTION_DOWN && canExit) {
if (e.getAction() == e.ACTION_UP && canExit) {
frame.setEnabled(false);
frame.setClickable(false);
gui.utils.value_animation("Float", 1.0, 0, 75, new android.view.animation.DecelerateInterpolator(), function(anim) {
@@ -1200,9 +1243,9 @@ gui = {
if (callback) {
callback(pos);
gui.utils.value_animation("Float", 1, 0, 75, new android.view.animation.DecelerateInterpolator(), function(anim) {
dialog.setAlpha(anim.getAnimatedValue());
if(anim.getAnimatedValue() == 1) gui.winMgr.removeView(dialog);
});
dialog.setAlpha(anim.getAnimatedValue());
if(anim.getAnimatedValue() == 1) gui.winMgr.removeView(dialog);
});
}
return true;
} catch (e) {
@@ -2167,6 +2210,187 @@ gui = {
},
},
languageDialog: function() {
var baseLayout = new android.widget.LinearLayout(ctx);
baseLayout.setLayoutParams(new android.widget.LinearLayout.LayoutParams(-2, -2));
baseLayout.setBackgroundColor(gui.config.colors[config.values.theme].background);
baseLayout.setOrientation(android.widget.LinearLayout.VERTICAL);
baseLayout.setPadding(10 * dp, 10 * dp, 10 * dp, 10 * dp);
var title = new android.widget.TextView(ctx);
title.setText(config.languages[config.values.lang].res_language_dialog_title);
title.setLayoutParams(new android.widget.LinearLayout.LayoutParams(-2, -2));
title.setPadding(0, 0, 0, 10 * dp);
title.setGravity(android.view.Gravity.LEFT | android.view.Gravity.CENTER);
title.setTextColor(gui.config.colors[config.values.theme].text);
title.setTextSize(18);
title.getLayoutParams().setMargins(0, 0, 0, 7.5 * dp);
baseLayout.addView(title);
var listView = new android.widget.ListView(ctx);
var listAdapter = null;
listView.setLayoutParams(new android.widget.FrameLayout.LayoutParams(-1, -2));
listView.setPadding(10 * dp, 5 * dp, 10 * dp, 5 * dp);
listView.setAdapter(listAdapter = new RhinoListAdapter((function sList(){
sList.list = [];
var langPath = android.os.Environment.getExternalStorageDirectory() + "/Documents/SkyAutoPlayer/lang/";
var langs = files.listDir(langPath);
for(var i in langs) {
var content = JSON.parse(files.read(langPath + langs[i]));
sList.list.push({
type: "item",
name: content.name,
code: content.code,
local: true,
content: content.content
});
}
sList.list.push({type: "loading"})
return sList.list;
}()), function self(element) {
switch(element.type) {
case "item": {
element.view = new android.widget.LinearLayout(ctx);
element.view.setLayoutParams(new android.widget.LinearLayout.LayoutParams(-1, -2));
element.view.setOrientation(android.widget.LinearLayout.VERTICAL);
element.view.setPadding(10 * dp, 10 * dp, 10 * dp, 10 * dp);
element.v_name = new android.widget.TextView(ctx);
element.v_name.setGravity(android.view.Gravity.LEFT | android.view.Gravity.CENTER);
element.v_name.setLayoutParams(new android.widget.LinearLayout.LayoutParams(-1, -2));
element.v_name.setPadding(0, 0, 0, 1.5 * dp);
element.v_name.setTextSize(14);
element.v_name.setTextColor(gui.config.colors[config.values.theme].text);
element.v_name.setText(element.name);
element.view.addView(element.v_name);
element.v_code = new android.widget.TextView(ctx);
element.v_code.setGravity(android.view.Gravity.LEFT | android.view.Gravity.CENTER);
element.v_code.setLayoutParams(new android.widget.LinearLayout.LayoutParams(-1, -2));
element.v_code.setPadding(1.5 * dp, 0, 0, 0);
element.v_code.setTextSize(12);
element.v_code.setTextColor(gui.config.colors[config.values.theme].sec_text);
element.v_code.setText(element.code);
element.view.addView(element.v_code);
return element.view;
}
case "loading": {
element.view = new android.widget.RelativeLayout(ctx);
element.view.setLayoutParams(new android.widget.LinearLayout.LayoutParams(-1, -2));
element.v_prog = new android.widget.ProgressBar(ctx, null, android.R.attr.progressBarStyleHorizontal);
element.v_prog.setLayoutParams(new android.widget.RelativeLayout.LayoutParams(-1, dp * 15));
element.v_prog.setPadding(10 * dp, 0, 10 * dp, 0);
element.v_prog.setProgressDrawable(new android.graphics.drawable.ColorDrawable(gui.config.colors[config.values.theme].background));
element.v_prog.setIndeterminate(true);
element.v_prog.setAlpha(1);
element.view.addView(element.v_prog);
element.v_prompt = new android.widget.TextView(ctx);
element.v_prompt.setGravity(android.view.Gravity.LEFT | android.view.Gravity.CENTER);
element.v_prompt.setLayoutParams(new android.widget.RelativeLayout.LayoutParams(-1, -2));
element.v_prompt.setTextSize(14);
element.v_prompt.setPadding(10 * dp, 0, 10 * dp, 0);
element.v_prompt.setTextColor(gui.config.colors[config.values.theme].sec_text);
element.v_prompt.setText(config.languages[config.values.lang].res_language_failed_fetch_online_list);
element.v_prompt.setAlpha(0);
element.view.addView(element.v_prompt);
return element.view;
}
}
}));
var listAdapterController = RhinoListAdapter.getController(listAdapter);
listView.setDividerHeight(0);
listView.setAdapter(listAdapterController.self);
listView.setOnItemClickListener(new android.widget.AdapterView.OnItemClickListener({
onItemClick: function(parent, view, pos, id) {
var item = listAdapterController.get(pos);
if(item.type == "item") {
if(item.local) {
config.languages[item.code] = item.content;
config.values.lang = config.save("language", item.code);
toast(String.format(config.languages[config.values.lang].res_use_language, item.name));
gui.main.__internal_dismiss();
gui.suspension.show();
gui.utils.value_animation("Float", 1.0, 0, 125, new android.view.animation.DecelerateInterpolator(), function(anim) {
langDialog.setAlpha(anim.getAnimatedValue());
if(anim.getAnimatedValue() == 1) gui.winMgr.removeView(langDialog);
});
} else {
threads.start(function() {
config.fetchRepoFile("resources/language_pack/" + item.code + ".json", null, function(body) {
var lf = android.os.Environment.getExternalStorageDirectory() + "/Documents/SkyAutoPlayer/lang/" + item.code + ".json";
files.create(lf)
files.writeBytes(lf, body.bytes());
var lang = JSON.parse(body.string());
config.languages[lang.code] = lang.content;
config.values.lang = config.save("language", lang.code);
toast(String.format(config.languages[config.values.lang].res_use_language, lang.name));
gui.main.__internal_dismiss();
gui.suspension.show();
gui.utils.value_animation("Float", 1.0, 0, 125, new android.view.animation.DecelerateInterpolator(), function(anim) {
langDialog.setAlpha(anim.getAnimatedValue());
if(anim.getAnimatedValue() == 1) gui.winMgr.removeView(langDialog);
});
}, function(msg) {
toast(String.format(config.languages[config.values.lang].res_language_download_failed, msg));
});
});
}
}
}
}));
baseLayout.addView(listView);
var prompt = new android.widget.TextView(ctx);
prompt.setText(android.text.Html.fromHtml(config.languages[config.values.lang].res_language_dialog_tip));
prompt.setLayoutParams(new android.widget.LinearLayout.LayoutParams(-2, -2));
prompt.setPadding(10 * dp, 10 * dp, 10 * dp, 10 * dp);
prompt.setGravity(android.view.Gravity.LEFT | android.view.Gravity.CENTER);
prompt.setTextColor(gui.config.colors[config.values.theme].sec_text);
prompt.setTextSize(12);
//prompt.getLayoutParams().setMargins(0, 0, 0, 7.5 * dp);
baseLayout.addView(prompt);
var langDialog = gui.dialogs.showDialog(baseLayout, -2, -2, null, true);
threads.start(function() {
config.fetchRepoFile("source/language_list.json", null, function(body) {
var onlineList = JSON.parse(body.string()).list;
gui.run(function() {
var __listArray = listAdapterController.getArray();
var loadingProgress = __listArray[__listArray.length - 1].v_prog
var loadingPrompt = __listArray[__listArray.length - 1].v_prompt
gui.utils.value_animation("Float", 1.0, 0, 200, new android.view.animation.DecelerateInterpolator(), function(anim) {
loadingProgress.setAlpha(anim.getAnimatedValue());
if(anim.getAnimatedValue() == 0) {
listAdapterController.removeByIndex(listAdapterController.getCount() - 1);
for(var i in onlineList) {
var exist = false;
for(var j in __listArray) if(__listArray[j].code == onlineList[i].code) exist = true;
if(!exist) listAdapterController.add({
type: "item",
name: onlineList[i].name,
code: onlineList[i].code,
local: false,
});
}
listAdapterController.notifyChange();
}
});
});
}, function(msg) {
gui.run(function() {
var __listArray = listAdapterController.getArray();
var loadingProgress = __listArray[__listArray.length - 1].v_prog
var loadingPrompt = __listArray[__listArray.length - 1].v_prompt
gui.utils.value_animation("Float", 1.0, 0, 200, new android.view.animation.DecelerateInterpolator(), function(anim) {
loadingProgress.setAlpha(anim.getAnimatedValue());
loadingPrompt.setAlpha(1.0 - anim.getAnimatedValue());
});
});
});
});
}
};
@@ -2174,6 +2398,16 @@ gui.dialogs.showProgressDialog(function(o) {
o.setIndeterminate(true);
o.setText("加载配置中...");
config.init();
o.setText("加载语言中...")
config.initLocalLang(function(msg) {
if(msg instanceof Error) {
o.close();
error(msg);
exit();
} else {
o.setText(msg);
}
});
config.checkVersion();
o.setText(config.languages[config.values.lang].op_loading_resources);
config.fetchResources(function(msg) {
@@ -3168,6 +3402,12 @@ gui.dialogs.showProgressDialog(function(o) {
sList.list = [{
type: "tag",
name: config.languages[config.values.lang].page_setting_basic,
}, {
type: "default",
name: "语言",
onClick: function(v) {
gui.languageDialog()
}
}, {
type: "default",
name: config.languages[config.values.lang].page_setting_set_8key_coordinate,
@@ -3291,7 +3531,7 @@ gui.dialogs.showProgressDialog(function(o) {
try {
android.os.Build.VERSION_CODES.R
} catch (e) {
sList.list.splice(5, 1);
sList.list.splice(6, 1);
}
return sList.list;
}()), function self(element) {
@@ -3404,9 +3644,7 @@ gui.dialogs.showProgressDialog(function(o) {
btn.setLayoutParams(new android.widget.LinearLayout.LayoutParams(-2, -2));
btn.setText(config.languages[config.values.lang].launch_tip_force_exit);
btn.setOnClickListener(new android.view.View.OnClickListener({
onClick: function() {
java.lang.System.exit(0);
}
onClick: function() { java.lang.System.exit(0); }
}));
layout.addView(btn);
return layout;