commit
b604910bbb
@ -0,0 +1,3 @@
|
|||||||
|
package-lock.json
|
||||||
|
test.js
|
||||||
|
languages/
|
@ -0,0 +1,78 @@
|
|||||||
|
// Need to use es6 to read language files
|
||||||
|
|
||||||
|
import fs from "fs";
|
||||||
|
import path from "path";
|
||||||
|
import util from "util";
|
||||||
|
|
||||||
|
// https://stackoverflow.com/questions/13786160/copy-folder-recursively-in-node-js
|
||||||
|
/**
|
||||||
|
* Look ma, it's cp -R.
|
||||||
|
* @param {string} src The path to the thing to copy.
|
||||||
|
* @param {string} dest The path to the new copy.
|
||||||
|
*/
|
||||||
|
const copyRecursiveSync = function (src, dest) {
|
||||||
|
let exists = fs.existsSync(src);
|
||||||
|
let stats = exists && fs.statSync(src);
|
||||||
|
let isDirectory = exists && stats.isDirectory();
|
||||||
|
if (isDirectory) {
|
||||||
|
fs.mkdirSync(dest);
|
||||||
|
fs.readdirSync(src).forEach(function (childItemName) {
|
||||||
|
copyRecursiveSync(path.join(src, childItemName),
|
||||||
|
path.join(dest, childItemName));
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
fs.copyFileSync(src, dest);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
console.log(process.argv)
|
||||||
|
const baseLangCode = process.argv[2] || "zh-HK";
|
||||||
|
console.log("Base Lang: " + baseLangCode);
|
||||||
|
fs.rmdirSync("./languages", { recursive: true });
|
||||||
|
copyRecursiveSync("../../src/languages", "./languages");
|
||||||
|
|
||||||
|
const en = (await import("./languages/en.js")).default;
|
||||||
|
const baseLang = (await import(`./languages/${baseLangCode}.js`)).default;
|
||||||
|
const files = fs.readdirSync("./languages");
|
||||||
|
console.log(files);
|
||||||
|
for (const file of files) {
|
||||||
|
if (file.endsWith(".js")) {
|
||||||
|
console.log("Processing " + file);
|
||||||
|
const lang = await import("./languages/" + file);
|
||||||
|
|
||||||
|
let obj;
|
||||||
|
|
||||||
|
if (lang.default) {
|
||||||
|
console.log("is js module");
|
||||||
|
obj = lang.default;
|
||||||
|
} else {
|
||||||
|
console.log("empty file");
|
||||||
|
obj = {
|
||||||
|
languageName: "<Your Language name in your language (not in English)>"
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
// En first
|
||||||
|
for (const key in en) {
|
||||||
|
if (! obj[key]) {
|
||||||
|
obj[key] = en[key];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Base second
|
||||||
|
for (const key in baseLang) {
|
||||||
|
if (! obj[key]) {
|
||||||
|
obj[key] = key;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const code = "export default " + util.inspect(obj, {
|
||||||
|
depth: null,
|
||||||
|
});
|
||||||
|
|
||||||
|
fs.writeFileSync(`../../src/languages/${file}`, code);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fs.rmdirSync("./languages", { recursive: true });
|
||||||
|
console.log("Done, fix the format by eslint now");
|
@ -0,0 +1,12 @@
|
|||||||
|
{
|
||||||
|
"name": "update-language-files",
|
||||||
|
"type": "module",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"description": "",
|
||||||
|
"main": "index.js",
|
||||||
|
"scripts": {
|
||||||
|
"test": "echo \"Error: no test specified\" && exit 1"
|
||||||
|
},
|
||||||
|
"author": "",
|
||||||
|
"license": "ISC"
|
||||||
|
}
|
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,10 @@
|
|||||||
|
# How to translate
|
||||||
|
|
||||||
|
1. Fork this repo.
|
||||||
|
2. Create a language file. (e.g. `zh-TW.js`) The filename must be ISO language code: http://www.lingoes.net/en/translator/langcode.htm
|
||||||
|
3. `npm run update-language-files --base-lang=de-DE`
|
||||||
|
6. Your language file should be filled in. You can translate now.
|
||||||
|
7. Make a [pull request](https://github.com/louislam/uptime-kuma/pulls) when you have done.
|
||||||
|
|
||||||
|
If you do not have programming skills, let me know in [Issues section](https://github.com/louislam/uptime-kuma/issues). I will assist you. 😏
|
||||||
|
|
@ -0,0 +1,110 @@
|
|||||||
|
export default {
|
||||||
|
languageName: "Danish",
|
||||||
|
Settings: "Indstillinger",
|
||||||
|
Dashboard: "Dashboard",
|
||||||
|
"New Update": "Opdatering tilgængelig",
|
||||||
|
Language: "Sprog",
|
||||||
|
Appearance: "Udseende",
|
||||||
|
Theme: "Tema",
|
||||||
|
General: "Generelt",
|
||||||
|
Version: "Version",
|
||||||
|
"Check Update On GitHub": "Tjek efter opdateringer på Github",
|
||||||
|
List: "Liste",
|
||||||
|
Add: "Tilføj",
|
||||||
|
"Add New Monitor": "Tilføj ny Overvåger",
|
||||||
|
"Quick Stats": "Oversigt",
|
||||||
|
Up: "Aktiv",
|
||||||
|
Down: "Inaktiv",
|
||||||
|
Pending: "Afventer",
|
||||||
|
Unknown: "Ukendt",
|
||||||
|
Pause: "Pause",
|
||||||
|
pauseDashboardHome: "Pauset",
|
||||||
|
Name: "Navn",
|
||||||
|
Status: "Status",
|
||||||
|
DateTime: "Dato / Tid",
|
||||||
|
Message: "Beskeder",
|
||||||
|
"No important events": "Inden vigtige begivenheder",
|
||||||
|
Resume: "Fortsæt",
|
||||||
|
Edit: "Rediger",
|
||||||
|
Delete: "Slet",
|
||||||
|
Current: "Aktuelt",
|
||||||
|
Uptime: "Oppetid",
|
||||||
|
"Cert Exp.": "Certifikatets udløb",
|
||||||
|
days: "Dage",
|
||||||
|
day: "Dag",
|
||||||
|
"-day": "-Dage",
|
||||||
|
hour: "Timer",
|
||||||
|
"-hour": "-Timer",
|
||||||
|
checkEverySecond: "Tjek hvert {0} sekund",
|
||||||
|
"Avg.": "Gennemsnit",
|
||||||
|
Response: " Respons",
|
||||||
|
Ping: "Ping",
|
||||||
|
"Monitor Type": "Overvåger Type",
|
||||||
|
Keyword: "Nøgleord",
|
||||||
|
"Friendly Name": "Visningsnavn",
|
||||||
|
URL: "URL",
|
||||||
|
Hostname: "Hostname",
|
||||||
|
Port: "Port",
|
||||||
|
"Heartbeat Interval": "Taktinterval",
|
||||||
|
Retries: "Gentagelser",
|
||||||
|
retriesDescription: "Maksimalt antal gentagelser, før tjenesten markeres som inaktiv og sender en meddelelse.",
|
||||||
|
Advanced: "Avanceret",
|
||||||
|
ignoreTLSError: "Ignorere TLS/SSL web fejl",
|
||||||
|
"Upside Down Mode": "Omvendt tilstand",
|
||||||
|
upsideDownModeDescription: "Håndter tilstanden omvendt. Hvis tjenesten er tilgængelig, vises den som inaktiv.",
|
||||||
|
"Max. Redirects": "Maks. Omdirigeringer",
|
||||||
|
maxRedirectDescription: "Maksimalt antal omdirigeringer, der skal følges. Indstil til 0 for at deaktivere omdirigeringer.",
|
||||||
|
"Accepted Status Codes": "Tilladte HTTP-Statuskoder",
|
||||||
|
acceptedStatusCodesDescription: "Vælg de statuskoder, der stadig skal vurderes som vellykkede.",
|
||||||
|
Save: "Gem",
|
||||||
|
Notifications: "Underretninger",
|
||||||
|
"Not available, please setup.": "Ikke tilgængelige, opsæt venligst.",
|
||||||
|
"Setup Notification": "Opsæt underretninger",
|
||||||
|
Light: "Lys",
|
||||||
|
Dark: "Mørk",
|
||||||
|
Auto: "Auto",
|
||||||
|
"Theme - Heartbeat Bar": "Tema - Tidslinje",
|
||||||
|
Normal: "Normal",
|
||||||
|
Bottom: "Bunden",
|
||||||
|
None: "Ingen",
|
||||||
|
Timezone: "Tidszone",
|
||||||
|
"Search Engine Visibility": "Søgemaskine synlighed",
|
||||||
|
"Allow indexing": "Tillad indeksering",
|
||||||
|
"Discourage search engines from indexing site": "Frabed søgemaskiner at indeksere webstedet",
|
||||||
|
"Change Password": "Ændre adgangskode",
|
||||||
|
"Current Password": "Nuværende adgangskode",
|
||||||
|
"New Password": "Ny adgangskode",
|
||||||
|
"Repeat New Password": "Gentag den nye adgangskode",
|
||||||
|
passwordNotMatchMsg: "Adgangskoderne er ikke ens.",
|
||||||
|
"Update Password": "Opdater adgangskode",
|
||||||
|
"Disable Auth": "Deaktiver autentificering",
|
||||||
|
"Enable Auth": "Aktiver autentificering",
|
||||||
|
Logout: "Log ud",
|
||||||
|
notificationDescription: "Tildel underretninger til Overvåger(e), så denne funktion træder i kraft.",
|
||||||
|
Leave: "Verlassen",
|
||||||
|
"I understand, please disable": "Jeg er indforstået, deaktiver venligst",
|
||||||
|
Confirm: "Bekræft",
|
||||||
|
Yes: "Ja",
|
||||||
|
No: "Nej",
|
||||||
|
Username: "Brugernavn",
|
||||||
|
Password: "Adgangskode",
|
||||||
|
"Remember me": "Husk mig",
|
||||||
|
Login: "Log ind",
|
||||||
|
"No Monitors, please": "Ingen Overvågere",
|
||||||
|
"add one": "tilføj en",
|
||||||
|
"Notification Type": "Underretningstype",
|
||||||
|
Email: "E-Mail",
|
||||||
|
Test: "Test",
|
||||||
|
"Certificate Info": "Certifikatoplysninger",
|
||||||
|
keywordDescription: "Søg efter et søgeord i almindelig HTML- eller JSON -output. Bemærk, at der skelnes mellem store og små bogstaver.",
|
||||||
|
deleteMonitorMsg: "Er du sikker på, at du vil slette overvågeren?",
|
||||||
|
deleteNotificationMsg: "Er du sikker på, at du vil slette denne underretning for alle overvågere? ",
|
||||||
|
resoverserverDescription: "Cloudflare er standardserveren, den kan til enhver tid ændres.",
|
||||||
|
"Resolver Server": "Navne-server",
|
||||||
|
rrtypeDescription: "Vælg den type RR, du vil overvåge.",
|
||||||
|
"Last Result": "Seneste resultat",
|
||||||
|
pauseMonitorMsg: "Er du sikker på, at du vil pause Overvågeren?",
|
||||||
|
"Create your admin account": "Opret din administratorkonto",
|
||||||
|
"Repeat Password": "Gentag adgangskoden",
|
||||||
|
"Resource Record Type": "Resource Record Type"
|
||||||
|
}
|
@ -0,0 +1,110 @@
|
|||||||
|
export default {
|
||||||
|
languageName: "日本語",
|
||||||
|
checkEverySecond: "{0}秒ごとにチェックします。",
|
||||||
|
"Avg.": "平均 ",
|
||||||
|
retriesDescription: "サービスがダウンとしてマークされ、通知が送信されるまでの最大リトライ数",
|
||||||
|
ignoreTLSError: "HTTPS ウェブサイトの TLS/SSL エラーを無視する",
|
||||||
|
upsideDownModeDescription: "ステータスの扱いを逆にします。サービスに到達可能な場合は、DOWNとなる。",
|
||||||
|
maxRedirectDescription: "フォローするリダイレクトの最大数。リダイレクトを無効にするには0を設定する。",
|
||||||
|
acceptedStatusCodesDescription: "成功した応答とみなされるステータスコードを選択する。",
|
||||||
|
passwordNotMatchMsg: "繰り返しのパスワードが一致しません。",
|
||||||
|
notificationDescription: "監視を機能させるには、監視に通知を割り当ててください。",
|
||||||
|
keywordDescription: "プレーンHTMLまたはJSON応答でキーワードを検索し、大文字と小文字を区別します",
|
||||||
|
pauseDashboardHome: "一時停止",
|
||||||
|
deleteMonitorMsg: "この監視を削除してよろしいですか?",
|
||||||
|
deleteNotificationMsg: "全ての監視のこの通知を削除してよろしいですか?",
|
||||||
|
resoverserverDescription: "Cloudflareがデフォルトのサーバーですが、いつでもリゾルバサーバーを変更できます。",
|
||||||
|
rrtypeDescription: "監視するRRタイプを選択します",
|
||||||
|
pauseMonitorMsg: "一時停止しますか?",
|
||||||
|
Settings: "設定",
|
||||||
|
Dashboard: "ダッシュボード",
|
||||||
|
"New Update": "New Update",
|
||||||
|
Language: "言語",
|
||||||
|
Appearance: "外観",
|
||||||
|
Theme: "テーマ",
|
||||||
|
General: "General",
|
||||||
|
Version: "バージョン",
|
||||||
|
"Check Update On GitHub": "GitHubでアップデートを確認する",
|
||||||
|
List: "一覧",
|
||||||
|
Add: "追加",
|
||||||
|
"Add New Monitor": "監視の追加",
|
||||||
|
"Quick Stats": "統計",
|
||||||
|
Up: "Up",
|
||||||
|
Down: "Down",
|
||||||
|
Pending: "中止",
|
||||||
|
Unknown: "不明",
|
||||||
|
Pause: "一時停止",
|
||||||
|
Name: "名前",
|
||||||
|
Status: "ステータス",
|
||||||
|
DateTime: "日時",
|
||||||
|
Message: "メッセージ",
|
||||||
|
"No important events": "重要なイベントなし",
|
||||||
|
Resume: "再開",
|
||||||
|
Edit: "編集",
|
||||||
|
Delete: "削除",
|
||||||
|
Current: "現在",
|
||||||
|
Uptime: "起動時間",
|
||||||
|
"Cert Exp.": "証明書有効期限",
|
||||||
|
days: "日間",
|
||||||
|
day: "日",
|
||||||
|
"-day": "-日",
|
||||||
|
hour: "時間",
|
||||||
|
"-hour": "-時間",
|
||||||
|
Response: "レスポンス",
|
||||||
|
Ping: "Ping",
|
||||||
|
"Monitor Type": "監視タイプ",
|
||||||
|
Keyword: "キーワード",
|
||||||
|
"Friendly Name": "Friendly Name",
|
||||||
|
URL: "URL",
|
||||||
|
Hostname: "ホスト名",
|
||||||
|
Port: "ポート",
|
||||||
|
"Heartbeat Interval": "監視間隔",
|
||||||
|
Retries: "Retries",
|
||||||
|
Advanced: "Advanced",
|
||||||
|
"Upside Down Mode": "Upside Down Mode",
|
||||||
|
"Max. Redirects": "最大リダイレクト数",
|
||||||
|
"Accepted Status Codes": "承認されたステータスコード",
|
||||||
|
Save: "保存",
|
||||||
|
Notifications: "通知",
|
||||||
|
"Not available, please setup.": "利用できません。設定してください。",
|
||||||
|
"Setup Notification": "通知設定",
|
||||||
|
Light: "Light",
|
||||||
|
Dark: "Dark",
|
||||||
|
Auto: "Auto",
|
||||||
|
"Theme - Heartbeat Bar": "Theme - Heartbeat Bar",
|
||||||
|
Normal: "通常",
|
||||||
|
Bottom: "下部",
|
||||||
|
None: "なし",
|
||||||
|
Timezone: "タイムゾーン",
|
||||||
|
"Search Engine Visibility": "検索エンジンでの表示",
|
||||||
|
"Allow indexing": "インデックス作成を許可する",
|
||||||
|
"Discourage search engines from indexing site": "検索エンジンにインデックスさせないようにする",
|
||||||
|
"Change Password": "パスワード変更",
|
||||||
|
"Current Password": "現在のパスワード",
|
||||||
|
"New Password": "新しいパスワード",
|
||||||
|
"Repeat New Password": "確認のため新しいパスワードをもう一度",
|
||||||
|
"Update Password": "パスワードの更新",
|
||||||
|
"Disable Auth": "認証の無効化",
|
||||||
|
"Enable Auth": "認証の有効化",
|
||||||
|
Logout: "ログアウト",
|
||||||
|
Leave: "作業を中止する",
|
||||||
|
"I understand, please disable": "理解した上で無効化する",
|
||||||
|
Confirm: "確認",
|
||||||
|
Yes: "はい",
|
||||||
|
No: "いいえ",
|
||||||
|
Username: "ユーザー名",
|
||||||
|
Password: "パスワード",
|
||||||
|
"Remember me": "パスワードを忘れた場合",
|
||||||
|
Login: "ログイン",
|
||||||
|
"No Monitors, please": "監視がありません",
|
||||||
|
"add one": "add one",
|
||||||
|
"Notification Type": "通知タイプ",
|
||||||
|
Email: "Eメール",
|
||||||
|
Test: "テスト",
|
||||||
|
"Certificate Info": "証明書情報",
|
||||||
|
"Resolver Server": "問い合わせ先DNSサーバ",
|
||||||
|
"Resource Record Type": "DNSレコード設定",
|
||||||
|
"Last Result": "最終結果",
|
||||||
|
"Create your admin account": "Create your admin account",
|
||||||
|
"Repeat Password": "Repeat Password"
|
||||||
|
}
|
Loading…
Reference in new issue