mirror of
				https://github.com/louislam/uptime-kuma.git
				synced 2025-11-01 03:49:24 +08:00 
			
		
		
		
	Merge remote-tracking branch 'upstream/master' into improve-translatables
This commit is contained in:
		| @@ -7,12 +7,12 @@ class Pushover extends NotificationProvider { | ||||
|  | ||||
|     async send(notification, msg, monitorJSON = null, heartbeatJSON = null) { | ||||
|         let okMsg = "Sent Successfully."; | ||||
|         let pushoverlink = "https://api.pushover.net/1/messages.json" | ||||
|         let pushoverlink = "https://api.pushover.net/1/messages.json"; | ||||
|  | ||||
|         try { | ||||
|             if (heartbeatJSON == null) { | ||||
|                 let data = { | ||||
|                     "message": "<b>Uptime Kuma Pushover testing successful.</b>", | ||||
|                     "message": msg, | ||||
|                     "user": notification.pushoveruserkey, | ||||
|                     "token": notification.pushoverapptoken, | ||||
|                     "sound": notification.pushoversounds, | ||||
| @@ -21,8 +21,8 @@ class Pushover extends NotificationProvider { | ||||
|                     "retry": "30", | ||||
|                     "expire": "3600", | ||||
|                     "html": 1, | ||||
|                 } | ||||
|                 await axios.post(pushoverlink, data) | ||||
|                 }; | ||||
|                 await axios.post(pushoverlink, data); | ||||
|                 return okMsg; | ||||
|             } | ||||
|  | ||||
| @@ -36,11 +36,11 @@ class Pushover extends NotificationProvider { | ||||
|                 "retry": "30", | ||||
|                 "expire": "3600", | ||||
|                 "html": 1, | ||||
|             } | ||||
|             await axios.post(pushoverlink, data) | ||||
|             }; | ||||
|             await axios.post(pushoverlink, data); | ||||
|             return okMsg; | ||||
|         } catch (error) { | ||||
|             this.throwGeneralAxiosError(error) | ||||
|             this.throwGeneralAxiosError(error); | ||||
|         } | ||||
|  | ||||
|     } | ||||
|   | ||||
| @@ -4,7 +4,7 @@ | ||||
|             <label for="language" class="form-label"> | ||||
|                 {{ $t("Language") }} | ||||
|             </label> | ||||
|             <select id="language" v-model="$i18n.locale" class="form-select"> | ||||
|             <select id="language" v-model="$root.language" class="form-select"> | ||||
|                 <option | ||||
|                     v-for="(lang, i) in $i18n.availableLocales" | ||||
|                     :key="`Lang${i}`" | ||||
| @@ -116,14 +116,8 @@ | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
| import { setPageLocale } from "../../util-frontend"; | ||||
| export default { | ||||
|     watch: { | ||||
|         "$i18n.locale"() { | ||||
|             localStorage.locale = this.$i18n.locale; | ||||
|             setPageLocale(); | ||||
|         }, | ||||
|     }, | ||||
|  | ||||
| }; | ||||
| </script> | ||||
|  | ||||
|   | ||||
| @@ -122,6 +122,7 @@ | ||||
|                 <HiddenInput | ||||
|                     id="steamAPIKey" | ||||
|                     v-model="settings.steamAPIKey" | ||||
|                     autocomplete="one-time-code" | ||||
|                 /> | ||||
|                 <div class="form-text"> | ||||
|                     {{ $t("steamApiKeyDescription") }} | ||||
|   | ||||
							
								
								
									
										91
									
								
								src/i18n.js
									
									
									
									
									
								
							
							
						
						
									
										91
									
								
								src/i18n.js
									
									
									
									
									
								
							| @@ -1,62 +1,45 @@ | ||||
