improve: language system based on json file

This commit will introduce new language system based on json file for easier to translate using crowdin in the future, also fix webui cannot load
This commit is contained in:
RainyXeon
2024-07-06 11:30:14 +07:00
committed by ThePedroo
parent 610683dfa2
commit c92ad7c748
21 changed files with 294 additions and 288 deletions

6
TRANSLATOR.md Normal file
View File

@@ -0,0 +1,6 @@
# 🌎 Translator
- **en_US** by [@PerformanC (The PerformanC Organization)](https://github.com/PerformanC)
- **pt_BR** by [@ThePedroo](https://github.com/ThePedroo)
- **ro_RO** by [@ExtremeXT](https://github.com/ExtremeXT)
- **ru_RU** by [@Emulond](https://github.com/Emulond)
- **vi_VN** by [@RainyXeon](https://github.com/RainyXeon)

View File

@@ -171,13 +171,15 @@ androidComponents.onVariants { variant ->
set.add(Pair(root.file("webroot/js/list/module.js").asFile, null))
set.add(Pair(root.file("webroot/js/list/settings.js").asFile, null))
set.add(Pair(root.file("webroot/js/list/lang.js").asFile, null))
set.add(Pair(root.file("webroot/js/list/language.js").asFile, null))
set.add(Pair(root.file("webroot/js/lang/en_US.js").asFile, null))
set.add(Pair(root.file("webroot/js/lang/vi_VN.js").asFile, null))
set.add(Pair(root.file("webroot/js/lang/index.js").asFile, null))
set.add(Pair(root.file("webroot/languages/en_US/main.json").asFile, null))
set.add(Pair(root.file("webroot/languages/pt_BR/main.json").asFile, null))
set.add(Pair(root.file("webroot/languages/ro_RO/main.json").asFile, null))
set.add(Pair(root.file("webroot/languages/ru_RU/main.json").asFile, null))
set.add(Pair(root.file("webroot/languages/vi_VN/main.json").asFile, null))
set.add(Pair(root.file("webroot/js/modal/lang.js").asFile, null))
set.add(Pair(root.file("webroot/js/modal/language.js").asFile, null))
set.add(Pair(root.file("webroot/css/index.css").asFile, null))

View File

@@ -122,13 +122,15 @@ extract "$ZIPFILE" 'webroot/js/language.js' "$MODPATH/webroot/js" true
extract "$ZIPFILE" 'webroot/js/list/module.js' "$MODPATH/webroot/js/list" true
extract "$ZIPFILE" 'webroot/js/list/settings.js' "$MODPATH/webroot/js/list" true
extract "$ZIPFILE" 'webroot/js/list/lang.js' "$MODPATH/webroot/js/list" true
extract "$ZIPFILE" 'webroot/js/list/language.js' "$MODPATH/webroot/js/list" true
extract "$ZIPFILE" 'webroot/js/lang/en_US.js' "$MODPATH/webroot/js/lang" true
extract "$ZIPFILE" 'webroot/js/lang/vi_VN.js' "$MODPATH/webroot/js/lang" true
extract "$ZIPFILE" 'webroot/js/lang/index.js' "$MODPATH/webroot/js/lang" true
extract "$ZIPFILE" 'webroot/languages/en_US/main.json' "$MODPATH/webroot/languages/en_US" true
extract "$ZIPFILE" 'webroot/languages/pt_BR/main.json' "$MODPATH/webroot/languages/pt_BR" true
extract "$ZIPFILE" 'webroot/languages/ro_RO/main.json' "$MODPATH/webroot/languages/ro_RO" true
extract "$ZIPFILE" 'webroot/languages/ru_RU/main.json' "$MODPATH/webroot/languages/en_US" true
extract "$ZIPFILE" 'webroot/languages/vi_VN/main.json' "$MODPATH/webroot/languages/vi_VN" true
extract "$ZIPFILE" 'webroot/js/modal/lang.js' "$MODPATH/webroot/js/modal" true
extract "$ZIPFILE" 'webroot/js/modal/language.js' "$MODPATH/webroot/js/modal" true
extract "$ZIPFILE" 'webroot/css/index.css' "$MODPATH/webroot/css" true

View File

@@ -171,6 +171,14 @@ a {
transform: scale(80%)
}
.element_animation {
transition: transform 0.15 ease-in-out;
}
.element_animation:active {
transform: scale(95%)
}
/* Card type */
.bright {
border: 5px solid var(--bright);

View File

@@ -8,9 +8,9 @@
<script src="js/theme.js" type="module"></script>
<script src="js/list/module.js" type="module"></script>
<script src="js/list/settings.js" type="module"></script>
<script src="js/list/lang.js" type="module"></script>
<script src="js/list/language.js" type="module"></script>
<script src="js/main.js" type="module"></script>
<script src="js/modal/lang.js" type="module"></script>
<script src="js/modal/language.js" type="module"></script>
<link rel="stylesheet" href="css/index.css">
</head>
<body id="main_body">

View File

@@ -1,45 +0,0 @@
/* INFO: Translated by @PerformanC (The PerformanC Organization) */
export const en_US = {
langName: 'English (United States)',
langModal: {
header: 'Choose your new language'
},
infoCard: {
status: {
unknown: 'ReZygisk is at an unknown state!',
notWorking: 'ReZygisk is not functioning!',
ok: 'ReZygisk is fully functioning!',
partially: 'ReZygisk is partially functioning!'
},
version: 'Version',
root: 'Root Implementation',
zygote: {
injected: 'Injected',
notInjected: 'Not Injected',
unknown: 'Unknown'
}
},
moduleCard: {
header: 'Modules',
arch: 'Arch: '
},
settings: {
header: 'Settings',
daemonButton: {
start: 'Start',
stop: 'Stop',
exit: 'Exit'
}
},
cmdErrors: {
ptrace64: 'Error while executing zygisk-ptrace64',
ptrace32: 'Error while executing zygisk-ptrace32',
ls: 'Error while listing files in zygisk folder of module',
cat: 'Error while reading module.prop from module',
find: 'Error while finding zygisk modules'
},
global: {
unknown: 'Unknown'
}
}

View File

@@ -1,13 +0,0 @@
import { en_US } from './en_US.js'
import { pt_BR } from './pt_BR.js'
import { ro_RO } from './ro_RO.js'
import { ru_RU } from './ru_RU.js'
import { vi_VN } from './vi_VN.js'
export const lang = {
en_US,
pt_BR,
ro_RO,
ru_RU,
vi_VN
}

View File

@@ -1,45 +0,0 @@
/* INFO: Translated by @ThePedroo */
export const pt_BR = {
langName: 'Português (Brasil)',
langModal: {
header: 'Escolha sua nova língua'
},
infoCard: {
status: {
unknown: 'ReZygisk está em um estado desconhecido!',
notWorking: 'ReZygisk não está funcionando!',
ok: 'ReZygisk está totalmente funcionando!',
partially: 'ReZygisk está parcialmente funcionando!'
},
version: 'Versão',
root: 'Implementação de root',
zygote: {
injected: 'Injetado',
notInjected: 'Não Injetado',
unknown: 'Desconhecido'
}
},
moduleCard: {
header: 'Módulos',
arch: 'Arquitetura: '
},
settings: {
header: 'Configurações',
daemonButton: {
start: 'Iniciar',
stop: 'Parar',
exit: 'Sair'
}
},
cmdErrors: {
ptrace64: 'Erro ao executar zygisk-ptrace64',
ptrace32: 'Erro ao executar zygisk-ptrace32',
ls: 'Erro ao listar arquivos na pasta zygisk do módulo',
cat: 'Erro ao ler module.prop do módulo',
find: 'Erro ao encontrar módulos que usam o zygisk'
},
global: {
unknown: 'Desconhecido'
}
}

View File

@@ -1,45 +0,0 @@
/* INFO: Translated by @ExtremeXT */
export const ro_RO = {
langName: 'Română (România)',
langModal: {
header: 'Alegeți limba prestabilită'
},
infoCard: {
status: {
unknown: 'ReZygisk este într-o stare necunoscută!',
notWorking: 'ReZygisk nu este în funcțiune!',
ok: 'ReZygisk funcționează în totalitate!',
partially: 'ReZygisk funcționează parțial!'
},
version: 'Versiune',
root: 'Implementare Root',
zygote: {
injected: 'Injectat',
notInjected: 'Neinjectat',
unknown: 'Necunoscut'
}
},
moduleCard: {
header: 'Module',
arch: 'Arhitectură: '
},
settings: {
header: 'Setări',
daemonButton: {
start: 'Start',
stop: 'Stop',
exit: 'Ieșire'
}
},
cmdErrors: {
ptrace64: 'Eroare în timpul executării zygisk-ptrace64',
ptrace32: 'Eroare în timpul executării zygisk-ptrace32',
ls: 'Eroare în timpul listării fișierelor din folderul Zygisk al modulului',
cat: 'Eroare în timpul citirii fișierului module.prop din modul',
find: 'Eroare la găsirea modulelor Zygisk'
},
global: {
unknown: 'Necunoscut'
}
}

View File

@@ -1,45 +0,0 @@
/* INFO: Translated by Emulond Argent (@Emulond) */
export const ru_RU = {
langName: 'Русский (Россия)',
langModal: {
header: 'Выберите Ваш новый язык'
},
infoCard: {
status: {
unknown: 'ReZygisk в неопределённом состоянии!',
notWorking: 'ReZygisk не функционирует!',
ok: 'ReZygisk работает в штатном режиме!',
partially: 'ReZygisk функционирует частично!'
},
version: 'Версия',
root: 'Реализация ROOT',
zygote: {
injected: 'Инъецирован',
notInjected: 'Не инъецирован',
unknown: 'Неизвестно'
}
},
moduleCard: {
header: 'Модули',
arch: 'Архи-ра: '
},
settings: {
header: 'Настройки',
daemonButton: {
start: 'Старт',
stop: 'Пауза',
exit: 'Стоп'
}
},
cmdErrors: {
ptrace64: 'Ошибка выполнения zygisk-ptrace64',
ptrace32: 'Ошибка выполнения zygisk-ptrace32',
ls: 'Ошибка перечисления файлов в zygisk папке модуля',
cat: 'Ошибка чтения module.prop модуля',
find: 'Ошибка обнаружения zygisk модулей'
},
global: {
unknown: 'Неизвестно'
}
}

View File

@@ -1,45 +0,0 @@
/* INFO: Translated by @RainyXeon */
export const vi_VN = {
langName: 'Tiếng Việt',
langModal: {
header: 'Chọn ngôn ngữ mới của bạn'
},
infoCard: {
status: {
unknown: 'ReZygisk đang ở trạng thái không xác định!',
notWorking: 'ReZygisk không hoạt động!',
ok: 'ReZygisk đang hoạt động!',
partially: 'ReZygisk đang hoạt động một phần!'
},
version: 'Phiên bản',
root: 'Hệ thống root',
zygote: {
injected: 'Đã can thiệp',
notInjected: 'Chưa can thiệp',
unknown: 'Không xác định'
}
},
moduleCard: {
header: 'Mô Đun',
arch: 'Loại: '
},
settings: {
header: 'Cài đặt',
daemonButton: {
start: 'Chạy',
stop: 'Dừng',
exit: 'Thoát'
}
},
cmdErrors: {
ptrace64: 'Đã xảy ra lỗi khi chạy zygisk-ptrace64',
ptrace32: 'Đã xảy ra lỗi khi chạy zygisk-ptrace32',
ls: 'Đã xảy ra lỗi khi liệt kê tệp tin của mô đun trong thư mục zygisk',
cat: 'Đã xảy ra lỗi khi đọc tệp tin module.prop từ mô đun',
find: 'Đã xảy ra lỗi khi tìm mô đun thuộc zygisk'
},
global: {
unknown: 'Không xác định'
}
}

View File

@@ -1,5 +1,3 @@
import { lang } from './lang/index.js'
/* INFO: info card */
const version_info_title = document.getElementById('version_info_title')
const version_code = document.getElementById('version_code')
@@ -26,9 +24,9 @@ const rezygisk_state = document.getElementById('rezygisk_state')
const zygote32_status_div = document.getElementById('zygote32_status')
const zygote64_status_div = document.getElementById('zygote64_status')
export function setNewLang(locate, initialize) {
const old_translations = lang[initialize ? 'en_US' : localStorage.getItem('/system/language')]
const new_lang = lang[locate]
export async function setNewLanguage(locate, initialize) {
const old_translations = await getTranslations(initialize ? 'en_US' : localStorage.getItem('/system/language'))
const new_lang = await getTranslations(locate)
/* INFO: info card */
version_info_title.innerHTML = new_lang.infoCard.version
@@ -126,6 +124,16 @@ export function setNewLang(locate, initialize) {
}
}
export function getTranslations(locate) {
return lang[locate]
}
export async function getTranslations(locate) {
const translateData = await fetch(`./languages/${locate}/main.json`)
.catch(error => reject(error))
return await translateData.json()
}
export const avaliableLanguages = [
"en_US", /* INFO: Translated by @PerformanC (The PerformanC Organization) */
"pt_BR", /* INFO: Translated by @ThePedroo */
"ro_RO", /* INFO: Translated by @ExtremeXT */
"ru_RU", /* INFO: Translated by Emulond Argent (@Emulond) */
"vi_VN", /* INFO: Translated by @RainyXeon (unexpected unresolved) */
]

View File

@@ -1,27 +0,0 @@
import { lang } from '../lang/index.js'
import { setNewLang } from '../language.js'
const lang_list = document.getElementById('lang_modal_list')
const target = document.getElementById('lang_modal')
const key_list = Object.keys(lang)
let index = 0
for (const lang_key of key_list) {
index += 1
const value = lang[lang_key]
lang_list.innerHTML += `
<div lang_section="true" id="${lang_key}" class="${index === key_list.length ? '' : 'spliter'}" style="padding-top: 25px; padding-bottom: 25px; font-size: 1.3em;">
${value.langName}
</div>`
}
document.addEventListener('click', (event) => {
if (!event.target.getAttribute('lang_section')) return;
setNewLang(event.target.id)
target.style.top = '100%'
localStorage.setItem('/cache/modal/language/state', 'closed')
localStorage.setItem('/system/language', event.target.id)
}, false)

View File

@@ -0,0 +1,30 @@
import {
avaliableLanguages,
getTranslations,
setNewLanguage
} from '../language.js'
const lang_list = document.getElementById('lang_modal_list')
const target = document.getElementById('lang_modal')
let index = 0
for (const langKey of avaliableLanguages) {
index += 1
getTranslations(langKey).then(data => {
lang_list.innerHTML += `
<div lang-data="${langKey}" class="${index === avaliableLanguages.length ? '' : 'spliter'}" style="padding-top: 25px; padding-bottom: 25px; font-size: 1.3em;">
<div lang-data="${langKey}" class="element_animation">${data.langName}</div>
</div>`
})
}
document.addEventListener('click', async (event) => {
const getLangLocate = event.target.getAttribute('lang-data')
if (!getLangLocate || typeof getLangLocate !== "string") return;
await setNewLanguage(getLangLocate)
target.style.top = '100%'
localStorage.setItem('/cache/modal/language/state', 'closed')
localStorage.setItem('/system/language', getLangLocate)
}, false)

View File

@@ -1,5 +1,5 @@
import { fullScreen, exec, toast } from './kernelsu.js'
import { setNewLang, getTranslations } from './language.js'
import { setNewLanguage, getTranslations } from './language.js'
(async () => {
const EXPECTED = 1
@@ -10,9 +10,9 @@ import { setNewLang, getTranslations } from './language.js'
let sys_lang = localStorage.getItem('/system/language')
if (!sys_lang) sys_lang = setLangData('en_US')
if (sys_lang !== 'en_US') setNewLang(sys_lang, true)
if (sys_lang !== 'en_US') await setNewLanguage(sys_lang, true)
const translations = getTranslations(sys_lang)
const translations = await getTranslations(sys_lang)
const loading_screen = document.getElementById('loading_screen')

View File

@@ -0,0 +1,43 @@
{
"langName": "English (United States)",
"langModal": {
"header": "Choose your new language"
},
"infoCard": {
"status": {
"unknown": "ReZygisk is at an unknown state!",
"notWorking": "ReZygisk is not functioning!",
"ok": "ReZygisk is fully functioning!",
"partially": "ReZygisk is partially functioning!"
},
"version": "Version",
"root": "Root Implementation",
"zygote": {
"injected": "Injected",
"notInjected": "Not Injected",
"unknown": "Unknown"
}
},
"moduleCard": {
"header": "Modules",
"arch": "Arch: "
},
"settings": {
"header": "Settings",
"daemonButton": {
"start": "Start",
"stop": "Stop",
"exit": "Exit"
}
},
"cmdErrors": {
"ptrace64": "Error while executing zygisk-ptrace64",
"ptrace32": "Error while executing zygisk-ptrace32",
"ls": "Error while listing files in zygisk folder of module",
"cat": "Error while reading module.prop from module",
"find": "Error while finding zygisk modules"
},
"global": {
"unknown": "Unknown"
}
}

View File

@@ -0,0 +1,43 @@
{
"langName": "Português (Brasil)",
"langModal": {
"header": "Escolha sua nova língua"
},
"infoCard": {
"status": {
"unknown": "ReZygisk está em um estado desconhecido!",
"notWorking": "ReZygisk não está funcionando!",
"ok": "ReZygisk está totalmente funcionando!",
"partially": "ReZygisk está parcialmente funcionando!"
},
"version": "Versão",
"root": "Implementação de root",
"zygote": {
"injected": "Injetado",
"notInjected": "Não Injetado",
"unknown": "Desconhecido"
}
},
"moduleCard": {
"header": "Módulos",
"arch": "Arquitetura: "
},
"settings": {
"header": "Configurações",
"daemonButton": {
"start": "Iniciar",
"stop": "Parar",
"exit": "Sair"
}
},
"cmdErrors": {
"ptrace64": "Erro ao executar zygisk-ptrace64",
"ptrace32": "Erro ao executar zygisk-ptrace32",
"ls": "Erro ao listar arquivos na pasta zygisk do módulo",
"cat": "Erro ao ler module.prop do módulo",
"find": "Erro ao encontrar módulos que usam o zygisk"
},
"global": {
"unknown": "Desconhecido"
}
}

View File

@@ -0,0 +1,43 @@
{
"langName": "Română (România)",
"langModal": {
"header": "Alegeți limba prestabilită"
},
"infoCard": {
"status": {
"unknown": "ReZygisk este într-o stare necunoscută!",
"notWorking": "ReZygisk nu este în funcțiune!",
"ok": "ReZygisk funcționează în totalitate!",
"partially": "ReZygisk funcționează parțial!"
},
"version": "Versiune",
"root": "Implementare Root",
"zygote": {
"injected": "Injectat",
"notInjected": "Neinjectat",
"unknown": "Necunoscut"
}
},
"moduleCard": {
"header": "Module",
"arch": "Arhitectură: "
},
"settings": {
"header": "Setări",
"daemonButton": {
"start": "Start",
"stop": "Stop",
"exit": "Ieșire"
}
},
"cmdErrors": {
"ptrace64": "Eroare în timpul executării zygisk-ptrace64",
"ptrace32": "Eroare în timpul executării zygisk-ptrace32",
"ls": "Eroare în timpul listării fișierelor din folderul Zygisk al modulului",
"cat": "Eroare în timpul citirii fișierului module.prop din modul",
"find": "Eroare la găsirea modulelor Zygisk"
},
"global": {
"unknown": "Necunoscut"
}
}

View File

@@ -0,0 +1,43 @@
{
"langName": "Русский (Россия)",
"langModal": {
"header": "Выберите Ваш новый язык"
},
"infoCard": {
"status": {
"unknown": "ReZygisk в неопределённом состоянии!",
"notWorking": "ReZygisk не функционирует!",
"ok": "ReZygisk работает в штатном режиме!",
"partially": "ReZygisk функционирует частично!"
},
"version": "Версия",
"root": "Реализация ROOT",
"zygote": {
"injected": "Инъецирован",
"notInjected": "Не инъецирован",
"unknown": "Неизвестно"
}
},
"moduleCard": {
"header": "Модули",
"arch": "Архи-ра: "
},
"settings": {
"header": "Настройки",
"daemonButton": {
"start": "Старт",
"stop": "Пауза",
"exit": "Стоп"
}
},
"cmdErrors": {
"ptrace64": "Ошибка выполнения zygisk-ptrace64",
"ptrace32": "Ошибка выполнения zygisk-ptrace32",
"ls": "Ошибка перечисления файлов в zygisk папке модуля",
"cat": "Ошибка чтения module.prop модуля",
"find": "Ошибка обнаружения zygisk модулей"
},
"global": {
"unknown": "Неизвестно"
}
}

View File

@@ -0,0 +1,43 @@
{
"langName": "Tiếng Việt",
"langModal": {
"header": "Chọn ngôn ngữ mới của bạn"
},
"infoCard": {
"status": {
"unknown": "ReZygisk đang ở trạng thái không xác định!",
"notWorking": "ReZygisk không hoạt động!",
"ok": "ReZygisk đang hoạt động!",
"partially": "ReZygisk đang hoạt động một phần!"
},
"version": "Phiên bản",
"root": "Hệ thống root",
"zygote": {
"injected": "Đã can thiệp",
"notInjected": "Chưa can thiệp",
"unknown": "Không xác định"
}
},
"moduleCard": {
"header": "Mô Đun",
"arch": "Cấu trúc: "
},
"settings": {
"header": "Cài đặt",
"daemonButton": {
"start": "Chạy",
"stop": "Dừng",
"exit": "Thoát"
}
},
"cmdErrors": {
"ptrace64": "Đã xảy ra lỗi khi chạy zygisk-ptrace64",
"ptrace32": "Đã xảy ra lỗi khi chạy zygisk-ptrace32",
"ls": "Đã xảy ra lỗi khi liệt kê tệp tin của mô đun trong thư mục zygisk",
"cat": "Đã xảy ra lỗi khi đọc tệp tin module.prop từ mô đun",
"find": "Đã xảy ra lỗi khi tìm mô đun thuộc zygisk"
},
"global": {
"unknown": "Không xác định"
}
}