feat: add more languages
This commit is contained in:
@@ -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>
|
||||
|
||||
210
frontend/src/utils/locales/ar.ts
Normal file
210
frontend/src/utils/locales/ar.ts
Normal 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: "في قائمة الانتظار"
|
||||
};
|
||||
76
frontend/src/utils/locales/de.ts
Normal file
76
frontend/src/utils/locales/de.ts
Normal 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"
|
||||
};
|
||||
210
frontend/src/utils/locales/en.ts
Normal file
210
frontend/src/utils/locales/en.ts
Normal 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"
|
||||
};
|
||||
76
frontend/src/utils/locales/es.ts
Normal file
76
frontend/src/utils/locales/es.ts
Normal 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"
|
||||
};
|
||||
210
frontend/src/utils/locales/fr.ts
Normal file
210
frontend/src/utils/locales/fr.ts
Normal 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"
|
||||
};
|
||||
210
frontend/src/utils/locales/ja.ts
Normal file
210
frontend/src/utils/locales/ja.ts
Normal 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: "待機中"
|
||||
};
|
||||
210
frontend/src/utils/locales/ko.ts
Normal file
210
frontend/src/utils/locales/ko.ts
Normal 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: "대기 중"
|
||||
};
|
||||
210
frontend/src/utils/locales/pt.ts
Normal file
210
frontend/src/utils/locales/pt.ts
Normal 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"
|
||||
};
|
||||
210
frontend/src/utils/locales/ru.ts
Normal file
210
frontend/src/utils/locales/ru.ts
Normal 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: "Ожидание в очереди"
|
||||
};
|
||||
210
frontend/src/utils/locales/zh.ts
Normal file
210
frontend/src/utils/locales/zh.ts
Normal 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: "等待中"
|
||||
};
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user