| import { createI18n } from "vue-i18n/index"; | ||||
| import daDK from "./languages/da-DK"; | ||||
| import deDE from "./languages/de-DE"; | ||||
| 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 = { | ||||
|     en, | ||||
|     "zh-HK": zhHK, | ||||
|     "bg-BG": bgBG, | ||||
|     "de-DE": deDE, | ||||
|     "nl-NL": nlNL, | ||||
|     "nb-NO": nbNO, | ||||
|     "es-ES": esEs, | ||||
|     "fa": fa, | ||||
|     "pt-BR": ptBR, | ||||
|     "fr-FR": frFR, | ||||
|     "hu": hu, | ||||
|     "hr-HR": hrHR, | ||||
|     "it-IT": itIT, | ||||
|     "id-ID" : idID, | ||||
|     "ja": ja, | ||||
|     "da-DK": daDK, | ||||
|     "sr": sr, | ||||
|     "sr-latn": srLatn, | ||||
|     "sv-SE": svSE, | ||||
|     "tr-TR": trTR, | ||||
|     "ko-KR": koKR, | ||||
|     "ru-RU": ruRU, | ||||
|     "zh-CN": zhCN, | ||||
|     "pl": pl, | ||||
|     "et-EE": etEE, | ||||
|     "vi": vi, | ||||
|     "zh-TW": zhTW | ||||
|     "zh-HK": "繁體中文 (香港)", | ||||
|     "bg-BG": "Български", | ||||
|     "de-DE": "Deutsch (Deutschland)", | ||||
|     "nl-NL": "Nederlands", | ||||
|     "nb-NO": "Norsk", | ||||
|     "es-ES": "Español", | ||||
|     "fa": "Farsi", | ||||
|     "pt-BR": "Português (Brasileiro)", | ||||
|     "fr-FR": "Français (France)", | ||||
|     "hu": "Magyar", | ||||
|     "hr-HR": "Hrvatski", | ||||
|     "it-IT": "Italiano (Italian)", | ||||
|     "id-ID": "Bahasa Indonesia (Indonesian)", | ||||
|     "ja": "日本語", | ||||
|     "da-DK": "Danish (Danmark)", | ||||
|     "sr": "Српски", | ||||
|     "sr-latn": "Srpski", | ||||
|     "sv-SE": "Svenska", | ||||
|     "tr-TR": "Türkçe", | ||||
|     "ko-KR": "한국어", | ||||
|     "ru-RU": "Русский", | ||||
|     "zh-CN": "简体中文", | ||||
|     "pl": "Polski", | ||||
|     "et-EE": "eesti", | ||||
|     "vi": "Vietnamese", | ||||
|     "zh-TW": "繁體中文 (台灣)" | ||||
| }; | ||||
|  | ||||
| let messages = { | ||||
|     en, | ||||
| }; | ||||
|  | ||||
| for (let lang in languageList) { | ||||
|     messages[lang] = { | ||||
|         languageName: languageList[lang] | ||||
|     }; | ||||
| } | ||||
|  | ||||
| const rtlLangs = ["fa"]; | ||||
|  | ||||
| export const currentLocale = () => localStorage.locale | ||||
| @@ -73,5 +56,5 @@ export const i18n = createI18n({ | ||||
|     fallbackLocale: "en", | ||||
|     silentFallbackWarn: 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. | ||||
| 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"`). | ||||
| 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. | ||||
|  | ||||
| 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. 😏 | ||||
|   | ||||
| @@ -89,7 +89,7 @@ export default { | ||||
|     Timezone: "Часова зона", | ||||
|     "Search Engine Visibility": "Видимост за търсачки", | ||||
|     "Allow indexing": "Разреши индексиране", | ||||
|     "Discourage search engines from indexing site": "Обезкуражи индексирането на сайта от търсачките", | ||||
|     "Discourage search engines from indexing site": "Не позволявай на търсачките да индексират този сайт", | ||||
|     "Change Password": "Промени парола", | ||||
|     "Current Password": "Текуща парола", | ||||
|     "New Password": "Нова парола", | ||||
| @@ -307,4 +307,5 @@ export default { | ||||
|     PasswordsDoNotMatch: "Паролите не съвпадат.", | ||||
|     "Current User": "Текущ потребител", | ||||
|     recent: "Скорошни", | ||||
|     shrinkDatabaseDescription: "Инициира \"VACUUM\" за \"SQLite\" база данни. Ако Вашата база данни е създадена след версия 1.10.0, \"AUTO_VACUUM\" функцията е активна и това действие не нужно.", | ||||
| }; | ||||
|   | ||||
| @@ -12,6 +12,7 @@ import mobile from "./mixins/mobile"; | ||||
| import publicMixin from "./mixins/public"; | ||||
| import socket from "./mixins/socket"; | ||||
| import theme from "./mixins/theme"; | ||||
| import lang from "./mixins/lang"; | ||||
| import { router } from "./router"; | ||||
| import { appName } from "./util.ts"; | ||||
|  | ||||
| @@ -22,6 +23,7 @@ const app = createApp({ | ||||
|         mobile, | ||||
|         datetime, | ||||
|         publicMixin, | ||||
|         lang, | ||||
|     ], | ||||
|     data() { | ||||
|         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: {}, | ||||
|             settingsLoaded: false, | ||||
|         }; | ||||
|     }, | ||||
|  | ||||
|             subMenus: { | ||||
|     computed: { | ||||
|         currentPage() { | ||||
|             let pathEnd = useRoute().path.split("/").at(-1); | ||||
|             if (pathEnd == "settings" || pathEnd == null) { | ||||
|                 return "general"; | ||||
|             } | ||||
|             return pathEnd; | ||||
|         }, | ||||
|  | ||||
|         subMenus() { | ||||
|             return { | ||||
|                 general: { | ||||
|                     title: this.$t("General"), | ||||
|                 }, | ||||
| @@ -67,17 +79,7 @@ export default { | ||||
|                 about: { | ||||
|                     title: this.$t("About"), | ||||
|                 }, | ||||
|             }, | ||||
|         }; | ||||
|     }, | ||||
|  | ||||
|     computed: { | ||||
|         currentPage() { | ||||
|             let pathEnd = useRoute().path.split("/").at(-1); | ||||
|             if (pathEnd == "settings" || pathEnd == null) { | ||||
|                 return "general"; | ||||
|             } | ||||
|             return pathEnd; | ||||
|             }; | ||||
|         }, | ||||
|     }, | ||||
|  | ||||
|   | ||||
| @@ -83,6 +83,7 @@ describe("Init", () => { | ||||
|     }); | ||||
|  | ||||
|     // Settings Page | ||||
|     /* | ||||
|     describe("Settings", () => { | ||||
|         beforeEach(async () => { | ||||
|             await page.goto(baseURL + "/settings"); | ||||
| @@ -261,6 +262,7 @@ describe("Init", () => { | ||||
|         //     }, { timeout: 3000 }); | ||||
|         // }); | ||||
|     }); | ||||
|      */ | ||||
|  | ||||
|     /* | ||||
|      * TODO | ||||
|   | ||||
		Reference in New Issue
	
	Block a user