mirror of
https://github.com/louislam/uptime-kuma.git
synced 2024-11-24 07:14:04 +00:00
Merge pull request #966 from louislam/lazy-load-lang
Lazy load language files
This commit is contained in:
commit
bedc1f8617
6 changed files with 89 additions and 78 deletions
|
@ -4,7 +4,7 @@
|
||||||
<label for="language" class="form-label">
|
<label for="language" class="form-label">
|
||||||
{{ $t("Language") }}
|
{{ $t("Language") }}
|
||||||
</label>
|
</label>
|
||||||
<select id="language" v-model="$i18n.locale" class="form-select">
|
<select id="language" v-model="$root.language" class="form-select">
|
||||||
<option
|
<option
|
||||||
v-for="(lang, i) in $i18n.availableLocales"
|
v-for="(lang, i) in $i18n.availableLocales"
|
||||||
:key="`Lang${i}`"
|
:key="`Lang${i}`"
|
||||||
|
@ -116,14 +116,8 @@
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import { setPageLocale } from "../../util-frontend";
|
|
||||||
export default {
|
export default {
|
||||||
watch: {
|
|
||||||
"$i18n.locale"() {
|
|
||||||
localStorage.locale = this.$i18n.locale;
|
|
||||||
setPageLocale();
|
|
||||||
},
|
|
||||||
},
|
|
||||||
};
|
};
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
|
91
src/i18n.js
91
src/i18n.js
|
@ -1,62 +1,45 @@
|
||||||
import { createI18n } from "vue-i18n/index";
|
import { createI18n } from "vue-i18n/index";
|
||||||
import daDK from "./languages/da-DK";
|
|
||||||
import deDE from "./languages/de-DE";
|
|
||||||
import en from "./languages/en";
|
import en from "./languages/en";
|
||||||
import esEs from "./languages/es-ES";
|
|
||||||
import etEE from "./languages/et-EE";
|
|
||||||
import fa from "./languages/fa";
|
|
||||||
import frFR from "./languages/fr-FR";
|
|
||||||
import hu from "./languages/hu";
|
|
||||||
import hrHR from "./languages/hr-HR";
|
|
||||||
import itIT from "./languages/it-IT";
|
|
||||||
import idID from "./languages/id-ID";
|
|
||||||
import ja from "./languages/ja";
|
|
||||||
import koKR from "./languages/ko-KR";
|
|
||||||
import nlNL from "./languages/nl-NL";
|
|
||||||
import nbNO from "./languages/nb-NO";
|
|
||||||
import pl from "./languages/pl";
|
|
||||||
import ptBR from "./languages/pt-BR";
|
|
||||||
import bgBG from "./languages/bg-BG";
|
|
||||||
import ruRU from "./languages/ru-RU";
|
|
||||||
import sr from "./languages/sr";
|
|
||||||
import srLatn from "./languages/sr-latn";
|
|
||||||
import svSE from "./languages/sv-SE";
|
|
||||||
import trTR from "./languages/tr-TR";
|
|
||||||
import vi from "./languages/vi";
|
|
||||||
import zhCN from "./languages/zh-CN";
|
|
||||||
import zhHK from "./languages/zh-HK";
|
|
||||||
import zhTW from "./languages/zh-TW";
|
|
||||||
|
|
||||||
const languageList = {
|
const languageList = {
|
||||||
en,
|
"zh-HK": "繁體中文 (香港)",
|
||||||
"zh-HK": zhHK,
|
"bg-BG": "Български",
|
||||||
"bg-BG": bgBG,
|
"de-DE": "Deutsch (Deutschland)",
|
||||||
"de-DE": deDE,
|
"nl-NL": "Nederlands",
|
||||||
"nl-NL": nlNL,
|
"nb-NO": "Norsk",
|
||||||
"nb-NO": nbNO,
|
"es-ES": "Español",
|
||||||
"es-ES": esEs,
|
"fa": "Farsi",
|
||||||
"fa": fa,
|
"pt-BR": "Português (Brasileiro)",
|
||||||
"pt-BR": ptBR,
|
"fr-FR": "Français (France)",
|
||||||
"fr-FR": frFR,
|
"hu": "Magyar",
|
||||||
"hu": hu,
|
"hr-HR": "Hrvatski",
|
||||||
"hr-HR": hrHR,
|
"it-IT": "Italiano (Italian)",
|
||||||
"it-IT": itIT,
|
"id-ID": "Bahasa Indonesia (Indonesian)",
|
||||||
"id-ID" : idID,
|
"ja": "日本語",
|
||||||
"ja": ja,
|
"da-DK": "Danish (Danmark)",
|
||||||
"da-DK": daDK,
|
"sr": "Српски",
|
||||||
"sr": sr,
|
"sr-latn": "Srpski",
|
||||||
"sr-latn": srLatn,
|
"sv-SE": "Svenska",
|
||||||
"sv-SE": svSE,
|
"tr-TR": "Türkçe",
|
||||||
"tr-TR": trTR,
|
"ko-KR": "한국어",
|
||||||
"ko-KR": koKR,
|
"ru-RU": "Русский",
|
||||||
"ru-RU": ruRU,
|
"zh-CN": "简体中文",
|
||||||
"zh-CN": zhCN,
|
"pl": "Polski",
|
||||||
"pl": pl,
|
"et-EE": "eesti",
|
||||||
"et-EE": etEE,
|
"vi": "Vietnamese",
|
||||||
"vi": vi,
|
"zh-TW": "繁體中文 (台灣)"
|
||||||
"zh-TW": zhTW
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
let messages = {
|
||||||
|
en,
|
||||||
|
};
|
||||||
|
|
||||||
|
for (let lang in languageList) {
|
||||||
|
messages[lang] = {
|
||||||
|
languageName: languageList[lang]
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
const rtlLangs = ["fa"];
|
const rtlLangs = ["fa"];
|
||||||
|
|
||||||
export const currentLocale = () => localStorage.locale
|
export const currentLocale = () => localStorage.locale
|
||||||
|
@ -73,5 +56,5 @@ export const i18n = createI18n({
|
||||||
fallbackLocale: "en",
|
fallbackLocale: "en",
|
||||||
silentFallbackWarn: true,
|
silentFallbackWarn: true,
|
||||||
silentTranslationWarn: true,
|
silentTranslationWarn: true,
|
||||||
messages: languageList,
|
messages: messages,
|
||||||
});
|
});
|
||||||
|
|
|
@ -5,10 +5,7 @@
|
||||||
3. Run `npm run update-language-files`. You can also use this command to check if there are new strings to translate for your language.
|
3. Run `npm run update-language-files`. You can also use this command to check if there are new strings to translate for your language.
|
||||||
4. Your language file should be filled in. You can translate now.
|
4. Your language file should be filled in. You can translate now.
|
||||||
5. Translate `src/components/settings/Security.vue` (search for a `Confirm` component with `rel="confirmDisableAuth"`).
|
5. Translate `src/components/settings/Security.vue` (search for a `Confirm` component with `rel="confirmDisableAuth"`).
|
||||||
6. Import your language file in `src/i18n.js` and add it to `languageList` constant.
|
6. Add it into `languageList` constant.
|
||||||
7. Make a [pull request](https://github.com/louislam/uptime-kuma/pulls) when you have done.
|
7. Make a [pull request](https://github.com/louislam/uptime-kuma/pulls) when you have done.
|
||||||
|
|
||||||
One of good examples:
|
|
||||||
https://github.com/louislam/uptime-kuma/pull/316/files
|
|
||||||
|
|
||||||
If you do not have programming skills, let me know in [Issues section](https://github.com/louislam/uptime-kuma/issues). I will assist you. 😏
|
If you do not have programming skills, let me know in [Issues section](https://github.com/louislam/uptime-kuma/issues). I will assist you. 😏
|
||||||
|
|
|
@ -12,6 +12,7 @@ import mobile from "./mixins/mobile";
|
||||||
import publicMixin from "./mixins/public";
|
import publicMixin from "./mixins/public";
|
||||||
import socket from "./mixins/socket";
|
import socket from "./mixins/socket";
|
||||||
import theme from "./mixins/theme";
|
import theme from "./mixins/theme";
|
||||||
|
import lang from "./mixins/lang";
|
||||||
import { router } from "./router";
|
import { router } from "./router";
|
||||||
import { appName } from "./util.ts";
|
import { appName } from "./util.ts";
|
||||||
|
|
||||||
|
@ -22,6 +23,7 @@ const app = createApp({
|
||||||
mobile,
|
mobile,
|
||||||
datetime,
|
datetime,
|
||||||
publicMixin,
|
publicMixin,
|
||||||
|
lang,
|
||||||
],
|
],
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
|
|
33
src/mixins/lang.js
Normal file
33
src/mixins/lang.js
Normal file
|
@ -0,0 +1,33 @@
|
||||||
|
import { currentLocale } from "../i18n";
|
||||||
|
import { setPageLocale } from "../util-frontend";
|
||||||
|
const langModules = import.meta.glob("../languages/*.js");
|
||||||
|
|
||||||
|
export default {
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
language: currentLocale(),
|
||||||
|
};
|
||||||
|
},
|
||||||
|
|
||||||
|
async created() {
|
||||||
|
if (this.language !== "en") {
|
||||||
|
await this.changeLang(this.language);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
watch: {
|
||||||
|
async language(lang) {
|
||||||
|
await this.changeLang(lang);
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
|
methods: {
|
||||||
|
async changeLang(lang) {
|
||||||
|
let message = (await langModules["../languages/" + lang + ".js"]()).default;
|
||||||
|
this.$i18n.setLocaleMessage(lang, message);
|
||||||
|
this.$i18n.locale = lang;
|
||||||
|
localStorage.locale = lang;
|
||||||
|
setPageLocale();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
|
@ -44,8 +44,20 @@ export default {
|
||||||
|
|
||||||
settings: {},
|
settings: {},
|
||||||
settingsLoaded: false,
|
settingsLoaded: false,
|
||||||
|
};
|
||||||
|
},
|
||||||
|
|
||||||
subMenus: {
|
computed: {
|
||||||
|
currentPage() {
|
||||||
|
let pathEnd = useRoute().path.split("/").at(-1);
|
||||||
|
if (pathEnd == "settings" || pathEnd == null) {
|
||||||
|
return "general";
|
||||||
|
}
|
||||||
|
return pathEnd;
|
||||||
|
},
|
||||||
|
|
||||||
|
subMenus() {
|
||||||
|
return {
|
||||||
general: {
|
general: {
|
||||||
title: this.$t("General"),
|
title: this.$t("General"),
|
||||||
},
|
},
|
||||||
|
@ -67,18 +79,8 @@ export default {
|
||||||
about: {
|
about: {
|
||||||
title: this.$t("About"),
|
title: this.$t("About"),
|
||||||
},
|
},
|
||||||
},
|
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
|
||||||
computed: {
|
|
||||||
currentPage() {
|
|
||||||
let pathEnd = useRoute().path.split("/").at(-1);
|
|
||||||
if (pathEnd == "settings" || pathEnd == null) {
|
|
||||||
return "general";
|
|
||||||
}
|
|
||||||
return pathEnd;
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
|
|
||||||
mounted() {
|
mounted() {
|
||||||
|
|
Loading…
Reference in a new issue