committed by
							
								
								GitHub
							
						
					
				
				 31 changed files with 2919 additions and 2471 deletions
			
			
		@ -0,0 +1,3 @@ | 
				
			|||||
 | 
					package-lock.json | 
				
			||||
 | 
					test.js | 
				
			||||
 | 
					languages/ | 
				
			||||
@ -0,0 +1,77 @@ | 
				
			|||||
 | 
					// 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 }); | 
				
			||||
@ -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
									
								
							
						
					@ -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 when you have done. | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					If you do not have programming skills, let me know in Issue section. I will assist you. 😏 | 
				
			||||
 | 
					
 | 
				
			||||
@ -0,0 +1,109 @@ | 
				
			|||||
 | 
					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", | 
				
			||||
 | 
					} | 
				
			||||
@ -0,0 +1,108 @@ | 
				
			|||||
 | 
					export default { | 
				
			||||
 | 
					    languageName: "Français (France)", | 
				
			||||
 | 
					    Settings: "Paramètres", | 
				
			||||
 | 
					    Dashboard: "Dashboard", | 
				
			||||
 | 
					    "New Update": "Mise à jour disponible", | 
				
			||||
 | 
					    Language: "Langue", | 
				
			||||
 | 
					    Appearance: "Apparence", | 
				
			||||
 | 
					    Theme: "Thème", | 
				
			||||
 | 
					    General: "Général", | 
				
			||||
 | 
					    Version: "Version", | 
				
			||||
 | 
					    "Check Update On GitHub": "Consulter les mises à jour sur Github", | 
				
			||||
 | 
					    List: "Lister", | 
				
			||||
 | 
					    Add: "Ajouter", | 
				
			||||
 | 
					    "Add New Monitor": "Ajouter un nouveau check", | 
				
			||||
 | 
					    "Quick Stats": "Résumé", | 
				
			||||
 | 
					    Up: "En ligne", | 
				
			||||
 | 
					    Down: "Hors ligne", | 
				
			||||
 | 
					    Pending: "Dans la file d'attente", | 
				
			||||
 | 
					    Unknown: "Inconnu", | 
				
			||||
 | 
					    Pause: "En Pause", | 
				
			||||
 | 
					    pauseDashboardHome: "Éléments mis en pause", | 
				
			||||
 | 
					    Name: "Nom", | 
				
			||||
 | 
					    Status: "État", | 
				
			||||
 | 
					    DateTime: "Heure", | 
				
			||||
 | 
					    Message: "Messages", | 
				
			||||
 | 
					    "No important events": "Pas d'évènements important", | 
				
			||||
 | 
					    Resume: "Reprendre", | 
				
			||||
 | 
					    Edit: "Modifier", | 
				
			||||
 | 
					    Delete: "Supprimer", | 
				
			||||
 | 
					    Current: "Actuellement", | 
				
			||||
 | 
					    Uptime: "Uptime", | 
				
			||||
 | 
					    "Cert Exp.": "Cert Exp.", | 
				
			||||
 | 
					    days: "Jours", | 
				
			||||
 | 
					    day: "Jour", | 
				
			||||
 | 
					    "-day": "Demi-Journée", | 
				
			||||
 | 
					    hour: "Heure", | 
				
			||||
 | 
					    "-hour": "Demi-Heure", | 
				
			||||
 | 
					    checkEverySecond: "Vérifier toutes les {0} secondes", | 
				
			||||
 | 
					    "Avg.": "Moy.", | 
				
			||||
 | 
					    Response: "Réponse", | 
				
			||||
 | 
					    Ping: "Ping", | 
				
			||||
 | 
					    "Monitor Type": "Type de Monitoring", | 
				
			||||
 | 
					    Keyword: "Mot-clé", | 
				
			||||
 | 
					    "Friendly Name": "Nom d'affichage", | 
				
			||||
 | 
					    URL: "URL", | 
				
			||||
 | 
					    Hostname: "Nom d'hôte", | 
				
			||||
 | 
					    Port: "Port", | 
				
			||||
 | 
					    "Heartbeat Interval": "Intervale de vérifications", | 
				
			||||
 | 
					    Retries: "Essais", | 
				
			||||
 | 
					    retriesDescription: "Nombre d'essais avant que le service soit déclaré hors-ligne.", | 
				
			||||
 | 
					    Advanced: "Avancé", | 
				
			||||
 | 
					    ignoreTLSError: "Ignorer les erreurs liées au certificat SSL/TLS", | 
				
			||||
 | 
					    "Upside Down Mode": "Mode inversé", | 
				
			||||
 | 
					    upsideDownModeDescription: "Si le service est en ligne il sera alors noté hors-ligne et vice-versa.", | 
				
			||||
 | 
					    "Max. Redirects": "Redirections", | 
				
			||||
 | 
					    maxRedirectDescription: "Nombre maximal de redirections avant que le service soit noté hors-ligne.", | 
				
			||||
 | 
					    "Accepted Status Codes": "Codes HTTP", | 
				
			||||
 | 
					    acceptedStatusCodesDescription: "Si les codes HTTP reçus sont ceux séléctionnés, alors le serveur sera noté en ligne.", | 
				
			||||
 | 
					    Save: "Sauvegarder", | 
				
			||||
 | 
					    Notifications: "Notifications", | 
				
			||||
 | 
					    "Not available, please setup.": "Créez des notifications depuis les paramètres.", | 
				
			||||
 | 
					    "Setup Notification": "Créer une notification", | 
				
			||||
 | 
					    Light: "Clair", | 
				
			||||
 | 
					    Dark: "Sombre", | 
				
			||||
 | 
					    Auto: "Automatique", | 
				
			||||
 | 
					    "Theme - Heartbeat Bar": "Voir les services monitorés", | 
				
			||||
 | 
					    Normal: "Général", | 
				
			||||
 | 
					    Bottom: "Au dessus", | 
				
			||||
 | 
					    None: "Neutre", | 
				
			||||
 | 
					    Timezone: "Fuseau Horaire", | 
				
			||||
 | 
					    "Search Engine Visibility": "SEO", | 
				
			||||
 | 
					    "Allow indexing": "Autoriser l'indexation par des moteurs de recherche", | 
				
			||||
 | 
					    "Discourage search engines from indexing site": "Empêche les moteurs de recherche d'indexer votre site", | 
				
			||||
 | 
					    "Change Password": "Changer le mot de passe", | 
				
			||||
 | 
					    "Current Password": "Mot de passe actuel", | 
				
			||||
 | 
					    "New Password": "Nouveau mot de passe", | 
				
			||||
 | 
					    "Repeat New Password": "Répéter votre nouveau mot de passe", | 
				
			||||
 | 
					    passwordNotMatchMsg: "Les mots de passe ne correspondent pas", | 
				
			||||
 | 
					    "Update Password": "Mettre à jour le mot de passe", | 
				
			||||
 | 
					    "Disable Auth": "Désactiver l'authentification intégrée", | 
				
			||||
 | 
					    "Enable Auth": "Activer l'authentification", | 
				
			||||
 | 
					    Logout: "Se déconnecter", | 
				
			||||
 | 
					    notificationDescription: "Une fois ajoutée, vous devez l'activer manuellement dans les paramètres de vos hosts.", | 
				
			||||
 | 
					    Leave: "Quitter", | 
				
			||||
 | 
					    "I understand, please disable": "Je comprends, je l'ai désactivé", | 
				
			||||
 | 
					    Confirm: "Confirmer", | 
				
			||||
 | 
					    Yes: "Oui", | 
				
			||||
 | 
					    No: "Non", | 
				
			||||
 | 
					    Username: "Nom d'utilisateur", | 
				
			||||
 | 
					    Password: "Mot de passe", | 
				
			||||
 | 
					    "Remember me": "Se souvenir de moi", | 
				
			||||
 | 
					    Login: "Se connecter", | 
				
			||||
 | 
					    "No Monitors, please": "Pas de monitor, veuillez ", | 
				
			||||
 | 
					    "add one": "en ajouter un.", | 
				
			||||
 | 
					    "Notification Type": "Type de notification", | 
				
			||||
 | 
					    Email: "Email", | 
				
			||||
 | 
					    Test: "Tester", | 
				
			||||
 | 
					    keywordDescription: "Le mot clé sera cherché dans la réponse HTML/JSON reçue du site internet.", | 
				
			||||
 | 
					    "Certificate Info": "Des informations sur le certificat SSL", | 
				
			||||
 | 
					    deleteMonitorMsg: "Êtes-vous sûr de vouloir supprimer ce monitor ?", | 
				
			||||
 | 
					    deleteNotificationMsg: "Êtes-vous sûr de vouloir supprimer ce type de notifications ? Une fois désactivée, les services qui l'utilisent ne pourront plus envoyer de notifications.", | 
				
			||||
 | 
					    "Resolver Server": "Serveur DNS utilisé", | 
				
			||||
 | 
					    "Resource Record Type": "Type d'enregistrement DNS recherché", | 
				
			||||
 | 
					    resoverserverDescription: "Le DNS de cloudflare est utilisé par défaut, mais vous pouvez le changer si vous le souhaitez.", | 
				
			||||
 | 
					    rrtypeDescription: "Veuillez séléctionner un type d'enregistrement DNS", | 
				
			||||
 | 
					    pauseMonitorMsg: "Are you sure want to pause?", | 
				
			||||
 | 
					    "Last Result": "Last Result" | 
				
			||||
 | 
					} | 
				
			||||
					Loading…
					
					
				
		Reference in new issue