From d56b56e2f45414dca2c0b4614c070275c7cf3716 Mon Sep 17 00:00:00 2001
From: StageGuard <1355416608@qq.com>
Date: Tue, 22 Dec 2020 17:16:05 +0800
Subject: [PATCH] test language
---
source/SkyAutoplayer.js | 274 +++++++++++++++++++++++++++++++++++++---
1 file changed, 256 insertions(+), 18 deletions(-)
diff --git a/source/SkyAutoplayer.js b/source/SkyAutoplayer.js
index 21c128c..5db63fe 100644
--- a/source/SkyAutoplayer.js
+++ b/source/SkyAutoplayer.js
@@ -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: "找不到你的语言?欢迎贡献翻译:
https://github.com/StageGuard/SkyAutoPlayerScript",
+ 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;