test language
This commit is contained in:
@@ -521,7 +521,38 @@ config = {
|
|||||||
res_download_failed: "以下资源下载失败:{0}",
|
res_download_failed: "以下资源下载失败:{0}",
|
||||||
res_download_successful: "资源下载完成",
|
res_download_successful: "资源下载完成",
|
||||||
res_error_while_downloading: "资源下载时发生了问题: {0}",
|
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() {
|
init: function() {
|
||||||
@@ -640,31 +671,36 @@ config = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
},
|
},
|
||||||
|
|
||||||
//jsdelivr cdn需要指定repo版本, gitee和github则不用
|
//jsdelivr cdn需要指定repo版本, gitee和github则不用
|
||||||
//fetch顺序为 gitee raw content → jsdelivr cdn → github raw content
|
//fetch顺序为 gitee raw content → jsdelivr cdn → github raw content
|
||||||
fetchRepoFile: function(path, gitVersion, successCbk, failCbk) {
|
fetchRepoFile: function(path, gitVersion, successCbk, failCbk) {
|
||||||
//就用最蠢的if来判断吧
|
//就用最蠢的if来判断吧
|
||||||
var resp = http.get(encodeURI("https://gitee.com/stageguard/SkyAutoPlayerScript/raw/master/" + path));
|
try {
|
||||||
if(resp.statusCode >= 200 && resp.statusCode < 300) {
|
var resp = http.get(encodeURI("https://gitee.com/stageguard/SkyAutoPlayerScript/raw/master/" + path));
|
||||||
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));
|
|
||||||
if(resp.statusCode >= 200 && resp.statusCode < 300) {
|
if(resp.statusCode >= 200 && resp.statusCode < 300) {
|
||||||
successCbk(resp.body);
|
successCbk(resp.body);
|
||||||
return;
|
return;
|
||||||
} else {
|
} else {
|
||||||
errorCollector += resp.statusCode + ": " + resp.statusMessage + "\n";
|
var errorCollector = resp.statusCode + ": " + resp.statusMessage + "\n";
|
||||||
resp = http.get(encodeURI("https://raw.githubusercontent.com/StageGuard/SkyAutoPlayerScript/master/" + path));
|
resp = http.get(encodeURI("https://cdn.jsdelivr.net/gh/StageGuard/SkyAutoPlayerScript" + (gitVersion == null ? "" : ("@" + gitVersion)) + "/" + path));
|
||||||
if(resp.statusCode >= 200 && resp.statusCode < 300) {
|
if(resp.statusCode >= 200 && resp.statusCode < 300) {
|
||||||
successCbk(resp.body);
|
successCbk(resp.body);
|
||||||
return;
|
return;
|
||||||
} else {
|
} else {
|
||||||
errorCollector += resp.statusCode + ": " + resp.statusMessage + "\n";
|
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;
|
return this.src;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
getView: function(i) {
|
||||||
|
if (typeof(i) == "number") {
|
||||||
|
return this.views[i];
|
||||||
|
} else {
|
||||||
|
return this.views;
|
||||||
|
}
|
||||||
|
},
|
||||||
insert: function(e, i, respawn) {
|
insert: function(e, i, respawn) {
|
||||||
this.src.splice(i, 0, e);
|
this.src.splice(i, 0, e);
|
||||||
if (respawn) {
|
if (respawn) {
|
||||||
@@ -953,7 +996,7 @@ gui = {
|
|||||||
frame.setOnTouchListener(new android.view.View.OnTouchListener({
|
frame.setOnTouchListener(new android.view.View.OnTouchListener({
|
||||||
onTouch: function touch(v, e) {
|
onTouch: function touch(v, e) {
|
||||||
try {
|
try {
|
||||||
if (e.getAction() == e.ACTION_DOWN && canExit) {
|
if (e.getAction() == e.ACTION_UP && canExit) {
|
||||||
frame.setEnabled(false);
|
frame.setEnabled(false);
|
||||||
frame.setClickable(false);
|
frame.setClickable(false);
|
||||||
gui.utils.value_animation("Float", 1.0, 0, 75, new android.view.animation.DecelerateInterpolator(), function(anim) {
|
gui.utils.value_animation("Float", 1.0, 0, 75, new android.view.animation.DecelerateInterpolator(), function(anim) {
|
||||||
@@ -1200,9 +1243,9 @@ gui = {
|
|||||||
if (callback) {
|
if (callback) {
|
||||||
callback(pos);
|
callback(pos);
|
||||||
gui.utils.value_animation("Float", 1, 0, 75, new android.view.animation.DecelerateInterpolator(), function(anim) {
|
gui.utils.value_animation("Float", 1, 0, 75, new android.view.animation.DecelerateInterpolator(), function(anim) {
|
||||||
dialog.setAlpha(anim.getAnimatedValue());
|
dialog.setAlpha(anim.getAnimatedValue());
|
||||||
if(anim.getAnimatedValue() == 1) gui.winMgr.removeView(dialog);
|
if(anim.getAnimatedValue() == 1) gui.winMgr.removeView(dialog);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
} catch (e) {
|
} 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.setIndeterminate(true);
|
||||||
o.setText("加载配置中...");
|
o.setText("加载配置中...");
|
||||||
config.init();
|
config.init();
|
||||||
|
o.setText("加载语言中...")
|
||||||
|
config.initLocalLang(function(msg) {
|
||||||
|
if(msg instanceof Error) {
|
||||||
|
o.close();
|
||||||
|
error(msg);
|
||||||
|
exit();
|
||||||
|
} else {
|
||||||
|
o.setText(msg);
|
||||||
|
}
|
||||||
|
});
|
||||||
config.checkVersion();
|
config.checkVersion();
|
||||||
o.setText(config.languages[config.values.lang].op_loading_resources);
|
o.setText(config.languages[config.values.lang].op_loading_resources);
|
||||||
config.fetchResources(function(msg) {
|
config.fetchResources(function(msg) {
|
||||||
@@ -3168,6 +3402,12 @@ gui.dialogs.showProgressDialog(function(o) {
|
|||||||
sList.list = [{
|
sList.list = [{
|
||||||
type: "tag",
|
type: "tag",
|
||||||
name: config.languages[config.values.lang].page_setting_basic,
|
name: config.languages[config.values.lang].page_setting_basic,
|
||||||
|
}, {
|
||||||
|
type: "default",
|
||||||
|
name: "语言",
|
||||||
|
onClick: function(v) {
|
||||||
|
gui.languageDialog()
|
||||||
|
}
|
||||||
}, {
|
}, {
|
||||||
type: "default",
|
type: "default",
|
||||||
name: config.languages[config.values.lang].page_setting_set_8key_coordinate,
|
name: config.languages[config.values.lang].page_setting_set_8key_coordinate,
|
||||||
@@ -3291,7 +3531,7 @@ gui.dialogs.showProgressDialog(function(o) {
|
|||||||
try {
|
try {
|
||||||
android.os.Build.VERSION_CODES.R
|
android.os.Build.VERSION_CODES.R
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
sList.list.splice(5, 1);
|
sList.list.splice(6, 1);
|
||||||
}
|
}
|
||||||
return sList.list;
|
return sList.list;
|
||||||
}()), function self(element) {
|
}()), function self(element) {
|
||||||
@@ -3404,9 +3644,7 @@ gui.dialogs.showProgressDialog(function(o) {
|
|||||||
btn.setLayoutParams(new android.widget.LinearLayout.LayoutParams(-2, -2));
|
btn.setLayoutParams(new android.widget.LinearLayout.LayoutParams(-2, -2));
|
||||||
btn.setText(config.languages[config.values.lang].launch_tip_force_exit);
|
btn.setText(config.languages[config.values.lang].launch_tip_force_exit);
|
||||||
btn.setOnClickListener(new android.view.View.OnClickListener({
|
btn.setOnClickListener(new android.view.View.OnClickListener({
|
||||||
onClick: function() {
|
onClick: function() { java.lang.System.exit(0); }
|
||||||
java.lang.System.exit(0);
|
|
||||||
}
|
|
||||||
}));
|
}));
|
||||||
layout.addView(btn);
|
layout.addView(btn);
|
||||||
return layout;
|
return layout;
|
||||||
|
|||||||
Reference in New Issue
Block a user