diff --git a/front/components/Drawer/I18nSwitchDrawer.vue b/front/components/Drawer/I18nSwitchDrawer.vue
index c1cd77b..a422463 100644
--- a/front/components/Drawer/I18nSwitchDrawer.vue
+++ b/front/components/Drawer/I18nSwitchDrawer.vue
@@ -1,23 +1,15 @@
@@ -26,12 +18,12 @@ const switchLocale = async (locale: string) => {
{{ t('i18n.switchLocale') }}
switchLocale(locale)"
+ v-for="locale in locales"
+ :key="locale.code"
+ :class="cx('rounded-md hover:bg-black/10 p-2 cursor-pointer', currentLocale === locale.code && 'bg-black/10 font-bold')"
+ @click="() => switchLocale(locale.code)"
>
- {{ localeMap?.[locale as keyof typeof localeMap] }}
+ {{ locale.name }}
diff --git a/front/i18n/locales/de.json b/front/i18n/locales/de.json
new file mode 100644
index 0000000..3fd3f35
--- /dev/null
+++ b/front/i18n/locales/de.json
@@ -0,0 +1,235 @@
+{
+ "navbar": {
+ "file": "Datei",
+ "text": "Text"
+ },
+ "i18n": {
+ "switchLocale": "Sprache wechseln"
+ },
+ "seo": {
+ "desc": "015 ist eine Plattform zum temporären Teilen von Dateien und unterstützt das hochladen großer Dateien in Blöcken, temporären Text-Upload, Download und Freigabe"
+ },
+ "btn": {
+ "submit": "Absenden",
+ "backToHome": "Zurück zur Startseite"
+ },
+ "page": {
+ "upload": {
+ "file": {
+ "uploadFile": "Datei hochladen",
+ "uploadFilePlaceholder": "Datei per Drag-and-drop hierher ziehen oder zum Hochladen klicken",
+ "addMore": "Mehr hinzufügen",
+ "handleType": {
+ "file-share": "Dateifreigabe",
+ "file-image-compress": "Bildkomprimierung",
+ "file-image-convert": "Formatkonvertierung"
+ }
+ },
+ "text": {
+ "uploadText": "Text hochladen",
+ "uploadTextPlaceholder": "Mit unserem Textwerkzeug können Sie teilen, übersetzen, zusammenfassen, Bilder erzeugen und große Modelle befragen",
+ "handleType": {
+ "text-share": "Textfreigabe",
+ "text-translate": "Textübersetzung"
+ }
+ },
+ "pickup": {
+ "title": "Abholcode eingeben",
+ "codeError": "Ungültiger Abholcode",
+ "btn": "Abholen"
+ }
+ },
+ "shareOptions": {
+ "file": {
+ "title": "Freigabeoptionen",
+ "downloadNums": "Anzahl der Downloads",
+ "expireTime": "Ablaufzeit",
+ "or": "oder",
+ "expireAfter": "läuft ab nach",
+ "pickupCode": "Abholcode",
+ "passwordProtection": "Passwortschutz",
+ "downloadNotify": "Download-Benachrichtigung",
+ "passwordPlaceholder": "Passwort eingeben",
+ "emailPlaceholder": "E-Mail eingeben",
+ "downloadOptions": {
+ "xdownload": "{0} Downloads"
+ },
+ "expireOptions": {
+ "5min": "5 Minuten",
+ "1hour": "1 Stunde",
+ "1day": "1 Tag",
+ "3days": "3 Tage"
+ }
+ },
+ "imageConvert": {
+ "title": "Bildkonvertierung",
+ "targetFormat": "Zielformat"
+ },
+ "text": {
+ "title": "Freigabeoptionen",
+ "viewNums": "Anzahl der Aufrufe",
+ "expireTime": "Ablaufzeit",
+ "or": "oder",
+ "expireAfter": "läuft ab nach",
+ "pickupCode": "Abholcode",
+ "passwordProtection": "Passwortschutz",
+ "readNotify": "Lesebestätigung",
+ "passwordPlaceholder": "Passwort eingeben",
+ "emailPlaceholder": "E-Mail eingeben",
+ "viewOptions": {
+ "xview": "{0} Aufrufe"
+ },
+ "expireOptions": {
+ "5min": "5 Minuten",
+ "1hour": "1 Stunde",
+ "1day": "1 Tag",
+ "3days": "3 Tage"
+ }
+ }
+ },
+ "progress": {
+ "file": {
+ "totalUploadProgress": "Gesamter Upload-Fortschritt",
+ "fileList": "Dateiliste",
+ "fileName": "Dateiname",
+ "fileSize": "Dateigröße",
+ "uploadSpeed": "Upload-Geschwindigkeit",
+ "progress": "Fortschritt",
+ "uploadDetails": "Upload-Details",
+ "chunk": "Block",
+ "completed": "Abgeschlossen",
+ "discarded": "Verworfen",
+ "pending": "Ausstehend",
+ "chunkProgress": "Block-Fortschrittsbalken",
+ "chunkHeatmap": "Block-Heatmap",
+ "heatmap": "Heatmap",
+ "progressBar": "Fortschrittsbalken",
+ "uploadError": "Upload-Fehler",
+ "chunkUploadFailed": "Block {1} der Datei {0} ist mehrfach fehlgeschlagen, der Upload wurde abgebrochen",
+ "chunkUploadRetry": "Block {1} der Datei {0} konnte nicht hochgeladen werden, wir versuchen es später erneut",
+ "fileUploadFailed": "Der Upload der Datei {0} ist fehlgeschlagen, bitte versuchen Sie es erneut",
+ "uploadFailed": "Upload fehlgeschlagen",
+ "processing": {
+ "hash": "Hash wird berechnet...",
+ "create": "Upload wird initialisiert...",
+ "upload": "Wird hochgeladen...",
+ "finish": "Upload abgeschlossen"
+ },
+ "instantUploadSuccess": "Eine Datei mit demselben Hash existiert bereits in der Cloud, Sofort-Upload erfolgreich",
+ "uploadFailedRetry": "Upload fehlgeschlagen, bitte versuchen Sie es später erneut",
+ "uploadSpeedInfo": {
+ "title": "Wie wird die Upload-Geschwindigkeit berechnet?",
+ "desc": {
+ "base": "Die Upload-Geschwindigkeit wird anhand von {chunkNum} * {chunkSize} geschätzt, die in der aktuellen Sekunde hochgeladen wurden. Sie kann daher leicht von der tatsächlichen Geschwindigkeit abweichen und dient nur als Referenz",
+ "chunkNum": "Anzahl der Dateiblöcke",
+ "chunkSize": "Größe jedes Dateiblocks"
+ }
+ }
+ }
+ },
+ "result": {
+ "file": {
+ "title": "Upload erfolgreich",
+ "fileList": "Dateiliste",
+ "info": "Informationen",
+ "downloadNums": "Anzahl der Downloads",
+ "expireTime": "Ablaufzeit",
+ "pickupCode": "Abholcode",
+ "link": "Link",
+ "copySuccess": "Erfolgreich kopiert"
+ },
+ "imageCompress": {
+ "title": "Bildkomprimierung",
+ "totalSize": "Gesamtgröße",
+ "task": "Aufgabe",
+ "retry": "Wiederholen {0}/{1}",
+ "failed": "Fehlgeschlagen"
+ },
+ "imageConvert": {
+ "title": "Bildkonvertierung",
+ "convert": "Konvertieren",
+ "task": "Aufgabe",
+ "retry": "Wiederholen {0}/{1}",
+ "failed": "Fehlgeschlagen"
+ },
+ "text": {
+ "title": "Freigabe erfolgreich",
+ "info": "Informationen",
+ "viewNums": "Anzahl der Aufrufe",
+ "expireTime": "Ablaufzeit",
+ "pickupCode": "Abholcode",
+ "link": "Link",
+ "content": "Inhalt",
+ "copySuccess": "Erfolgreich kopiert"
+ },
+ "textTranslate": {
+ "title": "Textübersetzung",
+ "sourceText": "Ausgangstext",
+ "translatedText": "Übersetzung",
+ "sourceLanguage": "Ausgangssprache",
+ "targetLanguage": "Zielsprache",
+ "provider": "Anbieter",
+ "retranslate": "Erneut übersetzen",
+ "empty": "Geben Sie Text ein und klicken Sie auf erneut übersetzen, um das Ergebnis anzuzeigen",
+ "copy": "Übersetzung kopieren",
+ "copySuccess": "Übersetzung kopiert",
+ "language": {
+ "auto": "Automatisch erkennen",
+ "zh-CN": "Chinesisch",
+ "en": "Englisch",
+ "ja": "Japanisch",
+ "ko": "Koreanisch"
+ }
+ },
+ "qrCode": {
+ "title": "QR-Code zum Teilen"
+ }
+ },
+ "shareView": {
+ "linkExpired": "Dieser Link ist abgelaufen.",
+ "passwall": {
+ "title": "Passwort eingeben",
+ "passwordError": "Falsches Passwort",
+ "passwordPlaceholder": "Passwort eingeben"
+ },
+ "fileShare": {
+ "title": "Datei herunterladen",
+ "downloadBtn": "Herunterladen",
+ "needPassword": "Passwort erforderlich",
+ "expireTime": "Ablaufzeit",
+ "remainingDownloads": "Verbleibende Downloads",
+ "getTokenFailed": "Token konnte nicht abgerufen werden",
+ "durationFormat": "D [Tage] HH:mm:ss"
+ },
+ "textShare": {
+ "title": "Text anzeigen",
+ "viewBtn": "Anzeigen",
+ "needPassword": "Passwort erforderlich",
+ "expireTime": "Ablaufzeit",
+ "remainingViews": "Verbleibende Aufrufe",
+ "durationFormat": "D [Tage] HH:mm:ss"
+ }
+ },
+ "about": {
+ "powerBy": "Open-Source-Plattform zum selbst gehosteten temporären Teilen von Dateien, betrieben von {0}",
+ "file": "Datei",
+ "share": "Teilen",
+ "download": "Herunterladen",
+ "task": "Aufgabe",
+ "admin": "Administrator der Website",
+ "author": "Autor",
+ "title": "Über",
+ "about": "Über",
+ "systemInfo": "Systeminformationen",
+ "enabledFeatures": "Aktivierte Funktionen",
+ "enabledFeaturesEmpty": "Für diese Instanz sind derzeit keine zusätzlichen Funktionen aktiviert",
+ "systemVersion": "Systemversion",
+ "storage": "Speicher",
+ "analysis": "Analyse",
+ "fileSize": "Dateigröße",
+ "fileNum": "Anzahl der Dateien",
+ "processed": "Verarbeitet",
+ "failed": "Fehlgeschlagen"
+ }
+ }
+}
diff --git a/front/i18n/locales/en.json b/front/i18n/locales/en.json
index e34e307..10f9730 100644
--- a/front/i18n/locales/en.json
+++ b/front/i18n/locales/en.json
@@ -29,7 +29,8 @@
"uploadText": "Upload Text",
"uploadTextPlaceholder": "Share, translate, summarize, generate images, and ask large models with our text processor",
"handleType": {
- "text-share": "Text Share"
+ "text-share": "Text Share",
+ "text-translate": "Text Translate"
}
},
"pickup": {
@@ -161,6 +162,25 @@
"content": "Content",
"copySuccess": "Copy Success"
},
+ "textTranslate": {
+ "title": "Text Translation",
+ "sourceText": "Source Text",
+ "translatedText": "Translated Text",
+ "sourceLanguage": "Source Language",
+ "targetLanguage": "Target Language",
+ "provider": "Provider",
+ "retranslate": "Retranslate",
+ "empty": "Enter text and click retranslate to preview the result",
+ "copy": "Copy Translation",
+ "copySuccess": "Translation copied",
+ "language": {
+ "auto": "Auto Detect",
+ "zh-CN": "Chinese",
+ "en": "English",
+ "ja": "Japanese",
+ "ko": "Korean"
+ }
+ },
"qrCode": {
"title": "Share QR code"
}
diff --git a/front/i18n/locales/fr.json b/front/i18n/locales/fr.json
new file mode 100644
index 0000000..6f6b619
--- /dev/null
+++ b/front/i18n/locales/fr.json
@@ -0,0 +1,235 @@
+{
+ "navbar": {
+ "file": "Fichier",
+ "text": "Texte"
+ },
+ "i18n": {
+ "switchLocale": "Changer de langue"
+ },
+ "seo": {
+ "desc": "015 est une plateforme de partage de fichiers temporaires prenant en charge le téléversement fractionné de gros fichiers, le téléversement de texte temporaire, le téléchargement et le partage"
+ },
+ "btn": {
+ "submit": "Envoyer",
+ "backToHome": "Retour à l'accueil"
+ },
+ "page": {
+ "upload": {
+ "file": {
+ "uploadFile": "Téléverser un fichier",
+ "uploadFilePlaceholder": "Glissez-déposez un fichier ou cliquez pour téléverser",
+ "addMore": "Ajouter plus",
+ "handleType": {
+ "file-share": "Partage de fichier",
+ "file-image-compress": "Compression d'image",
+ "file-image-convert": "Conversion de format"
+ }
+ },
+ "text": {
+ "uploadText": "Téléverser du texte",
+ "uploadTextPlaceholder": "Partagez, traduisez, résumez, générez des images et interrogez de grands modèles avec notre processeur de texte",
+ "handleType": {
+ "text-share": "Partage de texte",
+ "text-translate": "Traduction de texte"
+ }
+ },
+ "pickup": {
+ "title": "Saisir le code de retrait",
+ "codeError": "Code de retrait invalide",
+ "btn": "Récupérer"
+ }
+ },
+ "shareOptions": {
+ "file": {
+ "title": "Options de partage",
+ "downloadNums": "Nombre de téléchargements",
+ "expireTime": "Date d'expiration",
+ "or": "ou",
+ "expireAfter": "expire après",
+ "pickupCode": "Code de retrait",
+ "passwordProtection": "Protection par mot de passe",
+ "downloadNotify": "Notification de téléchargement",
+ "passwordPlaceholder": "Saisissez le mot de passe",
+ "emailPlaceholder": "Saisissez l'adresse e-mail",
+ "downloadOptions": {
+ "xdownload": "{0} téléchargements"
+ },
+ "expireOptions": {
+ "5min": "5 minutes",
+ "1hour": "1 heure",
+ "1day": "1 jour",
+ "3days": "3 jours"
+ }
+ },
+ "imageConvert": {
+ "title": "Conversion d'image",
+ "targetFormat": "Format cible"
+ },
+ "text": {
+ "title": "Options de partage",
+ "viewNums": "Nombre de vues",
+ "expireTime": "Date d'expiration",
+ "or": "ou",
+ "expireAfter": "expire après",
+ "pickupCode": "Code de retrait",
+ "passwordProtection": "Protection par mot de passe",
+ "readNotify": "Notification de lecture",
+ "passwordPlaceholder": "Saisissez le mot de passe",
+ "emailPlaceholder": "Saisissez l'adresse e-mail",
+ "viewOptions": {
+ "xview": "{0} vues"
+ },
+ "expireOptions": {
+ "5min": "5 minutes",
+ "1hour": "1 heure",
+ "1day": "1 jour",
+ "3days": "3 jours"
+ }
+ }
+ },
+ "progress": {
+ "file": {
+ "totalUploadProgress": "Progression totale du téléversement",
+ "fileList": "Liste des fichiers",
+ "fileName": "Nom du fichier",
+ "fileSize": "Taille du fichier",
+ "uploadSpeed": "Vitesse d'envoi",
+ "progress": "Progression",
+ "uploadDetails": "Détails du téléversement",
+ "chunk": "Bloc",
+ "completed": "Terminé",
+ "discarded": "Abandonné",
+ "pending": "En attente",
+ "chunkProgress": "Barre de progression des blocs",
+ "chunkHeatmap": "Carte thermique des blocs",
+ "heatmap": "Carte thermique",
+ "progressBar": "Barre de progression",
+ "uploadError": "Erreur de téléversement",
+ "chunkUploadFailed": "Le bloc {1} du fichier {0} a échoué plusieurs fois, le téléversement a été interrompu",
+ "chunkUploadRetry": "Le bloc {1} du fichier {0} n'a pas pu être téléversé, une nouvelle tentative sera effectuée plus tard",
+ "fileUploadFailed": "Le téléversement du fichier {0} a échoué, veuillez réessayer",
+ "uploadFailed": "Échec du téléversement",
+ "processing": {
+ "hash": "Calcul du hash...",
+ "create": "Initialisation du téléversement...",
+ "upload": "Téléversement en cours...",
+ "finish": "Téléversement terminé"
+ },
+ "instantUploadSuccess": "Un fichier avec le même hash existe déjà dans le cloud, téléversement instantané réussi",
+ "uploadFailedRetry": "Le téléversement a échoué, veuillez réessayer plus tard",
+ "uploadSpeedInfo": {
+ "title": "Comment la vitesse de téléversement est-elle calculée ?",
+ "desc": {
+ "base": "La vitesse est estimée à partir de {chunkNum} * {chunkSize} téléversés pendant la seconde en cours, elle peut donc légèrement différer de la vitesse réelle et n'est fournie qu'à titre indicatif",
+ "chunkNum": "Nombre de blocs du fichier",
+ "chunkSize": "Taille de chaque bloc du fichier"
+ }
+ }
+ }
+ },
+ "result": {
+ "file": {
+ "title": "Téléversement réussi",
+ "fileList": "Liste des fichiers",
+ "info": "Informations",
+ "downloadNums": "Nombre de téléchargements",
+ "expireTime": "Date d'expiration",
+ "pickupCode": "Code de retrait",
+ "link": "Lien",
+ "copySuccess": "Copié avec succès"
+ },
+ "imageCompress": {
+ "title": "Compression d'image",
+ "totalSize": "Taille totale",
+ "task": "Tâche",
+ "retry": "Nouvelle tentative {0}/{1}",
+ "failed": "Échec"
+ },
+ "imageConvert": {
+ "title": "Conversion d'image",
+ "convert": "Convertir",
+ "task": "Tâche",
+ "retry": "Nouvelle tentative {0}/{1}",
+ "failed": "Échec"
+ },
+ "text": {
+ "title": "Partage réussi",
+ "info": "Informations",
+ "viewNums": "Nombre de vues",
+ "expireTime": "Date d'expiration",
+ "pickupCode": "Code de retrait",
+ "link": "Lien",
+ "content": "Contenu",
+ "copySuccess": "Copié avec succès"
+ },
+ "textTranslate": {
+ "title": "Traduction de texte",
+ "sourceText": "Texte source",
+ "translatedText": "Texte traduit",
+ "sourceLanguage": "Langue source",
+ "targetLanguage": "Langue cible",
+ "provider": "Fournisseur",
+ "retranslate": "Traduire à nouveau",
+ "empty": "Saisissez du texte puis cliquez sur retraduire pour voir le résultat",
+ "copy": "Copier la traduction",
+ "copySuccess": "Traduction copiée",
+ "language": {
+ "auto": "Détection automatique",
+ "zh-CN": "Chinois",
+ "en": "Anglais",
+ "ja": "Japonais",
+ "ko": "Coréen"
+ }
+ },
+ "qrCode": {
+ "title": "Code QR de partage"
+ }
+ },
+ "shareView": {
+ "linkExpired": "Ce lien a expiré.",
+ "passwall": {
+ "title": "Saisir le mot de passe",
+ "passwordError": "Mot de passe incorrect",
+ "passwordPlaceholder": "Saisissez le mot de passe"
+ },
+ "fileShare": {
+ "title": "Télécharger le fichier",
+ "downloadBtn": "Télécharger",
+ "needPassword": "Mot de passe requis",
+ "expireTime": "Date d'expiration",
+ "remainingDownloads": "Téléchargements restants",
+ "getTokenFailed": "Échec de récupération du jeton",
+ "durationFormat": "D [jours] HH:mm:ss"
+ },
+ "textShare": {
+ "title": "Afficher le texte",
+ "viewBtn": "Afficher",
+ "needPassword": "Mot de passe requis",
+ "expireTime": "Date d'expiration",
+ "remainingViews": "Vues restantes",
+ "durationFormat": "D [jours] HH:mm:ss"
+ }
+ },
+ "about": {
+ "powerBy": "Plateforme open source auto-hébergée de partage temporaire de fichiers propulsée par {0}",
+ "file": "Fichier",
+ "share": "Partager",
+ "download": "Télécharger",
+ "task": "Tâche",
+ "admin": "Administrateur du site",
+ "author": "Auteur",
+ "title": "À propos",
+ "about": "À propos",
+ "systemInfo": "Informations système",
+ "enabledFeatures": "Fonctionnalités de l'instance",
+ "enabledFeaturesEmpty": "Aucune fonctionnalité supplémentaire n'est activée pour cette instance",
+ "systemVersion": "Version du système",
+ "storage": "Stockage",
+ "analysis": "Analyse",
+ "fileSize": "Taille des fichiers",
+ "fileNum": "Nombre de fichiers",
+ "processed": "Traités",
+ "failed": "Échecs"
+ }
+ }
+}
diff --git a/front/i18n/locales/ja.json b/front/i18n/locales/ja.json
new file mode 100644
index 0000000..5f874bb
--- /dev/null
+++ b/front/i18n/locales/ja.json
@@ -0,0 +1,235 @@
+{
+ "navbar": {
+ "file": "ファイル",
+ "text": "テキスト"
+ },
+ "i18n": {
+ "switchLocale": "言語を切り替える"
+ },
+ "seo": {
+ "desc": "015 は一時的なファイル共有プラットフォームであり、大容量ファイルの分割アップロード、一時テキストのアップロード、ダウンロード、共有をサポートします"
+ },
+ "btn": {
+ "submit": "送信",
+ "backToHome": "ホームに戻る"
+ },
+ "page": {
+ "upload": {
+ "file": {
+ "uploadFile": "ファイルをアップロード",
+ "uploadFilePlaceholder": "ファイルをドラッグ&ドロップ、またはクリックしてアップロード",
+ "addMore": "さらに追加",
+ "handleType": {
+ "file-share": "ファイル共有",
+ "file-image-compress": "画像圧縮",
+ "file-image-convert": "形式変換"
+ }
+ },
+ "text": {
+ "uploadText": "テキストをアップロード",
+ "uploadTextPlaceholder": "テキスト処理機能で共有、翻訳、要約、画像生成、大規模モデルへの質問を簡単に行えます",
+ "handleType": {
+ "text-share": "テキスト共有",
+ "text-translate": "テキスト翻訳"
+ }
+ },
+ "pickup": {
+ "title": "受取コードを入力",
+ "codeError": "受取コードが正しくありません",
+ "btn": "受け取る"
+ }
+ },
+ "shareOptions": {
+ "file": {
+ "title": "共有オプション",
+ "downloadNums": "ダウンロード回数",
+ "expireTime": "有効期限",
+ "or": "または",
+ "expireAfter": "後に期限切れ",
+ "pickupCode": "受取コード",
+ "passwordProtection": "パスワード保護",
+ "downloadNotify": "ダウンロード通知",
+ "passwordPlaceholder": "パスワードを入力",
+ "emailPlaceholder": "メールアドレスを入力",
+ "downloadOptions": {
+ "xdownload": "{0} 回ダウンロード"
+ },
+ "expireOptions": {
+ "5min": "5分",
+ "1hour": "1時間",
+ "1day": "1日",
+ "3days": "3日"
+ }
+ },
+ "imageConvert": {
+ "title": "画像変換",
+ "targetFormat": "変換先形式"
+ },
+ "text": {
+ "title": "共有オプション",
+ "viewNums": "閲覧回数",
+ "expireTime": "有効期限",
+ "or": "または",
+ "expireAfter": "後に期限切れ",
+ "pickupCode": "受取コード",
+ "passwordProtection": "パスワード保護",
+ "readNotify": "既読通知",
+ "passwordPlaceholder": "パスワードを入力",
+ "emailPlaceholder": "メールアドレスを入力",
+ "viewOptions": {
+ "xview": "{0} 回閲覧"
+ },
+ "expireOptions": {
+ "5min": "5分",
+ "1hour": "1時間",
+ "1day": "1日",
+ "3days": "3日"
+ }
+ }
+ },
+ "progress": {
+ "file": {
+ "totalUploadProgress": "全体のアップロード進捗",
+ "fileList": "ファイル一覧",
+ "fileName": "ファイル名",
+ "fileSize": "ファイルサイズ",
+ "uploadSpeed": "アップロード速度",
+ "progress": "進捗",
+ "uploadDetails": "アップロード詳細",
+ "chunk": "チャンク",
+ "completed": "完了",
+ "discarded": "破棄済み",
+ "pending": "保留中",
+ "chunkProgress": "チャンク進捗バー",
+ "chunkHeatmap": "チャンクヒートマップ",
+ "heatmap": "ヒートマップ",
+ "progressBar": "進捗バー",
+ "uploadError": "アップロードエラー",
+ "chunkUploadFailed": "ファイル {0} のチャンク {1} は複数回失敗したため、アップロードを中止しました",
+ "chunkUploadRetry": "ファイル {0} のチャンク {1} のアップロードに失敗しました。後でもう一度試します",
+ "fileUploadFailed": "ファイル {0} のアップロードに失敗しました。もう一度お試しください",
+ "uploadFailed": "アップロード失敗",
+ "processing": {
+ "hash": "ハッシュを計算中...",
+ "create": "アップロードを初期化中...",
+ "upload": "アップロード中...",
+ "finish": "アップロード完了"
+ },
+ "instantUploadSuccess": "同じハッシュのファイルがクラウドに存在するため、秒でアップロード完了しました",
+ "uploadFailedRetry": "アップロードに失敗しました。しばらくしてから再試行してください",
+ "uploadSpeedInfo": {
+ "title": "アップロード速度はどのように計算されますか?",
+ "desc": {
+ "base": "アップロード速度は、現在の1秒間にアップロードされた {chunkNum} * {chunkSize} を元に推定しており、実際の速度と多少の誤差がある場合があります。参考値としてご利用ください",
+ "chunkNum": "ファイルチャンク数",
+ "chunkSize": "各ファイルチャンクのサイズ"
+ }
+ }
+ }
+ },
+ "result": {
+ "file": {
+ "title": "アップロード成功",
+ "fileList": "ファイル一覧",
+ "info": "情報",
+ "downloadNums": "ダウンロード回数",
+ "expireTime": "有効期限",
+ "pickupCode": "受取コード",
+ "link": "リンク",
+ "copySuccess": "コピーしました"
+ },
+ "imageCompress": {
+ "title": "画像圧縮",
+ "totalSize": "合計サイズ",
+ "task": "タスク",
+ "retry": "再試行 {0}/{1}",
+ "failed": "失敗"
+ },
+ "imageConvert": {
+ "title": "画像変換",
+ "convert": "変換",
+ "task": "タスク",
+ "retry": "再試行 {0}/{1}",
+ "failed": "失敗"
+ },
+ "text": {
+ "title": "共有成功",
+ "info": "情報",
+ "viewNums": "閲覧回数",
+ "expireTime": "有効期限",
+ "pickupCode": "受取コード",
+ "link": "リンク",
+ "content": "内容",
+ "copySuccess": "コピーしました"
+ },
+ "textTranslate": {
+ "title": "テキスト翻訳",
+ "sourceText": "入力テキスト",
+ "translatedText": "翻訳結果",
+ "sourceLanguage": "元の言語",
+ "targetLanguage": "翻訳先の言語",
+ "provider": "プロバイダー",
+ "retranslate": "再翻訳",
+ "empty": "テキストを入力して再翻訳をクリックすると結果が表示されます",
+ "copy": "翻訳文をコピー",
+ "copySuccess": "翻訳文をコピーしました",
+ "language": {
+ "auto": "自動検出",
+ "zh-CN": "中国語",
+ "en": "英語",
+ "ja": "日本語",
+ "ko": "韓国語"
+ }
+ },
+ "qrCode": {
+ "title": "共有QRコード"
+ }
+ },
+ "shareView": {
+ "linkExpired": "このリンクは期限切れです。",
+ "passwall": {
+ "title": "パスワードを入力",
+ "passwordError": "パスワードが正しくありません",
+ "passwordPlaceholder": "パスワードを入力"
+ },
+ "fileShare": {
+ "title": "ファイルをダウンロード",
+ "downloadBtn": "ダウンロード",
+ "needPassword": "パスワードが必要です",
+ "expireTime": "有効期限",
+ "remainingDownloads": "残りダウンロード回数",
+ "getTokenFailed": "トークンの取得に失敗しました",
+ "durationFormat": "D日 HH:mm:ss"
+ },
+ "textShare": {
+ "title": "テキストを表示",
+ "viewBtn": "表示",
+ "needPassword": "パスワードが必要です",
+ "expireTime": "有効期限",
+ "remainingViews": "残り閲覧回数",
+ "durationFormat": "D日 HH:mm:ss"
+ }
+ },
+ "about": {
+ "powerBy": "{0} によって支えられているオープンソースのセルフホスト型一時ファイル共有プラットフォーム",
+ "file": "ファイル",
+ "share": "共有",
+ "download": "ダウンロード",
+ "task": "タスク",
+ "admin": "サイト管理者",
+ "author": "作者",
+ "title": "このサイトについて",
+ "about": "概要",
+ "systemInfo": "システム情報",
+ "enabledFeatures": "有効な機能",
+ "enabledFeaturesEmpty": "このインスタンスでは追加機能は有効化されていません",
+ "systemVersion": "システムバージョン",
+ "storage": "保存済みファイル",
+ "analysis": "分析",
+ "fileSize": "ファイルサイズ",
+ "fileNum": "ファイル数",
+ "processed": "処理済み",
+ "failed": "失敗"
+ }
+ }
+}
diff --git a/front/i18n/locales/ko.json b/front/i18n/locales/ko.json
new file mode 100644
index 0000000..00e6e5d
--- /dev/null
+++ b/front/i18n/locales/ko.json
@@ -0,0 +1,235 @@
+{
+ "navbar": {
+ "file": "파일",
+ "text": "텍스트"
+ },
+ "i18n": {
+ "switchLocale": "언어 전환"
+ },
+ "seo": {
+ "desc": "015는 임시 파일 공유 플랫폼으로, 대용량 파일 분할 업로드와 임시 텍스트 업로드, 다운로드 및 공유를 지원합니다"
+ },
+ "btn": {
+ "submit": "제출",
+ "backToHome": "홈으로 돌아가기"
+ },
+ "page": {
+ "upload": {
+ "file": {
+ "uploadFile": "파일 업로드",
+ "uploadFilePlaceholder": "파일을 드래그 앤 드롭하거나 클릭하여 업로드",
+ "addMore": "더 추가",
+ "handleType": {
+ "file-share": "파일 공유",
+ "file-image-compress": "이미지 압축",
+ "file-image-convert": "형식 변환"
+ }
+ },
+ "text": {
+ "uploadText": "텍스트 업로드",
+ "uploadTextPlaceholder": "텍스트 처리기를 사용해 공유, 번역, 요약, 이미지 생성, 대형 모델 질의를 손쉽게 할 수 있습니다",
+ "handleType": {
+ "text-share": "텍스트 공유",
+ "text-translate": "텍스트 번역"
+ }
+ },
+ "pickup": {
+ "title": "수령 코드 입력",
+ "codeError": "수령 코드가 올바르지 않습니다",
+ "btn": "수령"
+ }
+ },
+ "shareOptions": {
+ "file": {
+ "title": "공유 옵션",
+ "downloadNums": "다운로드 횟수",
+ "expireTime": "만료 시간",
+ "or": "또는",
+ "expireAfter": "후 만료",
+ "pickupCode": "수령 코드",
+ "passwordProtection": "비밀번호 보호",
+ "downloadNotify": "다운로드 알림",
+ "passwordPlaceholder": "비밀번호를 입력하세요",
+ "emailPlaceholder": "이메일을 입력하세요",
+ "downloadOptions": {
+ "xdownload": "{0}회 다운로드"
+ },
+ "expireOptions": {
+ "5min": "5분",
+ "1hour": "1시간",
+ "1day": "1일",
+ "3days": "3일"
+ }
+ },
+ "imageConvert": {
+ "title": "이미지 변환",
+ "targetFormat": "대상 형식"
+ },
+ "text": {
+ "title": "공유 옵션",
+ "viewNums": "조회 횟수",
+ "expireTime": "만료 시간",
+ "or": "또는",
+ "expireAfter": "후 만료",
+ "pickupCode": "수령 코드",
+ "passwordProtection": "비밀번호 보호",
+ "readNotify": "읽음 알림",
+ "passwordPlaceholder": "비밀번호를 입력하세요",
+ "emailPlaceholder": "이메일을 입력하세요",
+ "viewOptions": {
+ "xview": "{0}회 조회"
+ },
+ "expireOptions": {
+ "5min": "5분",
+ "1hour": "1시간",
+ "1day": "1일",
+ "3days": "3일"
+ }
+ }
+ },
+ "progress": {
+ "file": {
+ "totalUploadProgress": "전체 업로드 진행률",
+ "fileList": "파일 목록",
+ "fileName": "파일명",
+ "fileSize": "파일 크기",
+ "uploadSpeed": "업로드 속도",
+ "progress": "진행률",
+ "uploadDetails": "업로드 세부 정보",
+ "chunk": "청크",
+ "completed": "완료됨",
+ "discarded": "폐기됨",
+ "pending": "대기 중",
+ "chunkProgress": "청크 진행 막대",
+ "chunkHeatmap": "청크 히트맵",
+ "heatmap": "히트맵",
+ "progressBar": "진행 막대",
+ "uploadError": "업로드 오류",
+ "chunkUploadFailed": "파일 {0}의 청크 {1} 업로드가 여러 번 실패하여 업로드를 중단했습니다",
+ "chunkUploadRetry": "파일 {0}의 청크 {1} 업로드에 실패했습니다. 잠시 후 다시 시도합니다",
+ "fileUploadFailed": "파일 {0} 업로드에 실패했습니다. 다시 시도해 주세요",
+ "uploadFailed": "업로드 실패",
+ "processing": {
+ "hash": "해시 계산 중...",
+ "create": "업로드 초기화 중...",
+ "upload": "업로드 중...",
+ "finish": "업로드 완료"
+ },
+ "instantUploadSuccess": "동일한 해시의 파일이 클라우드에 있어 즉시 업로드에 성공했습니다",
+ "uploadFailedRetry": "업로드에 실패했습니다. 잠시 후 다시 시도해 주세요",
+ "uploadSpeedInfo": {
+ "title": "업로드 속도는 어떻게 계산되나요?",
+ "desc": {
+ "base": "업로드 속도는 현재 1초 동안 업로드된 {chunkNum} * {chunkSize}를 기준으로 추정되며, 실제 속도와 약간의 차이가 있을 수 있습니다. 참고용으로만 사용해 주세요",
+ "chunkNum": "파일 청크 수",
+ "chunkSize": "각 파일 청크 크기"
+ }
+ }
+ }
+ },
+ "result": {
+ "file": {
+ "title": "업로드 성공",
+ "fileList": "파일 목록",
+ "info": "정보",
+ "downloadNums": "다운로드 횟수",
+ "expireTime": "만료 시간",
+ "pickupCode": "수령 코드",
+ "link": "링크",
+ "copySuccess": "복사되었습니다"
+ },
+ "imageCompress": {
+ "title": "이미지 압축",
+ "totalSize": "총 크기",
+ "task": "작업",
+ "retry": "재시도 {0}/{1}",
+ "failed": "실패"
+ },
+ "imageConvert": {
+ "title": "이미지 변환",
+ "convert": "변환",
+ "task": "작업",
+ "retry": "재시도 {0}/{1}",
+ "failed": "실패"
+ },
+ "text": {
+ "title": "공유 성공",
+ "info": "정보",
+ "viewNums": "조회 횟수",
+ "expireTime": "만료 시간",
+ "pickupCode": "수령 코드",
+ "link": "링크",
+ "content": "내용",
+ "copySuccess": "복사되었습니다"
+ },
+ "textTranslate": {
+ "title": "텍스트 번역",
+ "sourceText": "입력 텍스트",
+ "translatedText": "번역 결과",
+ "sourceLanguage": "원본 언어",
+ "targetLanguage": "대상 언어",
+ "provider": "제공자",
+ "retranslate": "다시 번역",
+ "empty": "텍스트를 입력한 뒤 다시 번역을 클릭하면 결과를 볼 수 있습니다",
+ "copy": "번역문 복사",
+ "copySuccess": "번역문이 복사되었습니다",
+ "language": {
+ "auto": "자동 감지",
+ "zh-CN": "중국어",
+ "en": "영어",
+ "ja": "일본어",
+ "ko": "한국어"
+ }
+ },
+ "qrCode": {
+ "title": "공유 QR 코드"
+ }
+ },
+ "shareView": {
+ "linkExpired": "이 링크는 만료되었습니다.",
+ "passwall": {
+ "title": "비밀번호 입력",
+ "passwordError": "비밀번호가 올바르지 않습니다",
+ "passwordPlaceholder": "비밀번호를 입력하세요"
+ },
+ "fileShare": {
+ "title": "파일 다운로드",
+ "downloadBtn": "다운로드",
+ "needPassword": "비밀번호가 필요합니다",
+ "expireTime": "만료 시간",
+ "remainingDownloads": "남은 다운로드 횟수",
+ "getTokenFailed": "토큰을 가져오지 못했습니다",
+ "durationFormat": "D일 HH:mm:ss"
+ },
+ "textShare": {
+ "title": "텍스트 보기",
+ "viewBtn": "보기",
+ "needPassword": "비밀번호가 필요합니다",
+ "expireTime": "만료 시간",
+ "remainingViews": "남은 조회 횟수",
+ "durationFormat": "D일 HH:mm:ss"
+ }
+ },
+ "about": {
+ "powerBy": "{0} 기반의 오픈 소스 셀프 호스팅 임시 파일 공유 플랫폼",
+ "file": "파일",
+ "share": "공유",
+ "download": "다운로드",
+ "task": "작업",
+ "admin": "사이트 관리자",
+ "author": "작성자",
+ "title": "소개",
+ "about": "소개",
+ "systemInfo": "시스템 정보",
+ "enabledFeatures": "활성화된 기능",
+ "enabledFeaturesEmpty": "현재 이 인스턴스에는 추가 기능이 활성화되어 있지 않습니다",
+ "systemVersion": "시스템 버전",
+ "storage": "저장소",
+ "analysis": "분석",
+ "fileSize": "파일 크기",
+ "fileNum": "파일 수",
+ "processed": "처리됨",
+ "failed": "실패"
+ }
+ }
+}
diff --git a/front/i18n/locales/zh-CN.json b/front/i18n/locales/zh-CN.json
index a64a34a..0857bc7 100644
--- a/front/i18n/locales/zh-CN.json
+++ b/front/i18n/locales/zh-CN.json
@@ -29,7 +29,8 @@
"uploadText": "上传文本",
"uploadTextPlaceholder": "使用我们的文本处理器轻松分享,翻译,总结,生成图片,询问大模型",
"handleType": {
- "text-share": "文本分享"
+ "text-share": "文本分享",
+ "text-translate": "文本翻译"
}
},
"pickup": {
@@ -161,6 +162,25 @@
"content": "内容",
"copySuccess": "复制成功"
},
+ "textTranslate": {
+ "title": "文本翻译",
+ "sourceText": "输入文本",
+ "translatedText": "翻译结果",
+ "sourceLanguage": "源语言",
+ "targetLanguage": "目标语言",
+ "provider": "提供商",
+ "retranslate": "重新翻译",
+ "empty": "输入文本后点击重新翻译查看结果",
+ "copy": "复制译文",
+ "copySuccess": "译文已复制",
+ "language": {
+ "auto": "自动检测",
+ "zh-CN": "中文",
+ "en": "英语",
+ "ja": "日语",
+ "ko": "韩语"
+ }
+ },
"qrCode": {
"title": "分享二维码"
}
diff --git a/front/i18n/locales/zh-TW.json b/front/i18n/locales/zh-TW.json
new file mode 100644
index 0000000..ec9cde5
--- /dev/null
+++ b/front/i18n/locales/zh-TW.json
@@ -0,0 +1,235 @@
+{
+ "navbar": {
+ "file": "檔案",
+ "text": "文字"
+ },
+ "i18n": {
+ "switchLocale": "切換語言"
+ },
+ "seo": {
+ "desc": "015 是一個開源的臨時檔案分享平台專案,支援臨時大檔案分片上傳、臨時文字上傳、下載與分享"
+ },
+ "btn": {
+ "submit": "提交",
+ "backToHome": "返回首頁"
+ },
+ "page": {
+ "upload": {
+ "file": {
+ "uploadFile": "上傳檔案",
+ "uploadFilePlaceholder": "拖曳檔案或點擊上傳",
+ "addMore": "新增更多",
+ "handleType": {
+ "file-share": "檔案分享",
+ "file-image-compress": "圖片壓縮",
+ "file-image-convert": "格式轉換"
+ }
+ },
+ "text": {
+ "uploadText": "上傳文字",
+ "uploadTextPlaceholder": "使用我們的文字處理器輕鬆分享、翻譯、總結、生成圖片,並向大型模型提問",
+ "handleType": {
+ "text-share": "文字分享",
+ "text-translate": "文字翻譯"
+ }
+ },
+ "pickup": {
+ "title": "輸入取件碼",
+ "codeError": "取件碼錯誤",
+ "btn": "取件"
+ }
+ },
+ "shareOptions": {
+ "file": {
+ "title": "分享選項",
+ "downloadNums": "下載次數",
+ "expireTime": "過期時間",
+ "or": "或",
+ "expireAfter": "後過期",
+ "pickupCode": "取件碼",
+ "passwordProtection": "密碼保護",
+ "downloadNotify": "下載通知",
+ "passwordPlaceholder": "請輸入密碼",
+ "emailPlaceholder": "請輸入電子郵件",
+ "downloadOptions": {
+ "xdownload": "{0} 次下載"
+ },
+ "expireOptions": {
+ "5min": "5 分鐘",
+ "1hour": "1 小時",
+ "1day": "1 天",
+ "3days": "3 天"
+ }
+ },
+ "imageConvert": {
+ "title": "圖片轉換",
+ "targetFormat": "目標格式"
+ },
+ "text": {
+ "title": "分享選項",
+ "viewNums": "瀏覽次數",
+ "expireTime": "過期時間",
+ "or": "或",
+ "expireAfter": "後過期",
+ "pickupCode": "取件碼",
+ "passwordProtection": "密碼保護",
+ "readNotify": "已讀通知",
+ "passwordPlaceholder": "請輸入密碼",
+ "emailPlaceholder": "請輸入電子郵件",
+ "viewOptions": {
+ "xview": "{0} 次瀏覽"
+ },
+ "expireOptions": {
+ "5min": "5 分鐘",
+ "1hour": "1 小時",
+ "1day": "1 天",
+ "3days": "3 天"
+ }
+ }
+ },
+ "progress": {
+ "file": {
+ "totalUploadProgress": "總上傳進度",
+ "fileList": "檔案列表",
+ "fileName": "檔名",
+ "fileSize": "檔案大小",
+ "uploadSpeed": "上傳速度",
+ "progress": "進度",
+ "uploadDetails": "上傳詳情",
+ "chunk": "區塊",
+ "completed": "已完成",
+ "discarded": "已捨棄",
+ "pending": "待完成",
+ "chunkProgress": "區塊進度條",
+ "chunkHeatmap": "區塊熱力圖",
+ "heatmap": "熱力圖",
+ "progressBar": "進度條",
+ "uploadError": "上傳錯誤",
+ "chunkUploadFailed": "檔案 {0} 的第 {1} 個分塊多次上傳失敗,我們已終止該檔案上傳",
+ "chunkUploadRetry": "檔案 {0} 的第 {1} 個分塊上傳失敗,稍後將再次嘗試",
+ "fileUploadFailed": "檔案 {0} 上傳失敗,請重試",
+ "uploadFailed": "上傳失敗",
+ "processing": {
+ "hash": "計算雜湊中...",
+ "create": "初始化上傳中...",
+ "upload": "上傳中...",
+ "finish": "上傳完成"
+ },
+ "instantUploadSuccess": "雲端已存在相同雜湊的檔案,秒傳成功",
+ "uploadFailedRetry": "上傳失敗,請稍後重試",
+ "uploadSpeedInfo": {
+ "title": "上傳速度如何計算",
+ "desc": {
+ "base": "上傳速度根據當前秒內上傳的 {chunkNum} * {chunkSize} 估算,可能與實際速度存在一定誤差,僅供參考",
+ "chunkNum": "檔案區塊數量",
+ "chunkSize": "每個檔案區塊大小"
+ }
+ }
+ }
+ },
+ "result": {
+ "file": {
+ "title": "上傳成功",
+ "fileList": "檔案列表",
+ "info": "資訊",
+ "downloadNums": "下載次數",
+ "expireTime": "過期時間",
+ "pickupCode": "提取碼",
+ "link": "連結",
+ "copySuccess": "複製成功"
+ },
+ "imageCompress": {
+ "title": "圖片壓縮",
+ "totalSize": "總大小",
+ "task": "任務",
+ "retry": "重試 {0}/{1}",
+ "failed": "失敗"
+ },
+ "imageConvert": {
+ "title": "圖片轉換",
+ "convert": "轉換",
+ "task": "任務",
+ "retry": "重試 {0}/{1}",
+ "failed": "失敗"
+ },
+ "text": {
+ "title": "分享成功",
+ "info": "資訊",
+ "viewNums": "瀏覽次數",
+ "expireTime": "過期時間",
+ "pickupCode": "提取碼",
+ "link": "連結",
+ "content": "內容",
+ "copySuccess": "複製成功"
+ },
+ "textTranslate": {
+ "title": "文字翻譯",
+ "sourceText": "輸入文字",
+ "translatedText": "翻譯結果",
+ "sourceLanguage": "來源語言",
+ "targetLanguage": "目標語言",
+ "provider": "提供者",
+ "retranslate": "重新翻譯",
+ "empty": "輸入文字後點擊重新翻譯即可查看結果",
+ "copy": "複製譯文",
+ "copySuccess": "譯文已複製",
+ "language": {
+ "auto": "自動偵測",
+ "zh-CN": "中文",
+ "en": "英語",
+ "ja": "日語",
+ "ko": "韓語"
+ }
+ },
+ "qrCode": {
+ "title": "分享 QR Code"
+ }
+ },
+ "shareView": {
+ "linkExpired": "此連結已過期。",
+ "passwall": {
+ "title": "輸入密碼",
+ "passwordError": "密碼錯誤",
+ "passwordPlaceholder": "請輸入密碼"
+ },
+ "fileShare": {
+ "title": "下載檔案",
+ "downloadBtn": "下載",
+ "needPassword": "需要密碼",
+ "expireTime": "過期時間",
+ "remainingDownloads": "剩餘下載次數",
+ "getTokenFailed": "取得 token 失敗",
+ "durationFormat": "D天 HH:mm:ss"
+ },
+ "textShare": {
+ "title": "查看文字",
+ "viewBtn": "瀏覽",
+ "needPassword": "需要密碼",
+ "expireTime": "過期時間",
+ "remainingViews": "剩餘瀏覽次數",
+ "durationFormat": "D天 HH:mm:ss"
+ }
+ },
+ "about": {
+ "powerBy": "由 {0} 驅動的開源自託管臨時檔案分享平台",
+ "file": "檔案",
+ "share": "分享",
+ "download": "下載",
+ "task": "任務",
+ "admin": "本站管理員",
+ "author": "作者",
+ "title": "關於",
+ "about": "關於",
+ "systemInfo": "系統資訊",
+ "enabledFeatures": "實例功能",
+ "enabledFeaturesEmpty": "目前此實例尚未啟用額外功能",
+ "systemVersion": "系統版本",
+ "storage": "已託管的檔案",
+ "analysis": "分析",
+ "fileSize": "檔案大小",
+ "fileNum": "檔案數量",
+ "processed": "處理數量",
+ "failed": "失敗數量"
+ }
+ }
+}