diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 0b77209..1e89841 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -11,6 +11,7 @@ Thank you for your interest in contributing to FileRise! We appreciate your help
- [Coding Guidelines](#coding-guidelines)
- [Documentation](#documentation)
- [Questions and Support](#questions-and-support)
+- [Adding New Language Translations](#adding-new-language-translations)
## Getting Started
@@ -87,6 +88,156 @@ If you notice any areas in the documentation that need improvement or updating,
If you have any questions, ideas, or need support, please open an issue or join our discussion on [GitHub Discussions](https://github.com/error311/FileRise/discussions). We’re here to help and appreciate your contributions.
+## Adding New Language Translations
+
+FileRise supports internationalization (i18n) and localization via a central translation file (`i18n.js`). If you would like to contribute a new language translation, please follow these steps:
+
+1. **Update `i18n.js`:**
+ Open the `i18n.js` file located in the `js` directory. Within the `translations` object, add a new property using the appropriate [ISO language code](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes) as the key. Copy the structure from an existing language block and translate each key.
+
+ **Example (for German):**
+
+ ```js
+ de: {
+ "please_log_in_to_continue": "Bitte melden Sie sich an, um fortzufahren.",
+ "no_files_selected": "Keine Dateien ausgewählt.",
+ "confirm_delete_files": "Sind Sie sicher, dass Sie {count} ausgewählte Datei(en) löschen möchten?",
+ "element_not_found": "Element mit der ID \"{id}\" wurde nicht gefunden.",
+ "search_placeholder": "Suche nach Dateien oder Tags...",
+ "file_name": "Dateiname",
+ "date_modified": "Änderungsdatum",
+ "upload_date": "Hochladedatum",
+ "file_size": "Dateigröße",
+ "uploader": "Hochgeladen von",
+ "enter_totp_code": "Geben Sie den TOTP-Code ein",
+ "use_recovery_code_instead": "Verwenden Sie stattdessen den Wiederherstellungscode",
+ "enter_recovery_code": "Geben Sie den Wiederherstellungscode ein",
+ "editing": "Bearbeitung",
+ "decrease_font": "A-",
+ "increase_font": "A+",
+ "save": "Speichern",
+ "close": "Schließen",
+ "no_files_found": "Keine Dateien gefunden.",
+ "switch_to_table_view": "Zur Tabellenansicht wechseln",
+ "switch_to_gallery_view": "Zur Galerieansicht wechseln",
+ "share_file": "Datei teilen",
+ "set_expiration": "Ablauf festlegen:",
+ "password_optional": "Passwort (optional):",
+ "generate_share_link": "Freigabelink generieren",
+ "shareable_link": "Freigabelink:",
+ "copy_link": "Link kopieren",
+ "tag_file": "Datei taggen",
+ "tag_name": "Tagname:",
+ "tag_color": "Tagfarbe:",
+ "save_tag": "Tag speichern",
+ "files_in": "Dateien in",
+ "light_mode": "Heller Modus",
+ "dark_mode": "Dunkler Modus",
+ "upload_instruction": "Ziehen Sie Dateien/Ordner hierher oder klicken Sie auf 'Dateien auswählen'",
+ "no_files_selected_default": "Keine Dateien ausgewählt",
+ "choose_files": "Dateien auswählen",
+ "delete_selected": "Ausgewählte löschen",
+ "copy_selected": "Ausgewählte kopieren",
+ "move_selected": "Ausgewählte verschieben",
+ "tag_selected": "Ausgewählte taggen",
+ "download_zip": "Zip herunterladen",
+ "extract_zip": "Zip entpacken",
+ "preview": "Vorschau",
+ "edit": "Bearbeiten",
+ "rename": "Umbenennen",
+ "trash_empty": "Papierkorb ist leer.",
+ "no_trash_selected": "Keine Elemente im Papierkorb für die Wiederherstellung ausgewählt.",
+
+ // Additional keys for HTML translations:
+ "title": "FileRise",
+ "header_title": "FileRise",
+ "logout": "Abmelden",
+ "change_password": "Passwort ändern",
+ "restore_text": "Wiederherstellen oder",
+ "delete_text": "Papierkorbeinträge löschen",
+ "restore_selected": "Ausgewählte wiederherstellen",
+ "restore_all": "Alle wiederherstellen",
+ "delete_selected_trash": "Ausgewählte löschen",
+ "delete_all": "Alle löschen",
+ "upload_header": "Dateien/Ordner hochladen",
+
+ // Folder Management keys:
+ "folder_navigation": "Ordnernavigation & Verwaltung",
+ "create_folder": "Ordner erstellen",
+ "create_folder_title": "Ordner erstellen",
+ "enter_folder_name": "Geben Sie den Ordnernamen ein",
+ "cancel": "Abbrechen",
+ "create": "Erstellen",
+ "rename_folder": "Ordner umbenennen",
+ "rename_folder_title": "Ordner umbenennen",
+ "rename_folder_placeholder": "Neuen Ordnernamen eingeben",
+ "delete_folder": "Ordner löschen",
+ "delete_folder_title": "Ordner löschen",
+ "delete_folder_message": "Sind Sie sicher, dass Sie diesen Ordner löschen möchten?",
+ "folder_help": "Ordnerhilfe",
+ "folder_help_item_1": "Klicken Sie auf einen Ordner, um dessen Dateien anzuzeigen.",
+ "folder_help_item_2": "Verwenden Sie [-] um zu minimieren und [+] um zu erweitern.",
+ "folder_help_item_3": "Klicken Sie auf \"Ordner erstellen\", um einen Unterordner hinzuzufügen.",
+ "folder_help_item_4": "Um einen Ordner umzubenennen oder zu löschen, wählen Sie ihn und klicken Sie auf die entsprechende Schaltfläche.",
+
+ // File List keys:
+ "file_list_title": "Dateien in (Root)",
+ "delete_files": "Dateien löschen",
+ "delete_selected_files_title": "Ausgewählte Dateien löschen",
+ "delete_files_message": "Sind Sie sicher, dass Sie die ausgewählten Dateien löschen möchten?",
+ "copy_files": "Dateien kopieren",
+ "copy_files_title": "Ausgewählte Dateien kopieren",
+ "copy_files_message": "Wählen Sie einen Zielordner, um die ausgewählten Dateien zu kopieren:",
+ "move_files": "Dateien verschieben",
+ "move_files_title": "Ausgewählte Dateien verschieben",
+ "move_files_message": "Wählen Sie einen Zielordner, um die ausgewählten Dateien zu verschieben:",
+ "move": "Verschieben",
+ "extract_zip_button": "Zip entpacken",
+ "download_zip_title": "Ausgewählte Dateien als Zip herunterladen",
+ "download_zip_prompt": "Geben Sie einen Namen für die Zip-Datei ein:",
+ "zip_placeholder": "dateien.zip",
+
+ // Login Form keys:
+ "login": "Anmelden",
+ "remember_me": "Angemeldet bleiben",
+ "login_oidc": "Mit OIDC anmelden",
+ "basic_http_login": "HTTP-Basisauthentifizierung verwenden",
+
+ // Change Password keys:
+ "change_password_title": "Passwort ändern",
+ "old_password": "Altes Passwort",
+ "new_password": "Neues Passwort",
+ "confirm_new_password": "Neues Passwort bestätigen",
+
+ // Add User keys:
+ "create_new_user_title": "Neuen Benutzer erstellen",
+ "username": "Benutzername:",
+ "password": "Passwort:",
+ "grant_admin": "Admin-Rechte vergeben",
+ "save_user": "Benutzer speichern",
+
+ // Remove User keys:
+ "remove_user_title": "Benutzer entfernen",
+ "select_user_remove": "Wählen Sie einen Benutzer zum Entfernen:",
+ "delete_user": "Benutzer löschen",
+
+ // Rename File keys:
+ "rename_file_title": "Datei umbenennen",
+ "rename_file_placeholder": "Neuen Dateinamen eingeben",
+
+ // Custom Confirm Modal keys:
+ "yes": "Ja",
+ "no": "Nein",
+ "delete": "Löschen",
+ "download": "Herunterladen",
+ "upload": "Hochladen",
+ "copy": "Kopieren",
+ "extract": "Entpacken",
+
+ // Dark Mode Toggle
+ "dark_mode_toggle": "Dunkler Modus"
+ }
+
---
Thank you for helping to improve FileRise and happy coding!
diff --git a/js/authModals.js b/js/authModals.js
index da7692f..1126a1b 100644
--- a/js/authModals.js
+++ b/js/authModals.js
@@ -206,6 +206,7 @@ export function openUserPanel() {
+
diff --git a/js/i18n.js b/js/i18n.js
index 3337701..dbee6ee 100644
--- a/js/i18n.js
+++ b/js/i18n.js
@@ -137,7 +137,8 @@ const translations = {
"extract": "Extract",
// Dark Mode Toggle
- "dark_mode_toggle": "Dark Mode"
+ "dark_mode_toggle": "Dark Mode",
+ "light_mode_toggle": "Light Mode"
},
es: { /* Spanish translations */
"please_log_in_to_continue": "Por favor, inicie sesión para continuar.",
@@ -416,6 +417,145 @@ const translations = {
// Dark Mode Toggle
"dark_mode_toggle": "Mode sombre"
+ },
+ de: {
+ "please_log_in_to_continue": "Bitte melden Sie sich an, um fortzufahren.",
+ "no_files_selected": "Keine Dateien ausgewählt.",
+ "confirm_delete_files": "Sind Sie sicher, dass Sie {count} ausgewählte Datei(en) löschen möchten?",
+ "element_not_found": "Element mit der ID \"{id}\" wurde nicht gefunden.",
+ "search_placeholder": "Suche nach Dateien oder Tags...",
+ "file_name": "Dateiname",
+ "date_modified": "Änderungsdatum",
+ "upload_date": "Hochladedatum",
+ "file_size": "Dateigröße",
+ "uploader": "Hochgeladen von",
+ "enter_totp_code": "Geben Sie den TOTP-Code ein",
+ "use_recovery_code_instead": "Verwenden Sie stattdessen den Wiederherstellungscode",
+ "enter_recovery_code": "Geben Sie den Wiederherstellungscode ein",
+ "editing": "Bearbeitung",
+ "decrease_font": "A-",
+ "increase_font": "A+",
+ "save": "Speichern",
+ "close": "Schließen",
+ "no_files_found": "Keine Dateien gefunden.",
+ "switch_to_table_view": "Zur Tabellenansicht wechseln",
+ "switch_to_gallery_view": "Zur Galerieansicht wechseln",
+ "share_file": "Datei teilen",
+ "set_expiration": "Ablauf festlegen:",
+ "password_optional": "Passwort (optional):",
+ "generate_share_link": "Freigabelink generieren",
+ "shareable_link": "Freigabelink:",
+ "copy_link": "Link kopieren",
+ "tag_file": "Datei taggen",
+ "tag_name": "Tagname:",
+ "tag_color": "Tagfarbe:",
+ "save_tag": "Tag speichern",
+ "files_in": "Dateien in",
+ "light_mode": "Heller Modus",
+ "dark_mode": "Dunkler Modus",
+ "upload_instruction": "Ziehen Sie Dateien/Ordner hierher oder klicken Sie auf 'Dateien auswählen'",
+ "no_files_selected_default": "Keine Dateien ausgewählt",
+ "choose_files": "Dateien auswählen",
+ "delete_selected": "Ausgewählte löschen",
+ "copy_selected": "Ausgewählte kopieren",
+ "move_selected": "Ausgewählte verschieben",
+ "tag_selected": "Ausgewählte taggen",
+ "download_zip": "Zip herunterladen",
+ "extract_zip": "Zip entpacken",
+ "preview": "Vorschau",
+ "edit": "Bearbeiten",
+ "rename": "Umbenennen",
+ "trash_empty": "Papierkorb ist leer.",
+ "no_trash_selected": "Keine Elemente im Papierkorb für die Wiederherstellung ausgewählt.",
+
+ // Additional keys for HTML translations:
+ "title": "FileRise",
+ "header_title": "FileRise",
+ "logout": "Abmelden",
+ "change_password": "Passwort ändern",
+ "restore_text": "Wiederherstellen oder",
+ "delete_text": "Papierkorbeinträge löschen",
+ "restore_selected": "Ausgewählte wiederherstellen",
+ "restore_all": "Alle wiederherstellen",
+ "delete_selected_trash": "Ausgewählte löschen",
+ "delete_all": "Alle löschen",
+ "upload_header": "Dateien/Ordner hochladen",
+
+ // Folder Management keys:
+ "folder_navigation": "Ordnernavigation & Verwaltung",
+ "create_folder": "Ordner erstellen",
+ "create_folder_title": "Ordner erstellen",
+ "enter_folder_name": "Geben Sie den Ordnernamen ein",
+ "cancel": "Abbrechen",
+ "create": "Erstellen",
+ "rename_folder": "Ordner umbenennen",
+ "rename_folder_title": "Ordner umbenennen",
+ "rename_folder_placeholder": "Neuen Ordnernamen eingeben",
+ "delete_folder": "Ordner löschen",
+ "delete_folder_title": "Ordner löschen",
+ "delete_folder_message": "Sind Sie sicher, dass Sie diesen Ordner löschen möchten?",
+ "folder_help": "Ordnerhilfe",
+ "folder_help_item_1": "Klicken Sie auf einen Ordner, um dessen Dateien anzuzeigen.",
+ "folder_help_item_2": "Verwenden Sie [-] um zu minimieren und [+] um zu erweitern.",
+ "folder_help_item_3": "Klicken Sie auf \"Ordner erstellen\", um einen Unterordner hinzuzufügen.",
+ "folder_help_item_4": "Um einen Ordner umzubenennen oder zu löschen, wählen Sie ihn und klicken Sie auf die entsprechende Schaltfläche.",
+
+ // File List keys:
+ "file_list_title": "Dateien in (Root)",
+ "delete_files": "Dateien löschen",
+ "delete_selected_files_title": "Ausgewählte Dateien löschen",
+ "delete_files_message": "Sind Sie sicher, dass Sie die ausgewählten Dateien löschen möchten?",
+ "copy_files": "Dateien kopieren",
+ "copy_files_title": "Ausgewählte Dateien kopieren",
+ "copy_files_message": "Wählen Sie einen Zielordner, um die ausgewählten Dateien zu kopieren:",
+ "move_files": "Dateien verschieben",
+ "move_files_title": "Ausgewählte Dateien verschieben",
+ "move_files_message": "Wählen Sie einen Zielordner, um die ausgewählten Dateien zu verschieben:",
+ "move": "Verschieben",
+ "extract_zip_button": "Zip entpacken",
+ "download_zip_title": "Ausgewählte Dateien als Zip herunterladen",
+ "download_zip_prompt": "Geben Sie einen Namen für die Zip-Datei ein:",
+ "zip_placeholder": "dateien.zip",
+
+ // Login Form keys:
+ "login": "Anmelden",
+ "remember_me": "Angemeldet bleiben",
+ "login_oidc": "Mit OIDC anmelden",
+ "basic_http_login": "HTTP-Basisauthentifizierung verwenden",
+
+ // Change Password keys:
+ "change_password_title": "Passwort ändern",
+ "old_password": "Altes Passwort",
+ "new_password": "Neues Passwort",
+ "confirm_new_password": "Neues Passwort bestätigen",
+
+ // Add User keys:
+ "create_new_user_title": "Neuen Benutzer erstellen",
+ "username": "Benutzername:",
+ "password": "Passwort:",
+ "grant_admin": "Admin-Rechte vergeben",
+ "save_user": "Benutzer speichern",
+
+ // Remove User keys:
+ "remove_user_title": "Benutzer entfernen",
+ "select_user_remove": "Wählen Sie einen Benutzer zum Entfernen:",
+ "delete_user": "Benutzer löschen",
+
+ // Rename File keys:
+ "rename_file_title": "Datei umbenennen",
+ "rename_file_placeholder": "Neuen Dateinamen eingeben",
+
+ // Custom Confirm Modal keys:
+ "yes": "Ja",
+ "no": "Nein",
+ "delete": "Löschen",
+ "download": "Herunterladen",
+ "upload": "Hochladen",
+ "copy": "Kopieren",
+ "extract": "Entpacken",
+
+ // Dark Mode Toggle
+ "dark_mode_toggle": "Dunkler Modus"
}
};