feat: add more languages

This commit is contained in:
Peifan Li
2025-11-25 20:28:51 -05:00
parent b725a912b0
commit 72aab1095a
12 changed files with 1863 additions and 422 deletions

View File

@@ -167,7 +167,15 @@ const SettingsPage: React.FC = () => {
onChange={(e) => handleChange('language', e.target.value)}
>
<MenuItem value="en">English</MenuItem>
<MenuItem value="zh">Chinese</MenuItem>
<MenuItem value="zh"> (Chinese)</MenuItem>
<MenuItem value="es">Español (Spanish)</MenuItem>
<MenuItem value="de">Deutsch (German)</MenuItem>
<MenuItem value="ja"> (Japanese)</MenuItem>
<MenuItem value="fr">Français (French)</MenuItem>
<MenuItem value="ko"> (Korean)</MenuItem>
<MenuItem value="ar">العربية (Arabic)</MenuItem>
<MenuItem value="pt">Português (Portuguese)</MenuItem>
<MenuItem value="ru">Русский (Russian)</MenuItem>
</Select>
</FormControl>
</Box>

View File

@@ -0,0 +1,210 @@
export const ar = {
// Header
myTube: "MyTube",
manage: "إدارة",
settings: "الإعدادات",
logout: "تسجيل الخروج",
pleaseEnterUrlOrSearchTerm: "الرجاء إدخال رابط الفيديو أو مصطلح البحث",
unexpectedErrorOccurred: "حدث خطأ غير متوقع. يرجى المحاولة مرة أخرى.",
uploadVideo: "رفع فيديو",
enterUrlOrSearchTerm: "أدخل رابط YouTube/Bilibili أو مصطلح البحث",
manageVideos: "إدارة الفيديوهات",
// Home
pasteUrl: "لصق رابط الفيديو أو المجموعة",
download: "تحميل",
search: "بحث",
recentDownloads: "التحميلات الأخيرة",
noDownloads: "لا توجد تحميلات بعد",
downloadStarted: "بدأ التحميل",
downloadFailed: "فشل التحميل",
loadingVideos: "جاري تحميل الفيديوهات...",
searchResultsFor: "نتائج البحث عن",
fromYourLibrary: "من مكتبتك",
noMatchingVideos: "لا توجد فيديوهات مطابقة في مكتبتك.",
fromYouTube: "من YouTube",
loadingYouTubeResults: "جاري تحميل نتائج YouTube...",
noYouTubeResults: "لم يتم العثور على نتائج YouTube",
noVideosYet: "لا توجد فيديوهات بعد. أرسل رابط YouTube لتحميل أول فيديو لك!",
views: "مشاهدات",
// Settings
general: "عام",
security: "الأمان",
videoDefaults: "إعدادات مشغل الفيديو الافتراضية",
downloadSettings: "إعدادات التحميل",
language: "اللغة",
enableLogin: "تفعيل حماية تسجيل الدخول",
password: "كلمة المرور",
passwordHelper: "اتركه فارغًا للاحتفاظ بكلمة المرور الحالية، أو اكتب للتغيير",
passwordSetHelper: "تعيين كلمة مرور للوصول إلى التطبيق",
autoPlay: "تشغيل تلقائي للفيديوهات",
autoLoop: "تكرار تلقائي للفيديوهات",
maxConcurrent: "الحد الأقصى للتحميلات المتزامنة",
saveSettings: "حفظ الإعدادات",
saving: "جاري الحفظ...",
backToManage: "العودة للإدارة",
settingsSaved: "تم حفظ الإعدادات بنجاح",
settingsFailed: "فشل حفظ الإعدادات",
debugMode: "وضع التصحيح",
debugModeDescription: "إظهار أو إخفاء رسائل وحدة التحكم (يتطلب التحديث)",
tagsManagement: "إدارة العلامات",
newTag: "علامة جديدة",
tags: "العلامات",
tagsManagementNote: "يرجى تذكر النقر فوق \"حفظ الإعدادات\" بعد إضافة أو إزالة العلامات لتطبيق التغييرات.",
// Database
database: "قاعدة البيانات",
migrateDataDescription: "نقل البيانات من ملفات JSON القديمة إلى قاعدة بيانات SQLite الجديدة. هذا الإجراء آمن للتشغيل عدة مرات (سيتم تخطي التكرارات).",
migrateDataButton: "نقل البيانات من JSON",
scanFiles: "فحص الملفات",
scanFilesSuccess: "اكتمل الفحص. تمت إضافة {count} فيديوهات جديدة.",
scanFilesFailed: "فشل الفحص",
migrateConfirmation: "هل أنت متأكد أنك تريد نقل البيانات؟ قد يستغرق هذا بضع لحظات.",
migrationResults: "نتائج النقل",
migrationReport: "تقرير النقل",
migrationSuccess: "اكتمل النقل. انظر التفاصيل في التنبيه.",
migrationNoData: "انتهى النقل ولكن لم يتم العثور على بيانات.",
migrationFailed: "فشل النقل",
migrationWarnings: "تحذيرات",
migrationErrors: "أخطاء",
itemsMigrated: "عناصر تم نقلها",
fileNotFound: "لم يتم العثور على الملف في",
noDataFilesFound: "لم يتم العثور على ملفات بيانات للنقل. يرجى التحقق من تعيينات وحدة التخزين الخاصة بك.",
removeLegacyData: "إزالة البيانات القديمة",
removeLegacyDataDescription: "حذف ملفات JSON القديمة (videos.json، collections.json، إلخ) لتحرير مساحة القرص. قم بذلك فقط بعد التحقق من نقل بياناتك بنجاح.",
removeLegacyDataConfirmTitle: "حذف البيانات القديمة؟",
removeLegacyDataConfirmMessage: "هل أنت متأكد أنك تريد حذف ملفات بيانات JSON القديمة؟ لا يمكن التراجع عن هذا الإجراء.",
legacyDataDeleted: "تم حذف البيانات القديمة بنجاح.",
deleteLegacyDataButton: "حذف البيانات القديمة",
// Manage
manageContent: "إدارة المحتوى",
videos: "فيديوهات",
collections: "مجموعات",
allVideos: "كل الفيديوهات",
delete: "حذف",
backToHome: "العودة للرئيسية",
confirmDelete: "هل أنت متأكد أنك تريد حذف هذا؟",
deleteSuccess: "تم الحذف بنجاح",
deleteFailed: "فشل الحذف",
noVideos: "لم يتم العثور على فيديوهات",
noCollections: "لم يتم العثور على مجموعات",
searchVideos: "بحث عن فيديوهات...",
thumbnail: "صورة مصغرة",
title: "العنوان",
author: "المؤلف",
authors: "المؤلفون",
created: "تاريخ الإنشاء",
name: "الاسم",
actions: "إجراءات",
deleteCollection: "حذف المجموعة",
deleteVideo: "حذف الفيديو",
noVideosFoundMatching: "لم يتم العثور على فيديوهات مطابقة لبحثك.",
// Video Player
playing: "تشغيل",
paused: "إيقاف مؤقت",
next: "التالي",
previous: "السابق",
loop: "تكرار",
autoPlayOn: "تشغيل تلقائي مفعل",
autoPlayOff: "تشغيل تلقائي معطل",
videoNotFound: "الفيديو غير موجود",
videoNotFoundOrLoaded: "الفيديو غير موجود أو تعذر تحميله.",
deleting: "جاري الحذف...",
addToCollection: "إضافة إلى مجموعة",
originalLink: "الرابط الأصلي",
source: "المصدر:",
addedDate: "تاريخ الإضافة:",
latestComments: "أحدث التعليقات",
noComments: "لا توجد تعليقات متاحة.",
upNext: "التالي",
noOtherVideos: "لا توجد فيديوهات أخرى متاحة",
currentlyIn: "حالياً في:",
collectionWarning: "الإضافة إلى مجموعة مختلفة سيؤدي إلى إزالته من المجموعة الحالية.",
addToExistingCollection: "إضافة إلى مجموعة موجودة:",
selectCollection: "اختر مجموعة",
add: "إضافة",
createNewCollection: "إنشاء مجموعة جديدة:",
collectionName: "اسم المجموعة",
create: "إنشاء",
removeFromCollection: "إزالة من المجموعة",
confirmRemoveFromCollection: "هل أنت متأكد أنك تريد إزالة هذا الفيديو من المجموعة؟",
remove: "إزالة",
loadingVideo: "جاري تحميل الفيديو...",
current: "(الحالي)",
rateThisVideo: "قيم هذا الفيديو",
enterFullscreen: "ملء الشاشة",
exitFullscreen: "خروج من ملء الشاشة",
editTitle: "تعديل العنوان",
titleUpdated: "تم تحديث العنوان بنجاح",
titleUpdateFailed: "فشل تحديث العنوان",
// Login
signIn: "تسجيل الدخول",
verifying: "جاري التحقق...",
incorrectPassword: "كلمة المرور غير صحيحة",
loginFailed: "فشل التحقق من كلمة المرور",
defaultPasswordHint: "كلمة المرور الافتراضية: 123",
// Collection Page
loadingCollection: "جاري تحميل المجموعة...",
collectionNotFound: "المجموعة غير موجودة",
noVideosInCollection: "لا توجد فيديوهات في هذه المجموعة.",
back: "رجوع",
// Author Videos
loadVideosError: "فشل تحميل الفيديوهات. يرجى المحاولة مرة أخرى لاحقاً.",
unknownAuthor: "غير معروف",
noVideosForAuthor: "لم يتم العثور على فيديوهات لهذا المؤلف.",
// Delete Collection Modal
deleteCollectionTitle: "حذف المجموعة",
deleteCollectionConfirmation: "هل أنت متأكد أنك تريد حذف المجموعة",
collectionContains: "تحتوي هذه المجموعة على",
deleteCollectionOnly: "حذف المجموعة فقط",
deleteCollectionAndVideos: "حذف المجموعة وكل الفيديوهات",
// Common
loading: "جاري التحميل...",
error: "خطأ",
success: "نجاح",
cancel: "إلغاء",
confirm: "تأكيد",
save: "حفظ",
on: "تشغيل",
off: "إيقاف",
// Video Card
unknownDate: "تاريخ غير معروف",
part: "جزء",
collection: "مجموعة",
// Upload Modal
selectVideoFile: "اختر ملف فيديو",
pleaseSelectVideo: "الرجاء اختيار ملف فيديو",
uploadFailed: "فشل الرفع",
failedToUpload: "فشل رفع الفيديو",
uploading: "جاري الرفع...",
upload: "رفع",
// Bilibili Modal
bilibiliCollectionDetected: "تم اكتشاف مجموعة Bilibili",
bilibiliSeriesDetected: "تم اكتشاف سلسلة Bilibili",
multiPartVideoDetected: "تم اكتشاف فيديو متعدد الأجزاء",
collectionHasVideos: "تحتوي هذه المجموعة من Bilibili على {count} فيديوهات.",
seriesHasVideos: "تحتوي هذه السلسلة من Bilibili على {count} فيديوهات.",
videoHasParts: "يحتوي هذا الفيديو من Bilibili على {count} أجزاء.",
downloadAllVideos: "تحميل كل {count} الفيديوهات",
downloadAllParts: "تحميل كل {count} الأجزاء",
downloadThisVideoOnly: "تحميل هذا الفيديو فقط",
downloadCurrentPartOnly: "تحميل الجزء الحالي فقط",
processing: "جاري المعالجة...",
wouldYouLikeToDownloadAllParts: "هل تود تحميل جميع الأجزاء؟",
wouldYouLikeToDownloadAllVideos: "هل تود تحميل جميع الفيديوهات؟",
allPartsAddedToCollection: "سيتم إضافة جميع الأجزاء إلى هذه المجموعة",
allVideosAddedToCollection: "سيتم إضافة جميع الفيديوهات إلى هذه المجموعة",
queued: "في الانتظار",
waitingInQueue: "في قائمة الانتظار"
};

View File

@@ -0,0 +1,76 @@
export const de = {
myTube: "MyTube", manage: "Verwalten", settings: "Einstellungen", logout: "Abmelden",
pleaseEnterUrlOrSearchTerm: "Bitte geben Sie eine Video-URL oder einen Suchbegriff ein",
unexpectedErrorOccurred: "Ein unerwarteter Fehler ist aufgetreten. Bitte versuchen Sie es erneut.",
uploadVideo: "Video Hochladen", enterUrlOrSearchTerm: "YouTube/Bilibili-URL oder Suchbegriff eingeben",
manageVideos: "Videos Verwalten", pasteUrl: "Video- oder Sammlungs-URL einfügen", download: "Herunterladen",
search: "Suchen", recentDownloads: "Letzte Downloads", noDownloads: "Noch keine Downloads",
downloadStarted: "Download gestartet", downloadFailed: "Download fehlgeschlagen", loadingVideos: "Videos werden geladen...",
searchResultsFor: "Suchergebnisse für", fromYourLibrary: "Aus Ihrer Bibliothek",
noMatchingVideos: "Keine passenden Videos in Ihrer Bibliothek.", fromYouTube: "Von YouTube",
loadingYouTubeResults: "YouTube-Ergebnisse werden geladen...", noYouTubeResults: "Keine YouTube-Ergebnisse gefunden",
noVideosYet: "Noch keine Videos. Senden Sie eine YouTube-URL, um Ihr erstes Video herunterzuladen!", views: "Aufrufe",
general: "Allgemein", security: "Sicherheit", videoDefaults: "Player-Standardeinstellungen",
downloadSettings: "Download-Einstellungen", language: "Sprache", enableLogin: "Anmeldeschutz aktivieren",
password: "Passwort", passwordHelper: "Leer lassen, um das aktuelle Passwort beizubehalten, oder eingeben, um es zu ändern",
passwordSetHelper: "Legen Sie ein Passwort für den Zugriff auf die Anwendung fest", autoPlay: "Automatische Wiedergabe",
autoLoop: "Automatische Schleife", maxConcurrent: "Max. gleichzeitige Downloads", saveSettings: "Einstellungen Speichern",
saving: "Speichern...", backToManage: "Zurück zu Verwalten", settingsSaved: "Einstellungen erfolgreich gespeichert",
settingsFailed: "Fehler beim Speichern der Einstellungen", debugMode: "Debug-Modus",
debugModeDescription: "Konsolenmeldungen anzeigen oder ausblenden (erfordert Aktualisierung)", tagsManagement: "Tag-Verwaltung",
newTag: "Neues Tag", tags: "Tags",
tagsManagementNote: "Bitte denken Sie daran, nach dem Hinzufügen oder Entfernen von Tags auf \"Einstellungen speichern\" zu klicken, um die Änderungen zu übernehmen.",
database: "Datenbank", migrateDataDescription: "Daten von Legacy-JSON-Dateien zur neuen SQLite-Datenbank migrieren. Diese Aktion kann sicher mehrmals ausgeführt werden (Duplikate werden übersprungen).",
migrateDataButton: "Daten aus JSON migrieren", scanFiles: "Dateien Scannen",
scanFilesSuccess: "Scan abgeschlossen. {count} neue Videos hinzugefügt.", scanFilesFailed: "Scan fehlgeschlagen",
migrateConfirmation: "Sind Sie sicher, dass Sie Daten migrieren möchten? Dies kann einige Momente dauern.",
migrationResults: "Migrationsergebnisse", migrationReport: "Migrationsbericht",
migrationSuccess: "Migration abgeschlossen. Details in der Warnung anzeigen.", migrationNoData: "Migration abgeschlossen, aber keine Daten gefunden.",
migrationFailed: "Migration fehlgeschlagen", migrationWarnings: "WARNUNGEN", migrationErrors: "FEHLER",
itemsMigrated: "Elemente migriert", fileNotFound: "Datei nicht gefunden unter",
noDataFilesFound: "Keine Datendateien zum Migrieren gefunden. Bitte überprüfen Sie Ihre Volume-Zuordnungen.",
removeLegacyData: "Legacy-Daten Entfernen", removeLegacyDataDescription: "Löschen Sie die alten JSON-Dateien, um Speicherplatz freizugeben. Tun Sie dies nur, nachdem Sie überprüft haben, dass Ihre Daten erfolgreich migriert wurden.",
removeLegacyDataConfirmTitle: "Legacy-Daten löschen?", removeLegacyDataConfirmMessage: "Sind Sie sicher, dass Sie die Legacy-JSON-Datendateien löschen möchten? Diese Aktion kann nicht rückgängig gemacht werden.",
legacyDataDeleted: "Legacy-Daten erfolgreich gelöscht.", deleteLegacyDataButton: "Legacy-Daten Löschen",
manageContent: "Inhalte Verwalten", videos: "Videos", collections: "Sammlungen", allVideos: "Alle Videos",
delete: "Löschen", backToHome: "Zurück zur Startseite", confirmDelete: "Sind Sie sicher, dass Sie dies löschen möchten?",
deleteSuccess: "Erfolgreich gelöscht", deleteFailed: "Löschen fehlgeschlagen", noVideos: "Keine Videos gefunden",
noCollections: "Keine Sammlungen gefunden", searchVideos: "Videos suchen...", thumbnail: "Miniaturansicht",
title: "Titel", author: "Autor", authors: "Autoren", created: "Erstellt", name: "Name", actions: "Aktionen",
deleteCollection: "Sammlung Löschen", deleteVideo: "Video Löschen", noVideosFoundMatching: "Keine Videos gefunden, die Ihrer Suche entsprechen.",
playing: "Abspielen", paused: "Pause", next: "Weiter", previous: "Zurück", loop: "Schleife",
autoPlayOn: "Automatische Wiedergabe Ein", autoPlayOff: "Automatische Wiedergabe Aus",
videoNotFound: "Video nicht gefunden", videoNotFoundOrLoaded: "Video nicht gefunden oder konnte nicht geladen werden.",
deleting: "Löschen...", addToCollection: "Zu Sammlung Hinzufügen", originalLink: "Originallink",
source: "Quelle:", addedDate: "Hinzugefügt am:", latestComments: "Neueste Kommentare",
noComments: "Keine Kommentare verfügbar.", upNext: "Als Nächstes", noOtherVideos: "Keine anderen Videos verfügbar",
currentlyIn: "Derzeit in:", collectionWarning: "Das Hinzufügen zu einer anderen Sammlung entfernt es aus der aktuellen.",
addToExistingCollection: "Zu bestehender Sammlung hinzufügen:", selectCollection: "Sammlung auswählen",
add: "Hinzufügen", createNewCollection: "Neue Sammlung erstellen:", collectionName: "Sammlungsname",
create: "Erstellen", removeFromCollection: "Aus Sammlung Entfernen",
confirmRemoveFromCollection: "Sind Sie sicher, dass Sie dieses Video aus der Sammlung entfernen möchten?", remove: "Entfernen",
loadingVideo: "Video wird geladen...", current: "(Aktuell)", rateThisVideo: "Dieses Video bewerten",
enterFullscreen: "Vollbild", exitFullscreen: "Vollbild Verlassen", editTitle: "Titel Bearbeiten",
titleUpdated: "Titel erfolgreich aktualisiert", titleUpdateFailed: "Fehler beim Aktualisieren des Titels",
signIn: "Anmelden", verifying: "Überprüfen...", incorrectPassword: "Falsches Passwort",
loginFailed: "Fehler beim Überprüfen des Passworts", defaultPasswordHint: "Standardpasswort: 123",
loadingCollection: "Sammlung wird geladen...", collectionNotFound: "Sammlung nicht gefunden",
noVideosInCollection: "Keine Videos in dieser Sammlung.", back: "Zurück", loadVideosError: "Fehler beim Laden der Videos. Bitte versuchen Sie es später erneut.",
unknownAuthor: "Unbekannt", noVideosForAuthor: "Keine Videos für diesen Autor gefunden.",
deleteCollectionTitle: "Sammlung Löschen", deleteCollectionConfirmation: "Sind Sie sicher, dass Sie die Sammlung löschen möchten",
collectionContains: "Diese Sammlung enthält", deleteCollectionOnly: "Nur Sammlung Löschen",
deleteCollectionAndVideos: "Sammlung und Alle Videos Löschen", loading: "Laden...", error: "Fehler",
success: "Erfolg", cancel: "Abbrechen", confirm: "Bestätigen", save: "Speichern", on: "Ein", off: "Aus",
unknownDate: "Unbekanntes Datum", part: "Teil", collection: "Sammlung", selectVideoFile: "Videodatei Auswählen",
pleaseSelectVideo: "Bitte wählen Sie eine Videodatei aus", uploadFailed: "Upload fehlgeschlagen",
failedToUpload: "Fehler beim Hochladen des Videos", uploading: "Hochladen...", upload: "Hochladen",
bilibiliCollectionDetected: "Bilibili-Sammlung Erkannt", bilibiliSeriesDetected: "Bilibili-Serie Erkannt",
multiPartVideoDetected: "Mehrteiliges Video Erkannt", collectionHasVideos: "Diese Bilibili-Sammlung hat {count} Videos.",
seriesHasVideos: "Diese Bilibili-Serie hat {count} Videos.", videoHasParts: "Dieses Bilibili-Video hat {count} Teile.",
downloadAllVideos: "Alle {count} Videos Herunterladen", downloadAllParts: "Alle {count} Teile Herunterladen",
downloadThisVideoOnly: "Nur Dieses Video Herunterladen", downloadCurrentPartOnly: "Nur Aktuellen Teil Herunterladen",
processing: "Verarbeiten...", wouldYouLikeToDownloadAllParts: "Möchten Sie alle Teile herunterladen?",
wouldYouLikeToDownloadAllVideos: "Möchten Sie alle Videos herunterladen?",
allPartsAddedToCollection: "Alle Teile werden dieser Sammlung hinzugefügt",
allVideosAddedToCollection: "Alle Videos werden dieser Sammlung hinzugefügt", queued: "In Warteschlange", waitingInQueue: "Warten in Warteschlange"
};

View File

@@ -0,0 +1,210 @@
export const en = {
// Header
myTube: "MyTube",
manage: "Manage",
settings: "Settings",
logout: "Logout",
pleaseEnterUrlOrSearchTerm: "Please enter a video URL or search term",
unexpectedErrorOccurred: "An unexpected error occurred. Please try again.",
uploadVideo: "Upload Video",
enterUrlOrSearchTerm: "Enter YouTube/Bilibili URL or search term",
manageVideos: "Manage Videos",
// Home
pasteUrl: "Paste video or collection URL",
download: "Download",
search: "Search",
recentDownloads: "Recent Downloads",
noDownloads: "No downloads yet",
downloadStarted: "Download started",
downloadFailed: "Download failed",
loadingVideos: "Loading videos...",
searchResultsFor: "Search Results for",
fromYourLibrary: "From Your Library",
noMatchingVideos: "No matching videos in your library.",
fromYouTube: "From YouTube",
loadingYouTubeResults: "Loading YouTube results...",
noYouTubeResults: "No YouTube results found",
noVideosYet: "No videos yet. Submit a YouTube URL to download your first video!",
views: "views",
// Settings
general: "General",
security: "Security",
videoDefaults: "Video Player Defaults",
downloadSettings: "Download Settings",
language: "Language",
enableLogin: "Enable Login Protection",
password: "Password",
passwordHelper: "Leave empty to keep current password, or type to change",
passwordSetHelper: "Set a password for accessing the application",
autoPlay: "Auto-play Videos",
autoLoop: "Auto-loop Videos",
maxConcurrent: "Max Concurrent Downloads",
saveSettings: "Save Settings",
saving: "Saving...",
backToManage: "Back to Manage",
settingsSaved: "Settings saved successfully",
settingsFailed: "Failed to save settings",
debugMode: "Debug Mode",
debugModeDescription: "Show or hide console messages (requires refresh)",
tagsManagement: "Tags Management",
newTag: "New Tag",
tags: "Tags",
tagsManagementNote: "Please remember to click \"Save Settings\" after adding or removing tags to apply changes.",
// Database
database: "Database",
migrateDataDescription: "Migrate data from legacy JSON files to the new SQLite database. This action is safe to run multiple times (duplicates will be skipped).",
migrateDataButton: "Migrate Data from JSON",
scanFiles: "Scan Files",
scanFilesSuccess: "Scan complete. Added {count} new videos.",
scanFilesFailed: "Scan failed",
migrateConfirmation: "Are you sure you want to migrate data? This may take a few moments.",
migrationResults: "Migration Results",
migrationReport: "Migration Report",
migrationSuccess: "Migration completed. See details in alert.",
migrationNoData: "Migration finished but no data found.",
migrationFailed: "Migration failed",
migrationWarnings: "WARNINGS",
migrationErrors: "ERRORS",
itemsMigrated: "items migrated",
fileNotFound: "File not found at",
noDataFilesFound: "No data files were found to migrate. Please check your volume mappings.",
removeLegacyData: "Remove Legacy Data",
removeLegacyDataDescription: "Delete the old JSON files (videos.json, collections.json, etc.) to clean up disk space. Only do this after verifying your data has been successfully migrated.",
removeLegacyDataConfirmTitle: "Delete Legacy Data?",
removeLegacyDataConfirmMessage: "Are you sure you want to delete the legacy JSON data files? This action cannot be undone.",
legacyDataDeleted: "Legacy data deleted successfully.",
deleteLegacyDataButton: "Delete Legacy Data",
// Manage
manageContent: "Manage Content",
videos: "Videos",
collections: "Collections",
allVideos: "All Videos",
delete: "Delete",
backToHome: "Back to Home",
confirmDelete: "Are you sure you want to delete this?",
deleteSuccess: "Deleted successfully",
deleteFailed: "Failed to delete",
noVideos: "No videos found",
noCollections: "No collections found",
searchVideos: "Search videos...",
thumbnail: "Thumbnail",
title: "Title",
author: "Author",
authors: "Authors",
created: "Created",
name: "Name",
actions: "Actions",
deleteCollection: "Delete Collection",
deleteVideo: "Delete Video",
noVideosFoundMatching: "No videos found matching your search.",
// Video Player
playing: "Play",
paused: "Pause",
next: "Next",
previous: "Previous",
loop: "Loop",
autoPlayOn: "Auto-play On",
autoPlayOff: "Auto-play Off",
videoNotFound: "Video not found",
videoNotFoundOrLoaded: "Video not found or could not be loaded.",
deleting: "Deleting...",
addToCollection: "Add to Collection",
originalLink: "Original Link",
source: "Source:",
addedDate: "Added Date:",
latestComments: "Latest Comments",
noComments: "No comments available.",
upNext: "Up Next",
noOtherVideos: "No other videos available",
currentlyIn: "Currently in:",
collectionWarning: "Adding to a different collection will remove it from the current one.",
addToExistingCollection: "Add to existing collection:",
selectCollection: "Select a collection",
add: "Add",
createNewCollection: "Create new collection:",
collectionName: "Collection name",
create: "Create",
removeFromCollection: "Remove from Collection",
confirmRemoveFromCollection: "Are you sure you want to remove this video from the collection?",
remove: "Remove",
loadingVideo: "Loading video...",
current: "(Current)",
rateThisVideo: "Rate this video",
enterFullscreen: "Enter Fullscreen",
exitFullscreen: "Exit Fullscreen",
editTitle: "Edit Title",
titleUpdated: "Title updated successfully",
titleUpdateFailed: "Failed to update title",
// Login
signIn: "Sign in",
verifying: "Verifying...",
incorrectPassword: "Incorrect password",
loginFailed: "Failed to verify password",
defaultPasswordHint: "Default password: 123",
// Collection Page
loadingCollection: "Loading collection...",
collectionNotFound: "Collection not found",
noVideosInCollection: "No videos in this collection.",
back: "Back",
// Author Videos
loadVideosError: "Failed to load videos. Please try again later.",
unknownAuthor: "Unknown",
noVideosForAuthor: "No videos found for this author.",
// Delete Collection Modal
deleteCollectionTitle: "Delete Collection",
deleteCollectionConfirmation: "Are you sure you want to delete the collection",
collectionContains: "This collection contains",
deleteCollectionOnly: "Delete Collection Only",
deleteCollectionAndVideos: "Delete Collection & All Videos",
// Common
loading: "Loading...",
error: "Error",
success: "Success",
cancel: "Cancel",
confirm: "Confirm",
save: "Save",
on: "On",
off: "Off",
// Video Card
unknownDate: "Unknown date",
part: "Part",
collection: "Collection",
// Upload Modal
selectVideoFile: "Select Video File",
pleaseSelectVideo: "Please select a video file",
uploadFailed: "Upload failed",
failedToUpload: "Failed to upload video",
uploading: "Uploading...",
upload: "Upload",
// Bilibili Modal
bilibiliCollectionDetected: "Bilibili Collection Detected",
bilibiliSeriesDetected: "Bilibili Series Detected",
multiPartVideoDetected: "Multi-part Video Detected",
collectionHasVideos: "This Bilibili collection has {count} videos.",
seriesHasVideos: "This Bilibili series has {count} videos.",
videoHasParts: "This Bilibili video has {count} parts.",
downloadAllVideos: "Download All {count} Videos",
downloadAllParts: "Download All {count} Parts",
downloadThisVideoOnly: "Download This Video Only",
downloadCurrentPartOnly: "Download Current Part Only",
processing: "Processing...",
wouldYouLikeToDownloadAllParts: "Would you like to download all parts?",
wouldYouLikeToDownloadAllVideos: "Would you like to download all videos?",
allPartsAddedToCollection: "All parts will be added to this collection",
allVideosAddedToCollection: "All videos will be added to this collection",
queued: "Queued",
waitingInQueue: "Waiting in queue"
};

View File

@@ -0,0 +1,76 @@
export const es = {
myTube: "MyTube", manage: "Gestionar", settings: "Configuración", logout: "Cerrar sesión",
pleaseEnterUrlOrSearchTerm: "Por favor ingrese una URL de video o término de búsqueda",
unexpectedErrorOccurred: "Ocurrió un error inesperado. Por favor, inténtelo de nuevo.",
uploadVideo: "Subir Video", enterUrlOrSearchTerm: "Ingrese URL de YouTube/Bilibili o término de búsqueda",
manageVideos: "Gestionar Videos", pasteUrl: "Pegar URL de video o colección", download: "Descargar",
search: "Buscar", recentDownloads: "Descargas Recientes", noDownloads: "Sin descargas aún",
downloadStarted: "Descarga iniciada", downloadFailed: "Descarga fallida", loadingVideos: "Cargando videos...",
searchResultsFor: "Resultados de búsqueda para", fromYourLibrary: "De tu Biblioteca",
noMatchingVideos: "No hay videos coincidentes en tu biblioteca.", fromYouTube: "De YouTube",
loadingYouTubeResults: "Cargando resultados de YouTube...", noYouTubeResults: "No se encontraron resultados de YouTube",
noVideosYet: "Sin videos aún. ¡Envía una URL de YouTube para descargar tu primer video!", views: "vistas",
general: "General", security: "Seguridad", videoDefaults: "Predeterminados del Reproductor",
downloadSettings: "Configuración de Descarga", language: "Idioma", enableLogin: "Habilitar Protección de Inicio de Sesión",
password: "Contraseña", passwordHelper: "Dejar vacío para mantener la contraseña actual, o escribir para cambiar",
passwordSetHelper: "Establecer una contraseña para acceder a la aplicación", autoPlay: "Reproducción Automática",
autoLoop: "Repetición Automática", maxConcurrent: "Descargas Simultáneas Máximas", saveSettings: "Guardar Configuración",
saving: "Guardando...", backToManage: "Volver a Gestionar", settingsSaved: "Configuración guardada exitosamente",
settingsFailed: "Error al guardar la configuración", debugMode: "Modo de Depuración",
debugModeDescription: "Mostrar u ocultar mensajes de consola (requiere actualización)", tagsManagement: "Gestión de Etiquetas",
newTag: "Nueva Etiqueta", tags: "Etiquetas",
tagsManagementNote: "Recuerde hacer clic en \"Guardar Configuración\" después de agregar o eliminar etiquetas para aplicar los cambios.",
database: "Base de Datos", migrateDataDescription: "Migrar datos de archivos JSON heredados a la nueva base de datos SQLite. Esta acción es segura para ejecutar varias veces (se omitirán duplicados).",
migrateDataButton: "Migrar Datos desde JSON", scanFiles: "Escanear Archivos",
scanFilesSuccess: "Escaneo completo. Se agregaron {count} nuevos videos.", scanFilesFailed: "Escaneo fallido",
migrateConfirmation: "¿Está seguro de que desea migrar los datos? Esto puede tardar unos momentos.",
migrationResults: "Resultados de Migración", migrationReport: "Informe de Migración",
migrationSuccess: "Migración completada. Ver detalles en la alerta.", migrationNoData: "Migración finalizada pero no se encontraron datos.",
migrationFailed: "Migración fallida", migrationWarnings: "ADVERTENCIAS", migrationErrors: "ERRORES",
itemsMigrated: "elementos migrados", fileNotFound: "Archivo no encontrado en",
noDataFilesFound: "No se encontraron archivos de datos para migrar. Por favor, verifique sus asignaciones de volumen.",
removeLegacyData: "Eliminar Datos Heredados", removeLegacyDataDescription: "Eliminar los archivos JSON antiguos para liberar espacio en disco. Solo haga esto después de verificar que sus datos se hayan migrado exitosamente.",
removeLegacyDataConfirmTitle: "¿Eliminar Datos Heredados?", removeLegacyDataConfirmMessage: "¿Está seguro de que desea eliminar los archivos de datos JSON heredados? Esta acción no se puede deshacer.",
legacyDataDeleted: "Datos heredados eliminados exitosamente.", deleteLegacyDataButton: "Eliminar Datos Heredados",
manageContent: "Gestionar Contenido", videos: "Videos", collections: "Colecciones", allVideos: "Todos los Videos",
delete: "Eliminar", backToHome: "Volver a Inicio", confirmDelete: "¿Está seguro de que desea eliminar esto?",
deleteSuccess: "Eliminado exitosamente", deleteFailed: "Error al eliminar", noVideos: "No se encontraron videos",
noCollections: "No se encontraron colecciones", searchVideos: "Buscar videos...", thumbnail: "Miniatura",
title: "Título", author: "Autor", authors: "Autores", created: "Creado", name: "Nombre", actions: "Acciones",
deleteCollection: "Eliminar Colección", deleteVideo: "Eliminar Video", noVideosFoundMatching: "No se encontraron videos que coincidan con su búsqueda.",
playing: "Reproducir", paused: "Pausar", next: "Siguiente", previous: "Anterior", loop: "Repetir",
autoPlayOn: "Reproducción Automática Activada", autoPlayOff: "Reproducción Automática Desactivada",
videoNotFound: "Video no encontrado", videoNotFoundOrLoaded: "Video no encontrado o no se pudo cargar.",
deleting: "Eliminando...", addToCollection: "Agregar a Colección", originalLink: "Enlace Original",
source: "Fuente:", addedDate: "Fecha de Agregado:", latestComments: "Últimos Comentarios",
noComments: "No hay comentarios disponibles.", upNext: "A Continuación", noOtherVideos: "No hay otros videos disponibles",
currentlyIn: "Actualmente en:", collectionWarning: "Agregar a una colección diferente lo eliminará de la actual.",
addToExistingCollection: "Agregar a colección existente:", selectCollection: "Seleccionar una colección",
add: "Agregar", createNewCollection: "Crear nueva colección:", collectionName: "Nombre de la colección",
create: "Crear", removeFromCollection: "Eliminar de la Colección",
confirmRemoveFromCollection: "¿Está seguro de que desea eliminar este video de la colección?", remove: "Eliminar",
loadingVideo: "Cargando video...", current: "(Actual)", rateThisVideo: "Calificar este video",
enterFullscreen: "Pantalla Completa", exitFullscreen: "Salir de Pantalla Completa", editTitle: "Editar Título",
titleUpdated: "Título actualizado exitosamente", titleUpdateFailed: "Error al actualizar el título",
signIn: "Iniciar Sesión", verifying: "Verificando...", incorrectPassword: "Contraseña incorrecta",
loginFailed: "Error al verificar la contraseña", defaultPasswordHint: "Contraseña predeterminada: 123",
loadingCollection: "Cargando colección...", collectionNotFound: "Colección no encontrada",
noVideosInCollection: "No hay videos en esta colección.", back: "Volver", loadVideosError: "Error al cargar los videos. Por favor, inténtelo más tarde.",
unknownAuthor: "Desconocido", noVideosForAuthor: "No se encontraron videos para este autor.",
deleteCollectionTitle: "Eliminar Colección", deleteCollectionConfirmation: "¿Está seguro de que desea eliminar la colección",
collectionContains: "Esta colección contiene", deleteCollectionOnly: "Eliminar Solo Colección",
deleteCollectionAndVideos: "Eliminar Colección y Todos los Videos", loading: "Cargando...", error: "Error",
success: "Éxito", cancel: "Cancelar", confirm: "Confirmar", save: "Guardar", on: "Activado", off: "Desactivado",
unknownDate: "Fecha desconocida", part: "Parte", collection: "Colección", selectVideoFile: "Seleccionar Archivo de Video",
pleaseSelectVideo: "Por favor seleccione un archivo de video", uploadFailed: "Carga fallida",
failedToUpload: "Error al cargar el video", uploading: "Cargando...", upload: "Subir",
bilibiliCollectionDetected: "Colección de Bilibili Detectada", bilibiliSeriesDetected: "Serie de Bilibili Detectada",
multiPartVideoDetected: "Video Multiparte Detectado", collectionHasVideos: "Esta colección de Bilibili tiene {count} videos.",
seriesHasVideos: "Esta serie de Bilibili tiene {count} videos.", videoHasParts: "Este video de Bilibili tiene {count} partes.",
downloadAllVideos: "Descargar Todos los {count} Videos", downloadAllParts: "Descargar Todas las {count} Partes",
downloadThisVideoOnly: "Descargar Solo Este Video", downloadCurrentPartOnly: "Descargar Solo Parte Actual",
processing: "Procesando...", wouldYouLikeToDownloadAllParts: "¿Le gustaría descargar todas las partes?",
wouldYouLikeToDownloadAllVideos: "¿Le gustaría descargar todos los videos?",
allPartsAddedToCollection: "Todas las partes se agregarán a esta colección",
allVideosAddedToCollection: "Todos los videos se agregarán a esta colección", queued: "En cola", waitingInQueue: "Esperando en cola"
};

View File

@@ -0,0 +1,210 @@
export const fr = {
// Header
myTube: "MyTube",
manage: "Gérer",
settings: "Paramètres",
logout: "Déconnexion",
pleaseEnterUrlOrSearchTerm: "Veuillez entrer une URL de vidéo ou un terme de recherche",
unexpectedErrorOccurred: "Une erreur inattendue s'est produite. Veuillez réessayer.",
uploadVideo: "Mettre en ligne une vidéo",
enterUrlOrSearchTerm: "Entrez une URL YouTube/Bilibili ou un terme de recherche",
manageVideos: "Gérer les vidéos",
// Home
pasteUrl: "Coller l'URL de la vidéo ou de la collection",
download: "Télécharger",
search: "Rechercher",
recentDownloads: "Téléchargements récents",
noDownloads: "Aucun téléchargement pour le moment",
downloadStarted: "Téléchargement commencé",
downloadFailed: "Échec du téléchargement",
loadingVideos: "Chargement des vidéos...",
searchResultsFor: "Résultats de recherche pour",
fromYourLibrary: "De votre bibliothèque",
noMatchingVideos: "Aucune vidéo correspondante dans votre bibliothèque.",
fromYouTube: "De YouTube",
loadingYouTubeResults: "Chargement des résultats YouTube...",
noYouTubeResults: "Aucun résultat YouTube trouvé",
noVideosYet: "Aucune vidéo pour le moment. Soumettez une URL YouTube pour télécharger votre première vidéo !",
views: "vues",
// Settings
general: "Général",
security: "Sécurité",
videoDefaults: "Paramètres par défaut du lecteur",
downloadSettings: "Paramètres de téléchargement",
language: "Langue",
enableLogin: "Activer la protection par connexion",
password: "Mot de passe",
passwordHelper: "Laisser vide pour conserver le mot de passe actuel, ou taper pour changer",
passwordSetHelper: "Définir un mot de passe pour accéder à l'application",
autoPlay: "Lecture automatique des vidéos",
autoLoop: "Boucle automatique des vidéos",
maxConcurrent: "Téléchargements simultanés max",
saveSettings: "Enregistrer les paramètres",
saving: "Enregistrement...",
backToManage: "Retour à la gestion",
settingsSaved: "Paramètres enregistrés avec succès",
settingsFailed: "Échec de l'enregistrement des paramètres",
debugMode: "Mode débogage",
debugModeDescription: "Afficher ou masquer les messages de la console (nécessite une actualisation)",
tagsManagement: "Gestion des tags",
newTag: "Nouveau tag",
tags: "Tags",
tagsManagementNote: "N'oubliez pas de cliquer sur \"Enregistrer les paramètres\" après avoir ajouté ou supprimé des tags pour appliquer les modifications.",
// Database
database: "Base de données",
migrateDataDescription: "Migrer les données des fichiers JSON hérités vers la nouvelle base de données SQLite. Cette action peut être exécutée plusieurs fois en toute sécurité (les doublons seront ignorés).",
migrateDataButton: "Migrer les données depuis JSON",
scanFiles: "Scanner les fichiers",
scanFilesSuccess: "Scan terminé. {count} nouvelles vidéos ajoutées.",
scanFilesFailed: "Échec du scan",
migrateConfirmation: "Êtes-vous sûr de vouloir migrer les données ? Cela peut prendre quelques instants.",
migrationResults: "Résultats de la migration",
migrationReport: "Rapport de migration",
migrationSuccess: "Migration terminée. Voir les détails dans l'alerte.",
migrationNoData: "Migration terminée mais aucune donnée trouvée.",
migrationFailed: "Échec de la migration",
migrationWarnings: "AVERTISSEMENTS",
migrationErrors: "ERREURS",
itemsMigrated: "éléments migrés",
fileNotFound: "Fichier non trouvé à",
noDataFilesFound: "Aucun fichier de données trouvé à migrer. Veuillez vérifier vos mappages de volume.",
removeLegacyData: "Supprimer les données héritées",
removeLegacyDataDescription: "Supprimer les anciens fichiers JSON (videos.json, collections.json, etc.) pour libérer de l'espace disque. Ne le faites qu'après avoir vérifié que vos données ont été migrées avec succès.",
removeLegacyDataConfirmTitle: "Supprimer les données héritées ?",
removeLegacyDataConfirmMessage: "Êtes-vous sûr de vouloir supprimer les fichiers de données JSON hérités ? Cette action est irréversible.",
legacyDataDeleted: "Données héritées supprimées avec succès.",
deleteLegacyDataButton: "Supprimer les données héritées",
// Manage
manageContent: "Gérer le contenu",
videos: "Vidéos",
collections: "Collections",
allVideos: "Toutes les vidéos",
delete: "Supprimer",
backToHome: "Retour à l'accueil",
confirmDelete: "Êtes-vous sûr de vouloir supprimer ceci ?",
deleteSuccess: "Supprimé avec succès",
deleteFailed: "Échec de la suppression",
noVideos: "Aucune vidéo trouvée",
noCollections: "Aucune collection trouvée",
searchVideos: "Rechercher des vidéos...",
thumbnail: "Miniature",
title: "Titre",
author: "Auteur",
authors: "Auteurs",
created: "Créé",
name: "Nom",
actions: "Actions",
deleteCollection: "Supprimer la collection",
deleteVideo: "Supprimer la vidéo",
noVideosFoundMatching: "Aucune vidéo ne correspond à votre recherche.",
// Video Player
playing: "Lecture",
paused: "Pause",
next: "Suivant",
previous: "Précédent",
loop: "Boucle",
autoPlayOn: "Lecture auto activée",
autoPlayOff: "Lecture auto désactivée",
videoNotFound: "Vidéo non trouvée",
videoNotFoundOrLoaded: "Vidéo non trouvée ou impossible à charger.",
deleting: "Suppression...",
addToCollection: "Ajouter à la collection",
originalLink: "Lien original",
source: "Source :",
addedDate: "Date d'ajout :",
latestComments: "Derniers commentaires",
noComments: "Aucun commentaire disponible.",
upNext: "À suivre",
noOtherVideos: "Aucune autre vidéo disponible",
currentlyIn: "Actuellement dans :",
collectionWarning: "L'ajout à une autre collection la supprimera de la collection actuelle.",
addToExistingCollection: "Ajouter à une collection existante :",
selectCollection: "Sélectionner une collection",
add: "Ajouter",
createNewCollection: "Créer une nouvelle collection :",
collectionName: "Nom de la collection",
create: "Créer",
removeFromCollection: "Retirer de la collection",
confirmRemoveFromCollection: "Êtes-vous sûr de vouloir retirer cette vidéo de la collection ?",
remove: "Retirer",
loadingVideo: "Chargement de la vidéo...",
current: "(Actuel)",
rateThisVideo: "Noter cette vidéo",
enterFullscreen: "Plein écran",
exitFullscreen: "Quitter le plein écran",
editTitle: "Modifier le titre",
titleUpdated: "Titre mis à jour avec succès",
titleUpdateFailed: "Échec de la mise à jour du titre",
// Login
signIn: "Se connecter",
verifying: "Vérification...",
incorrectPassword: "Mot de passe incorrect",
loginFailed: "Échec de la vérification du mot de passe",
defaultPasswordHint: "Mot de passe par défaut : 123",
// Collection Page
loadingCollection: "Chargement de la collection...",
collectionNotFound: "Collection non trouvée",
noVideosInCollection: "Aucune vidéo dans cette collection.",
back: "Retour",
// Author Videos
loadVideosError: "Échec du chargement des vidéos. Veuillez réessayer plus tard.",
unknownAuthor: "Inconnu",
noVideosForAuthor: "Aucune vidéo trouvée pour cet auteur.",
// Delete Collection Modal
deleteCollectionTitle: "Supprimer la collection",
deleteCollectionConfirmation: "Êtes-vous sûr de vouloir supprimer la collection",
collectionContains: "Cette collection contient",
deleteCollectionOnly: "Supprimer la collection uniquement",
deleteCollectionAndVideos: "Supprimer la collection et toutes les vidéos",
// Common
loading: "Chargement...",
error: "Erreur",
success: "Succès",
cancel: "Annuler",
confirm: "Confirmer",
save: "Enregistrer",
on: "On",
off: "Off",
// Video Card
unknownDate: "Date inconnue",
part: "Partie",
collection: "Collection",
// Upload Modal
selectVideoFile: "Sélectionner un fichier vidéo",
pleaseSelectVideo: "Veuillez sélectionner un fichier vidéo",
uploadFailed: "Échec de la mise en ligne",
failedToUpload: "Échec de la mise en ligne de la vidéo",
uploading: "Mise en ligne...",
upload: "Mettre en ligne",
// Bilibili Modal
bilibiliCollectionDetected: "Collection Bilibili détectée",
bilibiliSeriesDetected: "Série Bilibili détectée",
multiPartVideoDetected: "Vidéo en plusieurs parties détectée",
collectionHasVideos: "Cette collection Bilibili contient {count} vidéos.",
seriesHasVideos: "Cette série Bilibili contient {count} vidéos.",
videoHasParts: "Cette vidéo Bilibili contient {count} parties.",
downloadAllVideos: "Télécharger les {count} vidéos",
downloadAllParts: "Télécharger les {count} parties",
downloadThisVideoOnly: "Télécharger cette vidéo uniquement",
downloadCurrentPartOnly: "Télécharger la partie actuelle uniquement",
processing: "Traitement...",
wouldYouLikeToDownloadAllParts: "Voulez-vous télécharger toutes les parties ?",
wouldYouLikeToDownloadAllVideos: "Voulez-vous télécharger toutes les vidéos ?",
allPartsAddedToCollection: "Toutes les parties seront ajoutées à cette collection",
allVideosAddedToCollection: "Toutes les vidéos seront ajoutées à cette collection",
queued: "En file d'attente",
waitingInQueue: "En attente dans la file"
};

View File

@@ -0,0 +1,210 @@
export const ja = {
// Header
myTube: "MyTube",
manage: "管理",
settings: "設定",
logout: "ログアウト",
pleaseEnterUrlOrSearchTerm: "動画のURLまたは検索語を入力してください",
unexpectedErrorOccurred: "予期しないエラーが発生しました。もう一度お試しください。",
uploadVideo: "動画をアップロード",
enterUrlOrSearchTerm: "YouTube/BilibiliのURLまたは検索語を入力",
manageVideos: "動画の管理",
// Home
pasteUrl: "動画またはコレクションのURLを貼り付け",
download: "ダウンロード",
search: "検索",
recentDownloads: "最近のダウンロード",
noDownloads: "ダウンロードはまだありません",
downloadStarted: "ダウンロードを開始しました",
downloadFailed: "ダウンロードに失敗しました",
loadingVideos: "動画を読み込み中...",
searchResultsFor: "検索結果:",
fromYourLibrary: "ライブラリから",
noMatchingVideos: "ライブラリに一致する動画はありません。",
fromYouTube: "YouTubeから",
loadingYouTubeResults: "YouTubeの結果を読み込み中...",
noYouTubeResults: "YouTubeの結果が見つかりません",
noVideosYet: "動画はまだありません。YouTubeのURLを送信して最初の動画をダウンロードしましょう",
views: "回視聴",
// Settings
general: "一般",
security: "セキュリティ",
videoDefaults: "動画プレーヤーのデフォルト",
downloadSettings: "ダウンロード設定",
language: "言語",
enableLogin: "ログイン保護を有効にする",
password: "パスワード",
passwordHelper: "現在のパスワードを維持する場合は空欄にし、変更する場合は入力してください",
passwordSetHelper: "アプリケーションにアクセスするためのパスワードを設定します",
autoPlay: "動画の自動再生",
autoLoop: "動画の自動ループ",
maxConcurrent: "最大同時ダウンロード数",
saveSettings: "設定を保存",
saving: "保存中...",
backToManage: "管理に戻る",
settingsSaved: "設定が正常に保存されました",
settingsFailed: "設定の保存に失敗しました",
debugMode: "デバッグモード",
debugModeDescription: "コンソールメッセージを表示または非表示にします(更新が必要)",
tagsManagement: "タグ管理",
newTag: "新しいタグ",
tags: "タグ",
tagsManagementNote: "タグを追加または削除した後は、変更を適用するために「設定を保存」をクリックすることを忘れないでください。",
// Database
database: "データベース",
migrateDataDescription: "レガシーJSONファイルから新しいSQLiteデータベースにデータを移行します。この操作は複数回実行しても安全です重複はスキップされます。",
migrateDataButton: "JSONからデータを移行",
scanFiles: "ファイルをスキャン",
scanFilesSuccess: "スキャンが完了しました。{count}個の新しい動画を追加しました。",
scanFilesFailed: "スキャンに失敗しました",
migrateConfirmation: "データを移行してもよろしいですか?これには時間がかかる場合があります。",
migrationResults: "移行結果",
migrationReport: "移行レポート",
migrationSuccess: "移行が完了しました。詳細はアラートを確認してください。",
migrationNoData: "移行は終了しましたが、データが見つかりませんでした。",
migrationFailed: "移行に失敗しました",
migrationWarnings: "警告",
migrationErrors: "エラー",
itemsMigrated: "項目が移行されました",
fileNotFound: "ファイルが見つかりません:",
noDataFilesFound: "移行するデータファイルが見つかりませんでした。ボリュームマッピングを確認してください。",
removeLegacyData: "レガシーデータを削除",
removeLegacyDataDescription: "古いJSONファイルvideos.json、collections.jsonなどを削除してディスク容量を解放します。データが正常に移行されたことを確認した後にのみ実行してください。",
removeLegacyDataConfirmTitle: "レガシーデータを削除しますか?",
removeLegacyDataConfirmMessage: "レガシーJSONデータファイルを削除してもよろしいですかこの操作は元に戻せません。",
legacyDataDeleted: "レガシーデータが正常に削除されました。",
deleteLegacyDataButton: "レガシーデータを削除",
// Manage
manageContent: "コンテンツの管理",
videos: "動画",
collections: "コレクション",
allVideos: "すべての動画",
delete: "削除",
backToHome: "ホームに戻る",
confirmDelete: "これを削除してもよろしいですか?",
deleteSuccess: "正常に削除されました",
deleteFailed: "削除に失敗しました",
noVideos: "動画が見つかりません",
noCollections: "コレクションが見つかりません",
searchVideos: "動画を検索...",
thumbnail: "サムネイル",
title: "タイトル",
author: "作成者",
authors: "作成者一覧",
created: "作成日",
name: "名前",
actions: "アクション",
deleteCollection: "コレクションを削除",
deleteVideo: "動画を削除",
noVideosFoundMatching: "検索に一致する動画は見つかりませんでした。",
// Video Player
playing: "再生",
paused: "一時停止",
next: "次へ",
previous: "前へ",
loop: "ループ",
autoPlayOn: "自動再生 オン",
autoPlayOff: "自動再生 オフ",
videoNotFound: "動画が見つかりません",
videoNotFoundOrLoaded: "動画が見つからないか、読み込めませんでした。",
deleting: "削除中...",
addToCollection: "コレクションに追加",
originalLink: "元のリンク",
source: "ソース:",
addedDate: "追加日:",
latestComments: "最新のコメント",
noComments: "コメントはありません。",
upNext: "次はこれ",
noOtherVideos: "他の動画はありません",
currentlyIn: "現在:",
collectionWarning: "別のコレクションに追加すると、現在のコレクションから削除されます。",
addToExistingCollection: "既存のコレクションに追加:",
selectCollection: "コレクションを選択",
add: "追加",
createNewCollection: "新しいコレクションを作成:",
collectionName: "コレクション名",
create: "作成",
removeFromCollection: "コレクションから削除",
confirmRemoveFromCollection: "この動画をコレクションから削除してもよろしいですか?",
remove: "削除",
loadingVideo: "動画を読み込み中...",
current: "(現在)",
rateThisVideo: "この動画を評価",
enterFullscreen: "全画面表示",
exitFullscreen: "全画面表示を終了",
editTitle: "タイトルを編集",
titleUpdated: "タイトルが正常に更新されました",
titleUpdateFailed: "タイトルの更新に失敗しました",
// Login
signIn: "サインイン",
verifying: "確認中...",
incorrectPassword: "パスワードが間違っています",
loginFailed: "パスワードの確認に失敗しました",
defaultPasswordHint: "デフォルトのパスワード: 123",
// Collection Page
loadingCollection: "コレクションを読み込み中...",
collectionNotFound: "コレクションが見つかりません",
noVideosInCollection: "このコレクションには動画がありません。",
back: "戻る",
// Author Videos
loadVideosError: "動画の読み込みに失敗しました。後でもう一度お試しください。",
unknownAuthor: "不明",
noVideosForAuthor: "この作成者の動画は見つかりませんでした。",
// Delete Collection Modal
deleteCollectionTitle: "コレクションを削除",
deleteCollectionConfirmation: "コレクションを削除してもよろしいですか",
collectionContains: "このコレクションには以下が含まれています",
deleteCollectionOnly: "コレクションのみ削除",
deleteCollectionAndVideos: "コレクションとすべての動画を削除",
// Common
loading: "読み込み中...",
error: "エラー",
success: "成功",
cancel: "キャンセル",
confirm: "確認",
save: "保存",
on: "オン",
off: "オフ",
// Video Card
unknownDate: "不明な日付",
part: "パート",
collection: "コレクション",
// Upload Modal
selectVideoFile: "動画ファイルを選択",
pleaseSelectVideo: "動画ファイルを選択してください",
uploadFailed: "アップロードに失敗しました",
failedToUpload: "動画のアップロードに失敗しました",
uploading: "アップロード中...",
upload: "アップロード",
// Bilibili Modal
bilibiliCollectionDetected: "Bilibiliコレクションを検出しました",
bilibiliSeriesDetected: "Bilibiliシリーズを検出しました",
multiPartVideoDetected: "マルチパート動画を検出しました",
collectionHasVideos: "このBilibiliコレクションには{count}個の動画があります。",
seriesHasVideos: "このBilibiliシリーズには{count}個の動画があります。",
videoHasParts: "このBilibili動画には{count}個のパートがあります。",
downloadAllVideos: "全{count}個の動画をダウンロード",
downloadAllParts: "全{count}個のパートをダウンロード",
downloadThisVideoOnly: "この動画のみダウンロード",
downloadCurrentPartOnly: "現在のパートのみダウンロード",
processing: "処理中...",
wouldYouLikeToDownloadAllParts: "すべてのパートをダウンロードしますか?",
wouldYouLikeToDownloadAllVideos: "すべての動画をダウンロードしますか?",
allPartsAddedToCollection: "すべてのパートがこのコレクションに追加されます",
allVideosAddedToCollection: "すべての動画がこのコレクションに追加されます",
queued: "キューに追加済み",
waitingInQueue: "待機中"
};

View File

@@ -0,0 +1,210 @@
export const ko = {
// Header
myTube: "MyTube",
manage: "관리",
settings: "설정",
logout: "로그아웃",
pleaseEnterUrlOrSearchTerm: "동영상 URL 또는 검색어를 입력하세요",
unexpectedErrorOccurred: "예기치 않은 오류가 발생했습니다. 다시 시도해 주세요.",
uploadVideo: "동영상 업로드",
enterUrlOrSearchTerm: "YouTube/Bilibili URL 또는 검색어 입력",
manageVideos: "동영상 관리",
// Home
pasteUrl: "동영상 또는 컬렉션 URL 붙여넣기",
download: "다운로드",
search: "검색",
recentDownloads: "최근 다운로드",
noDownloads: "아직 다운로드 없음",
downloadStarted: "다운로드 시작됨",
downloadFailed: "다운로드 실패",
loadingVideos: "동영상 로드 중...",
searchResultsFor: "검색 결과:",
fromYourLibrary: "라이브러리에서",
noMatchingVideos: "라이브러리에 일치하는 동영상이 없습니다.",
fromYouTube: "YouTube에서",
loadingYouTubeResults: "YouTube 결과 로드 중...",
noYouTubeResults: "YouTube 결과 없음",
noVideosYet: "아직 동영상이 없습니다. YouTube URL을 제출하여 첫 번째 동영상을 다운로드하세요!",
views: "조회수",
// Settings
general: "일반",
security: "보안",
videoDefaults: "동영상 플레이어 기본값",
downloadSettings: "다운로드 설정",
language: "언어",
enableLogin: "로그인 보호 활성화",
password: "비밀번호",
passwordHelper: "현재 비밀번호를 유지하려면 비워 두고, 변경하려면 입력하세요",
passwordSetHelper: "애플리케이션 액세스를 위한 비밀번호 설정",
autoPlay: "동영상 자동 재생",
autoLoop: "동영상 자동 반복",
maxConcurrent: "최대 동시 다운로드 수",
saveSettings: "설정 저장",
saving: "저장 중...",
backToManage: "관리로 돌아가기",
settingsSaved: "설정이 성공적으로 저장되었습니다",
settingsFailed: "설정 저장 실패",
debugMode: "디버그 모드",
debugModeDescription: "콘솔 메시지 표시 또는 숨기기 (새로 고침 필요)",
tagsManagement: "태그 관리",
newTag: "새 태그",
tags: "태그",
tagsManagementNote: "태그를 추가하거나 제거한 후 변경 사항을 적용하려면 \"설정 저장\"을 클릭하는 것을 잊지 마세요.",
// Database
database: "데이터베이스",
migrateDataDescription: "레거시 JSON 파일에서 새 SQLite 데이터베이스로 데이터를 마이그레이션합니다. 이 작업은 여러 번 실행해도 안전합니다(중복은 건너뜀).",
migrateDataButton: "JSON에서 데이터 마이그레이션",
scanFiles: "파일 스캔",
scanFilesSuccess: "스캔 완료. {count}개의 새 동영상이 추가되었습니다.",
scanFilesFailed: "스캔 실패",
migrateConfirmation: "데이터를 마이그레이션하시겠습니까? 잠시 시간이 걸릴 수 있습니다.",
migrationResults: "마이그레이션 결과",
migrationReport: "마이그레이션 보고서",
migrationSuccess: "마이그레이션 완료. 알림에서 세부 정보를 확인하세요.",
migrationNoData: "마이그레이션이 완료되었지만 데이터를 찾을 수 없습니다.",
migrationFailed: "마이그레이션 실패",
migrationWarnings: "경고",
migrationErrors: "오류",
itemsMigrated: "항목 마이그레이션됨",
fileNotFound: "파일을 찾을 수 없음:",
noDataFilesFound: "마이그레이션할 데이터 파일을 찾을 수 없습니다. 볼륨 매핑을 확인하세요.",
removeLegacyData: "레거시 데이터 제거",
removeLegacyDataDescription: "오래된 JSON 파일(videos.json, collections.json 등)을 삭제하여 디스크 공간을 확보합니다. 데이터가 성공적으로 마이그레이션되었는지 확인한 후에만 이 작업을 수행하세요.",
removeLegacyDataConfirmTitle: "레거시 데이터를 삭제하시겠습니까?",
removeLegacyDataConfirmMessage: "레거시 JSON 데이터 파일을 삭제하시겠습니까? 이 작업은 취소할 수 없습니다.",
legacyDataDeleted: "레거시 데이터가 성공적으로 삭제되었습니다.",
deleteLegacyDataButton: "레거시 데이터 삭제",
// Manage
manageContent: "콘텐츠 관리",
videos: "동영상",
collections: "컬렉션",
allVideos: "모든 동영상",
delete: "삭제",
backToHome: "홈으로 돌아가기",
confirmDelete: "정말로 삭제하시겠습니까?",
deleteSuccess: "성공적으로 삭제됨",
deleteFailed: "삭제 실패",
noVideos: "동영상 없음",
noCollections: "컬렉션 없음",
searchVideos: "동영상 검색...",
thumbnail: "썸네일",
title: "제목",
author: "작성자",
authors: "작성자 목록",
created: "생성일",
name: "이름",
actions: "작업",
deleteCollection: "컬렉션 삭제",
deleteVideo: "동영상 삭제",
noVideosFoundMatching: "검색과 일치하는 동영상이 없습니다.",
// Video Player
playing: "재생",
paused: "일시 중지",
next: "다음",
previous: "이전",
loop: "반복",
autoPlayOn: "자동 재생 켜기",
autoPlayOff: "자동 재생 끄기",
videoNotFound: "동영상을 찾을 수 없음",
videoNotFoundOrLoaded: "동영상을 찾을 수 없거나 로드할 수 없습니다.",
deleting: "삭제 중...",
addToCollection: "컬렉션에 추가",
originalLink: "원본 링크",
source: "출처:",
addedDate: "추가 날짜:",
latestComments: "최신 댓글",
noComments: "댓글이 없습니다.",
upNext: "다음 재생",
noOtherVideos: "다른 동영상 없음",
currentlyIn: "현재 위치:",
collectionWarning: "다른 컬렉션에 추가하면 현재 컬렉션에서 제거됩니다.",
addToExistingCollection: "기존 컬렉션에 추가:",
selectCollection: "컬렉션 선택",
add: "추가",
createNewCollection: "새 컬렉션 만들기:",
collectionName: "컬렉션 이름",
create: "만들기",
removeFromCollection: "컬렉션에서 제거",
confirmRemoveFromCollection: "이 동영상을 컬렉션에서 제거하시겠습니까?",
remove: "제거",
loadingVideo: "동영상 로드 중...",
current: "(현재)",
rateThisVideo: "이 동영상 평가",
enterFullscreen: "전체 화면",
exitFullscreen: "전체 화면 종료",
editTitle: "제목 편집",
titleUpdated: "제목이 성공적으로 업데이트됨",
titleUpdateFailed: "제목 업데이트 실패",
// Login
signIn: "로그인",
verifying: "확인 중...",
incorrectPassword: "비밀번호가 올바르지 않습니다",
loginFailed: "비밀번호 확인 실패",
defaultPasswordHint: "기본 비밀번호: 123",
// Collection Page
loadingCollection: "컬렉션 로드 중...",
collectionNotFound: "컬렉션을 찾을 수 없음",
noVideosInCollection: "이 컬렉션에는 동영상이 없습니다.",
back: "뒤로",
// Author Videos
loadVideosError: "동영상을 로드하지 못했습니다. 나중에 다시 시도해 주세요.",
unknownAuthor: "알 수 없음",
noVideosForAuthor: "이 작성자의 동영상이 없습니다.",
// Delete Collection Modal
deleteCollectionTitle: "컬렉션 삭제",
deleteCollectionConfirmation: "컬렉션을 삭제하시겠습니까",
collectionContains: "이 컬렉션 포함 내용",
deleteCollectionOnly: "컬렉션만 삭제",
deleteCollectionAndVideos: "컬렉션 및 모든 동영상 삭제",
// Common
loading: "로드 중...",
error: "오류",
success: "성공",
cancel: "취소",
confirm: "확인",
save: "저장",
on: "켜기",
off: "끄기",
// Video Card
unknownDate: "알 수 없는 날짜",
part: "파트",
collection: "컬렉션",
// Upload Modal
selectVideoFile: "동영상 파일 선택",
pleaseSelectVideo: "동영상 파일을 선택하세요",
uploadFailed: "업로드 실패",
failedToUpload: "동영상 업로드 실패",
uploading: "업로드 중...",
upload: "업로드",
// Bilibili Modal
bilibiliCollectionDetected: "Bilibili 컬렉션 감지됨",
bilibiliSeriesDetected: "Bilibili 시리즈 감지됨",
multiPartVideoDetected: "멀티 파트 동영상 감지됨",
collectionHasVideos: "이 Bilibili 컬렉션에는 {count}개의 동영상이 있습니다.",
seriesHasVideos: "이 Bilibili 시리즈에는 {count}개의 동영상이 있습니다.",
videoHasParts: "이 Bilibili 동영상에는 {count}개의 파트가 있습니다.",
downloadAllVideos: "모든 {count}개 동영상 다운로드",
downloadAllParts: "모든 {count}개 파트 다운로드",
downloadThisVideoOnly: "이 동영상만 다운로드",
downloadCurrentPartOnly: "현재 파트만 다운로드",
processing: "처리 중...",
wouldYouLikeToDownloadAllParts: "모든 파트를 다운로드하시겠습니까?",
wouldYouLikeToDownloadAllVideos: "모든 동영상을 다운로드하시겠습니까?",
allPartsAddedToCollection: "모든 파트가 이 컬렉션에 추가됩니다",
allVideosAddedToCollection: "모든 동영상이 이 컬렉션에 추가됩니다",
queued: "대기열에 추가됨",
waitingInQueue: "대기 중"
};

View File

@@ -0,0 +1,210 @@
export const pt = {
// Header
myTube: "MyTube",
manage: "Gerenciar",
settings: "Configurações",
logout: "Sair",
pleaseEnterUrlOrSearchTerm: "Por favor, insira uma URL de vídeo ou termo de pesquisa",
unexpectedErrorOccurred: "Ocorreu um erro inesperado. Por favor, tente novamente.",
uploadVideo: "Enviar Vídeo",
enterUrlOrSearchTerm: "Insira URL do YouTube/Bilibili ou termo de pesquisa",
manageVideos: "Gerenciar Vídeos",
// Home
pasteUrl: "Colar URL de vídeo ou coleção",
download: "Baixar",
search: "Pesquisar",
recentDownloads: "Downloads Recentes",
noDownloads: "Nenhum download ainda",
downloadStarted: "Download iniciado",
downloadFailed: "Falha no download",
loadingVideos: "Carregando vídeos...",
searchResultsFor: "Resultados da pesquisa para",
fromYourLibrary: "Da sua Biblioteca",
noMatchingVideos: "Nenhum vídeo correspondente na sua biblioteca.",
fromYouTube: "Do YouTube",
loadingYouTubeResults: "Carregando resultados do YouTube...",
noYouTubeResults: "Nenhum resultado do YouTube encontrado",
noVideosYet: "Nenhum vídeo ainda. Envie uma URL do YouTube para baixar seu primeiro vídeo!",
views: "visualizações",
// Settings
general: "Geral",
security: "Segurança",
videoDefaults: "Padrões do Reprodutor de Vídeo",
downloadSettings: "Configurações de Download",
language: "Idioma",
enableLogin: "Ativar Proteção de Login",
password: "Senha",
passwordHelper: "Deixe em branco para manter a senha atual, ou digite para alterar",
passwordSetHelper: "Definir uma senha para acessar o aplicativo",
autoPlay: "Reprodução Automática de Vídeos",
autoLoop: "Repetição Automática de Vídeos",
maxConcurrent: "Máximo de Downloads Simultâneos",
saveSettings: "Salvar Configurações",
saving: "Salvando...",
backToManage: "Voltar para Gerenciar",
settingsSaved: "Configurações salvas com sucesso",
settingsFailed: "Falha ao salvar configurações",
debugMode: "Modo de Depuração",
debugModeDescription: "Mostrar ou ocultar mensagens do console (requer atualização)",
tagsManagement: "Gerenciamento de Tags",
newTag: "Nova Tag",
tags: "Tags",
tagsManagementNote: "Lembre-se de clicar em \"Salvar Configurações\" após adicionar ou remover tags para aplicar as alterações.",
// Database
database: "Banco de Dados",
migrateDataDescription: "Migrar dados de arquivos JSON legados para o novo banco de dados SQLite. Esta ação é segura para executar várias vezes (duplicatas serão ignoradas).",
migrateDataButton: "Migrar Dados do JSON",
scanFiles: "Escanear Arquivos",
scanFilesSuccess: "Escaneamento completo. {count} novos vídeos adicionados.",
scanFilesFailed: "Falha no escaneamento",
migrateConfirmation: "Tem certeza de que deseja migrar os dados? Isso pode levar alguns instantes.",
migrationResults: "Resultados da Migração",
migrationReport: "Relatório de Migração",
migrationSuccess: "Migração concluída. Veja detalhes no alerta.",
migrationNoData: "Migração finalizada, mas nenhum dado encontrado.",
migrationFailed: "Falha na migração",
migrationWarnings: "AVISOS",
migrationErrors: "ERROS",
itemsMigrated: "itens migrados",
fileNotFound: "Arquivo não encontrado em",
noDataFilesFound: "Nenhum arquivo de dados encontrado para migrar. Verifique seus mapeamentos de volume.",
removeLegacyData: "Remover Dados Legados",
removeLegacyDataDescription: "Excluir os arquivos JSON antigos (videos.json, collections.json, etc.) para liberar espaço em disco. Faça isso apenas após verificar se seus dados foram migrados com sucesso.",
removeLegacyDataConfirmTitle: "Excluir Dados Legados?",
removeLegacyDataConfirmMessage: "Tem certeza de que deseja excluir os arquivos de dados JSON legados? Esta ação não pode ser desfeita.",
legacyDataDeleted: "Dados legados excluídos com sucesso.",
deleteLegacyDataButton: "Excluir Dados Legados",
// Manage
manageContent: "Gerenciar Conteúdo",
videos: "Vídeos",
collections: "Coleções",
allVideos: "Todos os Vídeos",
delete: "Excluir",
backToHome: "Voltar para Início",
confirmDelete: "Tem certeza de que deseja excluir isto?",
deleteSuccess: "Excluído com sucesso",
deleteFailed: "Falha ao excluir",
noVideos: "Nenhum vídeo encontrado",
noCollections: "Nenhuma coleção encontrada",
searchVideos: "Pesquisar vídeos...",
thumbnail: "Miniatura",
title: "Título",
author: "Autor",
authors: "Autores",
created: "Criado",
name: "Nome",
actions: "Ações",
deleteCollection: "Excluir Coleção",
deleteVideo: "Excluir Vídeo",
noVideosFoundMatching: "Nenhum vídeo encontrado correspondente à sua pesquisa.",
// Video Player
playing: "Reproduzir",
paused: "Pausar",
next: "Próximo",
previous: "Anterior",
loop: "Repetir",
autoPlayOn: "Reprodução Automática Ligada",
autoPlayOff: "Reprodução Automática Desligada",
videoNotFound: "Vídeo não encontrado",
videoNotFoundOrLoaded: "Vídeo não encontrado ou não pôde ser carregado.",
deleting: "Excluindo...",
addToCollection: "Adicionar à Coleção",
originalLink: "Link Original",
source: "Fonte:",
addedDate: "Data de Adição:",
latestComments: "Últimos Comentários",
noComments: "Nenhum comentário disponível.",
upNext: "A Seguir",
noOtherVideos: "Nenhum outro vídeo disponível",
currentlyIn: "Atualmente em:",
collectionWarning: "Adicionar a uma coleção diferente removerá da atual.",
addToExistingCollection: "Adicionar a coleção existente:",
selectCollection: "Selecionar uma coleção",
add: "Adicionar",
createNewCollection: "Criar nova coleção:",
collectionName: "Nome da coleção",
create: "Criar",
removeFromCollection: "Remover da Coleção",
confirmRemoveFromCollection: "Tem certeza de que deseja remover este vídeo da coleção?",
remove: "Remover",
loadingVideo: "Carregando vídeo...",
current: "(Atual)",
rateThisVideo: "Avaliar este vídeo",
enterFullscreen: "Tela Cheia",
exitFullscreen: "Sair da Tela Cheia",
editTitle: "Editar Título",
titleUpdated: "Título atualizado com sucesso",
titleUpdateFailed: "Falha ao atualizar título",
// Login
signIn: "Entrar",
verifying: "Verificando...",
incorrectPassword: "Senha incorreta",
loginFailed: "Falha ao verificar senha",
defaultPasswordHint: "Senha padrão: 123",
// Collection Page
loadingCollection: "Carregando coleção...",
collectionNotFound: "Coleção não encontrada",
noVideosInCollection: "Nenhum vídeo nesta coleção.",
back: "Voltar",
// Author Videos
loadVideosError: "Falha ao carregar vídeos. Por favor, tente novamente mais tarde.",
unknownAuthor: "Desconhecido",
noVideosForAuthor: "Nenhum vídeo encontrado para este autor.",
// Delete Collection Modal
deleteCollectionTitle: "Excluir Coleção",
deleteCollectionConfirmation: "Tem certeza de que deseja excluir a coleção",
collectionContains: "Esta coleção contém",
deleteCollectionOnly: "Excluir Apenas Coleção",
deleteCollectionAndVideos: "Excluir Coleção e Todos os Vídeos",
// Common
loading: "Carregando...",
error: "Erro",
success: "Sucesso",
cancel: "Cancelar",
confirm: "Confirmar",
save: "Salvar",
on: "Ligado",
off: "Desligado",
// Video Card
unknownDate: "Data desconhecida",
part: "Parte",
collection: "Coleção",
// Upload Modal
selectVideoFile: "Selecionar Arquivo de Vídeo",
pleaseSelectVideo: "Por favor, selecione um arquivo de vídeo",
uploadFailed: "Falha no envio",
failedToUpload: "Falha ao enviar vídeo",
uploading: "Enviando...",
upload: "Enviar",
// Bilibili Modal
bilibiliCollectionDetected: "Coleção Bilibili Detectada",
bilibiliSeriesDetected: "Série Bilibili Detectada",
multiPartVideoDetected: "Vídeo em Múltiplas Partes Detectado",
collectionHasVideos: "Esta coleção Bilibili tem {count} vídeos.",
seriesHasVideos: "Esta série Bilibili tem {count} vídeos.",
videoHasParts: "Este vídeo Bilibili tem {count} partes.",
downloadAllVideos: "Baixar Todos os {count} Vídeos",
downloadAllParts: "Baixar Todas as {count} Partes",
downloadThisVideoOnly: "Baixar Apenas Este Vídeo",
downloadCurrentPartOnly: "Baixar Apenas Parte Atual",
processing: "Processando...",
wouldYouLikeToDownloadAllParts: "Gostaria de baixar todas as partes?",
wouldYouLikeToDownloadAllVideos: "Gostaria de baixar todos os vídeos?",
allPartsAddedToCollection: "Todas as partes serão adicionadas a esta coleção",
allVideosAddedToCollection: "Todos os vídeos serão adicionados a esta coleção",
queued: "Na fila",
waitingInQueue: "Aguardando na fila"
};

View File

@@ -0,0 +1,210 @@
export const ru = {
// Header
myTube: "MyTube",
manage: "Управление",
settings: "Настройки",
logout: "Выйти",
pleaseEnterUrlOrSearchTerm: "Пожалуйста, введите URL видео или поисковый запрос",
unexpectedErrorOccurred: "Произошла непредвиденная ошибка. Пожалуйста, попробуйте снова.",
uploadVideo: "Загрузить видео",
enterUrlOrSearchTerm: "Введите URL YouTube/Bilibili или поисковый запрос",
manageVideos: "Управление видео",
// Home
pasteUrl: "Вставьте URL видео или коллекции",
download: "Скачать",
search: "Поиск",
recentDownloads: "Недавние загрузки",
noDownloads: "Загрузок пока нет",
downloadStarted: "Загрузка началась",
downloadFailed: "Ошибка загрузки",
loadingVideos: "Загрузка видео...",
searchResultsFor: "Результаты поиска для",
fromYourLibrary: "Из вашей библиотеки",
noMatchingVideos: "В вашей библиотеке нет подходящих видео.",
fromYouTube: "С YouTube",
loadingYouTubeResults: "Загрузка результатов YouTube...",
noYouTubeResults: "Результаты YouTube не найдены",
noVideosYet: "Видео пока нет. Отправьте URL YouTube, чтобы скачать ваше первое видео!",
views: "просмотров",
// Settings
general: "Общие",
security: "Безопасность",
videoDefaults: "Настройки плеера по умолчанию",
downloadSettings: "Настройки загрузки",
language: "Язык",
enableLogin: "Включить защиту входа",
password: "Пароль",
passwordHelper: "Оставьте пустым, чтобы сохранить текущий пароль, или введите новый для изменения",
passwordSetHelper: "Установите пароль для доступа к приложению",
autoPlay: "Автовоспроизведение видео",
autoLoop: "Автоповтор видео",
maxConcurrent: "Макс. одновременных загрузок",
saveSettings: "Сохранить настройки",
saving: "Сохранение...",
backToManage: "Назад к управлению",
settingsSaved: "Настройки успешно сохранены",
settingsFailed: "Не удалось сохранить настройки",
debugMode: "Режим отладки",
debugModeDescription: "Показать или скрыть сообщения консоли (требуется обновление)",
tagsManagement: "Управление тегами",
newTag: "Новый тег",
tags: "Теги",
tagsManagementNote: "Пожалуйста, не забудьте нажать «Сохранить настройки» после добавления или удаления тегов, чтобы применить изменения.",
// Database
database: "База данных",
migrateDataDescription: "Перенос данных из устаревших файлов JSON в новую базу данных SQLite. Это действие безопасно запускать несколько раз (дубликаты будут пропущены).",
migrateDataButton: "Перенести данные из JSON",
scanFiles: "Сканировать файлы",
scanFilesSuccess: "Сканирование завершено. Добавлено {count} новых видео.",
scanFilesFailed: "Ошибка сканирования",
migrateConfirmation: "Вы уверены, что хотите перенести данные? Это может занять некоторое время.",
migrationResults: "Результаты миграции",
migrationReport: "Отчет о миграции",
migrationSuccess: "Миграция завершена. Подробности см. в оповещении.",
migrationNoData: "Миграция завершена, но данные не найдены.",
migrationFailed: "Ошибка миграции",
migrationWarnings: "ПРЕДУПРЕЖДЕНИЯ",
migrationErrors: "ОШИБКИ",
itemsMigrated: "элементов перенесено",
fileNotFound: "Файл не найден в",
noDataFilesFound: "Файлы данных для миграции не найдены. Пожалуйста, проверьте сопоставления томов.",
removeLegacyData: "Удалить устаревшие данные",
removeLegacyDataDescription: "Удалите старые файлы JSON (videos.json, collections.json и т.д.), чтобы освободить место на диске. Делайте это только после проверки успешной миграции ваших данных.",
removeLegacyDataConfirmTitle: "Удалить устаревшие данные?",
removeLegacyDataConfirmMessage: "Вы уверены, что хотите удалить устаревшие файлы данных JSON? Это действие нельзя отменить.",
legacyDataDeleted: "Устаревшие данные успешно удалены.",
deleteLegacyDataButton: "Удалить устаревшие данные",
// Manage
manageContent: "Управление контентом",
videos: "Видео",
collections: "Коллекции",
allVideos: "Все видео",
delete: "Удалить",
backToHome: "Назад на главную",
confirmDelete: "Вы уверены, что хотите удалить это?",
deleteSuccess: "Успешно удалено",
deleteFailed: "Не удалось удалить",
noVideos: "Видео не найдено",
noCollections: "Коллекции не найдены",
searchVideos: "Поиск видео...",
thumbnail: "Миниатюра",
title: "Название",
author: "Автор",
authors: "Авторы",
created: "Создано",
name: "Имя",
actions: "Действия",
deleteCollection: "Удалить коллекцию",
deleteVideo: "Удалить видео",
noVideosFoundMatching: "Видео, соответствующие вашему поиску, не найдены.",
// Video Player
playing: "Воспроизведение",
paused: "Пауза",
next: "Следующее",
previous: "Предыдущее",
loop: "Повтор",
autoPlayOn: "Автовоспроизведение вкл.",
autoPlayOff: "Автовоспроизведение выкл.",
videoNotFound: "Видео не найдено",
videoNotFoundOrLoaded: "Видео не найдено или не может быть загружено.",
deleting: "Удаление...",
addToCollection: "Добавить в коллекцию",
originalLink: "Оригинальная ссылка",
source: "Источник:",
addedDate: "Дата добавления:",
latestComments: "Последние комментарии",
noComments: "Комментарии недоступны.",
upNext: "Далее",
noOtherVideos: "Других видео нет",
currentlyIn: "Сейчас в:",
collectionWarning: "Добавление в другую коллекцию удалит его из текущей.",
addToExistingCollection: "Добавить в существующую коллекцию:",
selectCollection: "Выберите коллекцию",
add: "Добавить",
createNewCollection: "Создать новую коллекцию:",
collectionName: "Название коллекции",
create: "Создать",
removeFromCollection: "Удалить из коллекции",
confirmRemoveFromCollection: "Вы уверены, что хотите удалить это видео из коллекции?",
remove: "Удалить",
loadingVideo: "Загрузка видео...",
current: "(Текущее)",
rateThisVideo: "Оценить это видео",
enterFullscreen: "На весь экран",
exitFullscreen: "Выйти из полноэкранного режима",
editTitle: "Редактировать название",
titleUpdated: "Название успешно обновлено",
titleUpdateFailed: "Не удалось обновить название",
// Login
signIn: "Войти",
verifying: "Проверка...",
incorrectPassword: "Неверный пароль",
loginFailed: "Ошибка проверки пароля",
defaultPasswordHint: "Пароль по умолчанию: 123",
// Collection Page
loadingCollection: "Загрузка коллекции...",
collectionNotFound: "Коллекция не найдена",
noVideosInCollection: "В этой коллекции нет видео.",
back: "Назад",
// Author Videos
loadVideosError: "Не удалось загрузить видео. Пожалуйста, попробуйте позже.",
unknownAuthor: "Неизвестно",
noVideosForAuthor: "Видео этого автора не найдены.",
// Delete Collection Modal
deleteCollectionTitle: "Удалить коллекцию",
deleteCollectionConfirmation: "Вы уверены, что хотите удалить коллекцию",
collectionContains: "Эта коллекция содержит",
deleteCollectionOnly: "Удалить только коллекцию",
deleteCollectionAndVideos: "Удалить коллекцию и все видео",
// Common
loading: "Загрузка...",
error: "Ошибка",
success: "Успех",
cancel: "Отмена",
confirm: "Подтвердить",
save: "Сохранить",
on: "Вкл.",
off: "Выкл.",
// Video Card
unknownDate: "Неизвестная дата",
part: "Часть",
collection: "Коллекция",
// Upload Modal
selectVideoFile: "Выберите видеофайл",
pleaseSelectVideo: "Пожалуйста, выберите видеофайл",
uploadFailed: "Ошибка загрузки",
failedToUpload: "Не удалось загрузить видео",
uploading: "Загрузка...",
upload: "Загрузить",
// Bilibili Modal
bilibiliCollectionDetected: "Обнаружена коллекция Bilibili",
bilibiliSeriesDetected: "Обнаружена серия Bilibili",
multiPartVideoDetected: "Обнаружено многочастное видео",
collectionHasVideos: "В этой коллекции Bilibili {count} видео.",
seriesHasVideos: "В этой серии Bilibili {count} видео.",
videoHasParts: "В этом видео Bilibili {count} частей.",
downloadAllVideos: "Скачать все {count} видео",
downloadAllParts: "Скачать все {count} частей",
downloadThisVideoOnly: "Скачать только это видео",
downloadCurrentPartOnly: "Скачать только текущую часть",
processing: "Обработка...",
wouldYouLikeToDownloadAllParts: "Хотите скачать все части?",
wouldYouLikeToDownloadAllVideos: "Хотите скачать все видео?",
allPartsAddedToCollection: "Все части будут добавлены в эту коллекцию",
allVideosAddedToCollection: "Все видео будут добавлены в эту коллекцию",
queued: "В очереди",
waitingInQueue: "Ожидание в очереди"
};

View File

@@ -0,0 +1,210 @@
export const zh = {
// Header
myTube: "MyTube",
manage: "管理",
settings: "设置",
logout: "退出",
pleaseEnterUrlOrSearchTerm: "请输入视频链接或搜索关键词",
unexpectedErrorOccurred: "发生意外错误,请重试",
uploadVideo: "上传视频",
enterUrlOrSearchTerm: "输入 YouTube/Bilibili 链接或搜索关键词",
manageVideos: "管理视频",
// Home
pasteUrl: "粘贴视频或合集链接",
download: "下载",
search: "搜索",
recentDownloads: "最近下载",
noDownloads: "暂无下载",
downloadStarted: "开始下载",
downloadFailed: "下载失败",
loadingVideos: "加载视频中...",
searchResultsFor: "搜索结果:",
fromYourLibrary: "来自您的媒体库",
noMatchingVideos: "媒体库中未找到匹配视频",
fromYouTube: "来自 YouTube",
loadingYouTubeResults: "加载 YouTube 结果中...",
noYouTubeResults: "未找到 YouTube 结果",
noVideosYet: "暂无视频。提交 YouTube 链接以下载您的第一个视频!",
views: "次观看",
// Settings
general: "常规",
security: "安全",
videoDefaults: "播放器默认设置",
downloadSettings: "下载设置",
language: "语言",
enableLogin: "启用登录保护",
password: "密码",
passwordHelper: "留空以保持当前密码,或输入新密码以更改",
passwordSetHelper: "设置访问应用程序的密码",
autoPlay: "自动播放视频",
autoLoop: "自动循环播放",
maxConcurrent: "最大同时下载数",
saveSettings: "保存设置",
saving: "保存中...",
backToManage: "返回管理",
settingsSaved: "设置保存成功",
settingsFailed: "保存设置失败",
debugMode: "调试模式",
debugModeDescription: "显示或隐藏控制台消息(需要刷新)",
tagsManagement: "标签管理",
newTag: "新标签",
tags: "标签",
tagsManagementNote: "添加或删除标签后,请记得点击“保存设置”以应用更改。",
// Database
database: "数据库",
migrateDataDescription: "从旧版 JSON 文件迁移数据到新的 SQLite 数据库。此操作可以安全地多次运行(将跳过重复项)。",
migrateDataButton: "从 JSON 迁移数据",
scanFiles: "扫描文件",
scanFilesSuccess: "扫描完成。添加了 {count} 个新视频。",
scanFilesFailed: "扫描失败",
migrateConfirmation: "确定要迁移数据吗?这可能需要一些时间。",
migrationResults: "迁移结果",
migrationReport: "迁移报告",
migrationSuccess: "迁移完成。请查看警报中的详细信息。",
migrationNoData: "迁移完成但未找到数据。",
migrationFailed: "迁移失败",
migrationWarnings: "警告",
migrationErrors: "错误",
itemsMigrated: "项已迁移",
fileNotFound: "未找到文件于",
noDataFilesFound: "未找到可迁移的数据文件。请检查您的卷映射。",
removeLegacyData: "删除旧数据",
removeLegacyDataDescription: "删除旧的 JSON 文件videos.json, collections.json 等)以释放磁盘空间。请仅在确认数据已成功迁移后执行此操作。",
removeLegacyDataConfirmTitle: "删除旧数据?",
removeLegacyDataConfirmMessage: "确定要删除旧的 JSON 数据文件吗?此操作无法撤销。",
legacyDataDeleted: "旧数据删除成功。",
deleteLegacyDataButton: "删除旧数据",
// Manage
manageContent: "内容管理",
videos: "视频",
collections: "合集",
allVideos: "所有视频",
delete: "删除",
backToHome: "返回首页",
confirmDelete: "确定要删除吗?",
deleteSuccess: "删除成功",
deleteFailed: "删除失败",
noVideos: "未找到视频",
noCollections: "未找到合集",
searchVideos: "搜索视频...",
thumbnail: "缩略图",
title: "标题",
author: "作者",
authors: "作者列表",
created: "创建时间",
name: "名称",
actions: "操作",
deleteCollection: "删除合集",
deleteVideo: "删除视频",
noVideosFoundMatching: "未找到匹配的视频。",
// Video Player
playing: "播放",
paused: "暂停",
next: "下一个",
previous: "上一个",
loop: "循环",
autoPlayOn: "自动播放已开启",
autoPlayOff: "自动播放已关闭",
videoNotFound: "未找到视频",
videoNotFoundOrLoaded: "未找到视频或无法加载。",
deleting: "删除中...",
addToCollection: "添加到合集",
originalLink: "原始链接",
source: "来源:",
addedDate: "添加日期:",
latestComments: "最新评论",
noComments: "暂无评论。",
upNext: "接下来播放",
noOtherVideos: "没有其他视频",
currentlyIn: "当前所在:",
collectionWarning: "添加到其他合集将从当前合集中移除。",
addToExistingCollection: "添加到现有合集:",
selectCollection: "选择合集",
add: "添加",
createNewCollection: "创建新合集:",
collectionName: "合集名称",
create: "创建",
removeFromCollection: "从合集中移除",
confirmRemoveFromCollection: "确定要从合集中移除此视频吗?",
remove: "移除",
loadingVideo: "加载视频中...",
current: "(当前)",
rateThisVideo: "给视频评分",
enterFullscreen: "全屏",
exitFullscreen: "退出全屏",
editTitle: "编辑标题",
titleUpdated: "标题更新成功",
titleUpdateFailed: "更新标题失败",
// Login
signIn: "登录",
verifying: "验证中...",
incorrectPassword: "密码错误",
loginFailed: "验证密码失败",
defaultPasswordHint: "默认密码123",
// Collection Page
loadingCollection: "加载合集中...",
collectionNotFound: "未找到合集",
noVideosInCollection: "此合集中没有视频。",
back: "返回",
// Author Videos
loadVideosError: "加载视频失败,请稍后再试。",
unknownAuthor: "未知",
noVideosForAuthor: "未找到该作者的视频。",
// Delete Collection Modal
deleteCollectionTitle: "删除合集",
deleteCollectionConfirmation: "确定要删除合集",
collectionContains: "此合集包含",
deleteCollectionOnly: "仅删除合集",
deleteCollectionAndVideos: "删除合集及所有视频",
// Common
loading: "加载中...",
error: "错误",
success: "成功",
cancel: "取消",
confirm: "确认",
save: "保存",
on: "开启",
off: "关闭",
// Video Card
unknownDate: "未知日期",
part: "分P",
collection: "合集",
// Upload Modal
selectVideoFile: "选择视频文件",
pleaseSelectVideo: "请选择视频文件",
uploadFailed: "上传失败",
failedToUpload: "视频上传失败",
uploading: "上传中...",
upload: "上传",
// Bilibili Modal
bilibiliCollectionDetected: "检测到 Bilibili 合集",
bilibiliSeriesDetected: "检测到 Bilibili 系列",
multiPartVideoDetected: "检测到多P视频",
collectionHasVideos: "此合集包含 {count} 个视频。",
seriesHasVideos: "此系列包含 {count} 个视频。",
videoHasParts: "此视频包含 {count} 个分P。",
downloadAllVideos: "下载所有 {count} 个视频",
downloadAllParts: "下载所有 {count} 个分P",
downloadThisVideoOnly: "仅下载此视频",
downloadCurrentPartOnly: "仅下载当前分P",
processing: "处理中...",
wouldYouLikeToDownloadAllParts: "您想要下载所有分P吗",
wouldYouLikeToDownloadAllVideos: "您想要下载所有视频吗?",
allPartsAddedToCollection: "所有分P将被添加到此合集",
allVideosAddedToCollection: "所有视频将被添加到此合集",
queued: "已排队",
waitingInQueue: "等待中"
};

View File

@@ -1,425 +1,26 @@
import { ar } from './locales/ar';
import { de } from './locales/de';
import { en } from './locales/en';
import { es } from './locales/es';
import { fr } from './locales/fr';
import { ja } from './locales/ja';
import { ko } from './locales/ko';
import { pt } from './locales/pt';
import { ru } from './locales/ru';
import { zh } from './locales/zh';
export const translations = {
en: {
// Header
myTube: "MyTube",
manage: "Manage",
settings: "Settings",
logout: "Logout",
pleaseEnterUrlOrSearchTerm: "Please enter a video URL or search term",
unexpectedErrorOccurred: "An unexpected error occurred. Please try again.",
uploadVideo: "Upload Video",
enterUrlOrSearchTerm: "Enter YouTube/Bilibili URL or search term",
manageVideos: "Manage Videos",
// Home
pasteUrl: "Paste video or collection URL",
download: "Download",
search: "Search",
recentDownloads: "Recent Downloads",
noDownloads: "No downloads yet",
downloadStarted: "Download started",
downloadFailed: "Download failed",
loadingVideos: "Loading videos...",
searchResultsFor: "Search Results for",
fromYourLibrary: "From Your Library",
noMatchingVideos: "No matching videos in your library.",
fromYouTube: "From YouTube",
loadingYouTubeResults: "Loading YouTube results...",
noYouTubeResults: "No YouTube results found",
noVideosYet: "No videos yet. Submit a YouTube URL to download your first video!",
views: "views",
// Settings
general: "General",
security: "Security",
videoDefaults: "Video Player Defaults",
downloadSettings: "Download Settings",
language: "Language",
enableLogin: "Enable Login Protection",
password: "Password",
passwordHelper: "Leave empty to keep current password, or type to change",
passwordSetHelper: "Set a password for accessing the application",
autoPlay: "Auto-play Videos",
autoLoop: "Auto-loop Videos",
maxConcurrent: "Max Concurrent Downloads",
saveSettings: "Save Settings",
saving: "Saving...",
backToManage: "Back to Manage",
settingsSaved: "Settings saved successfully",
settingsFailed: "Failed to save settings",
debugMode: "Debug Mode",
debugModeDescription: "Show or hide console messages (requires refresh)",
tagsManagement: "Tags Management",
newTag: "New Tag",
tags: "Tags",
tagsManagementNote: "Please remember to click \"Save Settings\" after adding or removing tags to apply changes.",
// Database
database: "Database",
migrateDataDescription: "Migrate data from legacy JSON files to the new SQLite database. This action is safe to run multiple times (duplicates will be skipped).",
migrateDataButton: "Migrate Data from JSON",
scanFiles: "Scan Files",
scanFilesSuccess: "Scan complete. Added {count} new videos.",
scanFilesFailed: "Scan failed",
migrateConfirmation: "Are you sure you want to migrate data? This may take a few moments.",
migrationResults: "Migration Results",
migrationReport: "Migration Report",
migrationSuccess: "Migration completed. See details in alert.",
migrationNoData: "Migration finished but no data found.",
migrationFailed: "Migration failed",
migrationWarnings: "WARNINGS",
migrationErrors: "ERRORS",
itemsMigrated: "items migrated",
fileNotFound: "File not found at",
noDataFilesFound: "No data files were found to migrate. Please check your volume mappings.",
removeLegacyData: "Remove Legacy Data",
removeLegacyDataDescription: "Delete the old JSON files (videos.json, collections.json, etc.) to clean up disk space. Only do this after verifying your data has been successfully migrated.",
removeLegacyDataConfirmTitle: "Delete Legacy Data?",
removeLegacyDataConfirmMessage: "Are you sure you want to delete the legacy JSON data files? This action cannot be undone.",
legacyDataDeleted: "Legacy data deleted successfully.",
deleteLegacyDataButton: "Delete Legacy Data",
// Manage
manageContent: "Manage Content",
videos: "Videos",
collections: "Collections",
allVideos: "All Videos",
delete: "Delete",
backToHome: "Back to Home",
confirmDelete: "Are you sure you want to delete this?",
deleteSuccess: "Deleted successfully",
deleteFailed: "Failed to delete",
noVideos: "No videos found",
noCollections: "No collections found",
searchVideos: "Search videos...",
thumbnail: "Thumbnail",
title: "Title",
author: "Author",
authors: "Authors",
created: "Created",
name: "Name",
actions: "Actions",
deleteCollection: "Delete Collection",
deleteVideo: "Delete Video",
noVideosFoundMatching: "No videos found matching your search.",
// Video Player
playing: "Play",
paused: "Pause",
next: "Next",
previous: "Previous",
loop: "Loop",
autoPlayOn: "Auto-play On",
autoPlayOff: "Auto-play Off",
videoNotFound: "Video not found",
videoNotFoundOrLoaded: "Video not found or could not be loaded.",
deleting: "Deleting...",
addToCollection: "Add to Collection",
originalLink: "Original Link",
source: "Source:",
addedDate: "Added Date:",
latestComments: "Latest Comments",
noComments: "No comments available.",
upNext: "Up Next",
noOtherVideos: "No other videos available",
currentlyIn: "Currently in:",
collectionWarning: "Adding to a different collection will remove it from the current one.",
addToExistingCollection: "Add to existing collection:",
selectCollection: "Select a collection",
add: "Add",
createNewCollection: "Create new collection:",
collectionName: "Collection name",
create: "Create",
removeFromCollection: "Remove from Collection",
confirmRemoveFromCollection: "Are you sure you want to remove this video from the collection?",
remove: "Remove",
loadingVideo: "Loading video...",
current: "(Current)",
rateThisVideo: "Rate this video",
enterFullscreen: "Enter Fullscreen",
exitFullscreen: "Exit Fullscreen",
editTitle: "Edit Title",
titleUpdated: "Title updated successfully",
titleUpdateFailed: "Failed to update title",
// Login
signIn: "Sign in",
verifying: "Verifying...",
incorrectPassword: "Incorrect password",
loginFailed: "Failed to verify password",
defaultPasswordHint: "Default password: 123",
// Collection Page
loadingCollection: "Loading collection...",
collectionNotFound: "Collection not found",
noVideosInCollection: "No videos in this collection.",
back: "Back",
// Author Videos
loadVideosError: "Failed to load videos. Please try again later.",
unknownAuthor: "Unknown",
noVideosForAuthor: "No videos found for this author.",
// Delete Collection Modal
deleteCollectionTitle: "Delete Collection",
deleteCollectionConfirmation: "Are you sure you want to delete the collection",
collectionContains: "This collection contains",
deleteCollectionOnly: "Delete Collection Only",
deleteCollectionAndVideos: "Delete Collection & All Videos",
// Common
loading: "Loading...",
error: "Error",
success: "Success",
cancel: "Cancel",
confirm: "Confirm",
save: "Save",
on: "On",
off: "Off",
// Video Card
unknownDate: "Unknown date",
part: "Part",
collection: "Collection",
// Upload Modal
selectVideoFile: "Select Video File",
pleaseSelectVideo: "Please select a video file",
uploadFailed: "Upload failed",
failedToUpload: "Failed to upload video",
uploading: "Uploading...",
upload: "Upload",
// Bilibili Modal
bilibiliCollectionDetected: "Bilibili Collection Detected",
bilibiliSeriesDetected: "Bilibili Series Detected",
multiPartVideoDetected: "Multi-part Video Detected",
collectionHasVideos: "This Bilibili collection has {count} videos.",
seriesHasVideos: "This Bilibili series has {count} videos.",
videoHasParts: "This Bilibili video has {count} parts.",
downloadAllVideos: "Download All {count} Videos",
downloadAllParts: "Download All {count} Parts",
downloadThisVideoOnly: "Download This Video Only",
downloadCurrentPartOnly: "Download Current Part Only",
processing: "Processing...",
wouldYouLikeToDownloadAllParts: "Would you like to download all parts?",
wouldYouLikeToDownloadAllVideos: "Would you like to download all videos?",
allPartsAddedToCollection: "All parts will be added to this collection",
allVideosAddedToCollection: "All videos will be added to this collection",
queued: "Queued",
waitingInQueue: "Waiting in queue"
},
zh: {
// Header
myTube: "MyTube",
manage: "管理",
settings: "设置",
logout: "退出",
pleaseEnterUrlOrSearchTerm: "请输入视频链接或搜索关键词",
unexpectedErrorOccurred: "发生意外错误,请重试",
uploadVideo: "上传视频",
enterUrlOrSearchTerm: "输入 YouTube/Bilibili 链接或搜索关键词",
manageVideos: "管理视频",
// Home
pasteUrl: "粘贴视频或合集链接",
download: "下载",
search: "搜索",
recentDownloads: "最近下载",
noDownloads: "暂无下载",
downloadStarted: "开始下载",
downloadFailed: "下载失败",
loadingVideos: "加载视频中...",
searchResultsFor: "搜索结果:",
fromYourLibrary: "来自您的媒体库",
noMatchingVideos: "媒体库中未找到匹配视频",
fromYouTube: "来自 YouTube",
loadingYouTubeResults: "加载 YouTube 结果中...",
noYouTubeResults: "未找到 YouTube 结果",
noVideosYet: "暂无视频。提交 YouTube 链接以下载您的第一个视频!",
views: "次观看",
// Settings
general: "常规",
security: "安全",
videoDefaults: "播放器默认设置",
downloadSettings: "下载设置",
language: "语言",
enableLogin: "启用登录保护",
password: "密码",
passwordHelper: "留空以保持当前密码,或输入新密码以更改",
passwordSetHelper: "设置访问应用程序的密码",
autoPlay: "自动播放视频",
autoLoop: "自动循环播放",
maxConcurrent: "最大同时下载数",
saveSettings: "保存设置",
saving: "保存中...",
backToManage: "返回管理",
settingsSaved: "设置保存成功",
settingsFailed: "保存设置失败",
debugMode: "调试模式",
debugModeDescription: "显示或隐藏控制台消息(需要刷新)",
tagsManagement: "标签管理",
newTag: "新标签",
tags: "标签",
tagsManagementNote: "添加或删除标签后,请记得点击“保存设置”以应用更改。",
// Database
database: "数据库",
migrateDataDescription: "从旧版 JSON 文件迁移数据到新的 SQLite 数据库。此操作可以安全地多次运行(将跳过重复项)。",
migrateDataButton: "从 JSON 迁移数据",
scanFiles: "扫描文件",
scanFilesSuccess: "扫描完成。添加了 {count} 个新视频。",
scanFilesFailed: "扫描失败",
migrateConfirmation: "确定要迁移数据吗?这可能需要一些时间。",
migrationResults: "迁移结果",
migrationReport: "迁移报告",
migrationSuccess: "迁移完成。请查看警报中的详细信息。",
migrationNoData: "迁移完成但未找到数据。",
migrationFailed: "迁移失败",
migrationWarnings: "警告",
migrationErrors: "错误",
itemsMigrated: "项已迁移",
fileNotFound: "未找到文件于",
noDataFilesFound: "未找到可迁移的数据文件。请检查您的卷映射。",
removeLegacyData: "删除旧数据",
removeLegacyDataDescription: "删除旧的 JSON 文件videos.json, collections.json 等)以释放磁盘空间。请仅在确认数据已成功迁移后执行此操作。",
removeLegacyDataConfirmTitle: "删除旧数据?",
removeLegacyDataConfirmMessage: "确定要删除旧的 JSON 数据文件吗?此操作无法撤销。",
legacyDataDeleted: "旧数据删除成功。",
deleteLegacyDataButton: "删除旧数据",
// Manage
manageContent: "内容管理",
videos: "视频",
collections: "合集",
allVideos: "所有视频",
delete: "删除",
backToHome: "返回首页",
confirmDelete: "确定要删除吗?",
deleteSuccess: "删除成功",
deleteFailed: "删除失败",
noVideos: "未找到视频",
noCollections: "未找到合集",
searchVideos: "搜索视频...",
thumbnail: "缩略图",
title: "标题",
author: "作者",
authors: "作者列表",
created: "创建时间",
name: "名称",
actions: "操作",
deleteCollection: "删除合集",
deleteVideo: "删除视频",
noVideosFoundMatching: "未找到匹配的视频。",
// Video Player
playing: "播放",
paused: "暂停",
next: "下一个",
previous: "上一个",
loop: "循环",
autoPlayOn: "自动播放已开启",
autoPlayOff: "自动播放已关闭",
videoNotFound: "未找到视频",
videoNotFoundOrLoaded: "未找到视频或无法加载。",
deleting: "删除中...",
addToCollection: "添加到合集",
originalLink: "原始链接",
source: "来源:",
addedDate: "添加日期:",
latestComments: "最新评论",
noComments: "暂无评论。",
upNext: "接下来播放",
noOtherVideos: "没有其他视频",
currentlyIn: "当前所在:",
collectionWarning: "添加到其他合集将从当前合集中移除。",
addToExistingCollection: "添加到现有合集:",
selectCollection: "选择合集",
add: "添加",
createNewCollection: "创建新合集:",
collectionName: "合集名称",
create: "创建",
removeFromCollection: "从合集中移除",
confirmRemoveFromCollection: "确定要从合集中移除此视频吗?",
remove: "移除",
loadingVideo: "加载视频中...",
current: "(当前)",
rateThisVideo: "给视频评分",
enterFullscreen: "全屏",
exitFullscreen: "退出全屏",
editTitle: "编辑标题",
titleUpdated: "标题更新成功",
titleUpdateFailed: "更新标题失败",
// Login
signIn: "登录",
verifying: "验证中...",
incorrectPassword: "密码错误",
loginFailed: "验证密码失败",
defaultPasswordHint: "默认密码123",
// Collection Page
loadingCollection: "加载合集中...",
collectionNotFound: "未找到合集",
noVideosInCollection: "此合集中没有视频。",
back: "返回",
// Author Videos
loadVideosError: "加载视频失败,请稍后再试。",
unknownAuthor: "未知",
noVideosForAuthor: "未找到该作者的视频。",
// Delete Collection Modal
deleteCollectionTitle: "删除合集",
deleteCollectionConfirmation: "确定要删除合集",
collectionContains: "此合集包含",
deleteCollectionOnly: "仅删除合集",
deleteCollectionAndVideos: "删除合集及所有视频",
// Common
loading: "加载中...",
error: "错误",
success: "成功",
cancel: "取消",
confirm: "确认",
save: "保存",
on: "开启",
off: "关闭",
// Video Card
unknownDate: "未知日期",
part: "分P",
collection: "合集",
// Upload Modal
selectVideoFile: "选择视频文件",
pleaseSelectVideo: "请选择视频文件",
uploadFailed: "上传失败",
failedToUpload: "视频上传失败",
uploading: "上传中...",
upload: "上传",
// Bilibili Modal
bilibiliCollectionDetected: "检测到 Bilibili 合集",
bilibiliSeriesDetected: "检测到 Bilibili 系列",
multiPartVideoDetected: "检测到多P视频",
collectionHasVideos: "此合集包含 {count} 个视频。",
seriesHasVideos: "此系列包含 {count} 个视频。",
videoHasParts: "此视频包含 {count} 个分P。",
downloadAllVideos: "下载所有 {count} 个视频",
downloadAllParts: "下载所有 {count} 个分P",
downloadThisVideoOnly: "仅下载此视频",
downloadCurrentPartOnly: "仅下载当前分P",
processing: "处理中...",
wouldYouLikeToDownloadAllParts: "您想要下载所有分P吗",
wouldYouLikeToDownloadAllVideos: "您想要下载所有视频吗?",
allPartsAddedToCollection: "所有分P将被添加到此合集",
allVideosAddedToCollection: "所有视频将被添加到此合集",
queued: "已排队",
waitingInQueue: "等待中"
}
en,
zh,
es,
de,
ja,
fr,
ko,
ar,
pt,
ru
};
export type Language = 'en' | 'zh';
export type Language = 'en' | 'zh' | 'es' | 'de' | 'ja' | 'fr' | 'ko' | 'ar' | 'pt' | 'ru';
export type TranslationKey = keyof typeof translations.en;