浏览代码

feat: Change translation keys to fallback strings

Ased Mammad 1 年之前
父节点
当前提交
7a77f3c2c0

+ 94 - 0
package-lock.json

@@ -13,6 +13,9 @@
 				"dayjs": "^1.11.10",
 				"file-saver": "^2.0.5",
 				"highlight.js": "^11.9.0",
+				"i18next": "^23.10.0",
+				"i18next-browser-languagedetector": "^7.2.0",
+				"i18next-resources-to-backend": "^1.2.0",
 				"idb": "^7.1.1",
 				"js-sha256": "^0.10.1",
 				"katex": "^0.16.9",
@@ -78,6 +81,17 @@
 				"node": ">=6.0.0"
 			}
 		},
+		"node_modules/@babel/runtime": {
+			"version": "7.24.0",
+			"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.0.tgz",
+			"integrity": "sha512-Chk32uHMg6TnQdvw2e9IlqPpFX/6NLuK0Ys2PqLb7/gL5uFn9mXvK715FGLlOLQrcO4qIkNHkvPGktzzXexsFw==",
+			"dependencies": {
+				"regenerator-runtime": "^0.14.0"
+			},
+			"engines": {
+				"node": ">=6.9.0"
+			}
+		},
 		"node_modules/@esbuild/darwin-arm64": {
 			"version": "0.18.20",
 			"resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz",
@@ -1898,6 +1912,44 @@
 				"node": ">=12.0.0"
 			}
 		},
+		"node_modules/i18next": {
+			"version": "23.10.0",
+			"resolved": "https://registry.npmjs.org/i18next/-/i18next-23.10.0.tgz",
+			"integrity": "sha512-/TgHOqsa7/9abUKJjdPeydoyDc0oTi/7u9F8lMSj6ufg4cbC1Oj3f/Jja7zj7WRIhEQKB7Q4eN6y68I9RDxxGQ==",
+			"funding": [
+				{
+					"type": "individual",
+					"url": "https://locize.com"
+				},
+				{
+					"type": "individual",
+					"url": "https://locize.com/i18next.html"
+				},
+				{
+					"type": "individual",
+					"url": "https://www.i18next.com/how-to/faq#i18next-is-awesome.-how-can-i-support-the-project"
+				}
+			],
+			"dependencies": {
+				"@babel/runtime": "^7.23.2"
+			}
+		},
+		"node_modules/i18next-browser-languagedetector": {
+			"version": "7.2.0",
+			"resolved": "https://registry.npmjs.org/i18next-browser-languagedetector/-/i18next-browser-languagedetector-7.2.0.tgz",
+			"integrity": "sha512-U00DbDtFIYD3wkWsr2aVGfXGAj2TgnELzOX9qv8bT0aJtvPV9CRO77h+vgmHFBMe7LAxdwvT/7VkCWGya6L3tA==",
+			"dependencies": {
+				"@babel/runtime": "^7.23.2"
+			}
+		},
+		"node_modules/i18next-resources-to-backend": {
+			"version": "1.2.0",
+			"resolved": "https://registry.npmjs.org/i18next-resources-to-backend/-/i18next-resources-to-backend-1.2.0.tgz",
+			"integrity": "sha512-8f1l03s+QxDmCfpSXCh9V+AFcxAwIp0UaroWuyOx+hmmv8484GcELHs+lnu54FrNij8cDBEXvEwhzZoXsKcVpg==",
+			"dependencies": {
+				"@babel/runtime": "^7.23.2"
+			}
+		},
 		"node_modules/idb": {
 			"version": "7.1.1",
 			"resolved": "https://registry.npmjs.org/idb/-/idb-7.1.1.tgz",
@@ -2820,6 +2872,11 @@
 				"node": ">=8.10.0"
 			}
 		},
+		"node_modules/regenerator-runtime": {
+			"version": "0.14.1",
+			"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz",
+			"integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw=="
+		},
 		"node_modules/resolve": {
 			"version": "1.22.6",
 			"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.6.tgz",
@@ -3709,6 +3766,14 @@
 				"@jridgewell/trace-mapping": "^0.3.9"
 			}
 		},
+		"@babel/runtime": {
+			"version": "7.24.0",
+			"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.0.tgz",
+			"integrity": "sha512-Chk32uHMg6TnQdvw2e9IlqPpFX/6NLuK0Ys2PqLb7/gL5uFn9mXvK715FGLlOLQrcO4qIkNHkvPGktzzXexsFw==",
+			"requires": {
+				"regenerator-runtime": "^0.14.0"
+			}
+		},
 		"@esbuild/darwin-arm64": {
 			"version": "0.18.20",
 			"resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz",
@@ -4979,6 +5044,30 @@
 			"resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-11.9.0.tgz",
 			"integrity": "sha512-fJ7cW7fQGCYAkgv4CPfwFHrfd/cLS4Hau96JuJ+ZTOWhjnhoeN1ub1tFmALm/+lW5z4WCAuAV9bm05AP0mS6Gw=="
 		},
+		"i18next": {
+			"version": "23.10.0",
+			"resolved": "https://registry.npmjs.org/i18next/-/i18next-23.10.0.tgz",
+			"integrity": "sha512-/TgHOqsa7/9abUKJjdPeydoyDc0oTi/7u9F8lMSj6ufg4cbC1Oj3f/Jja7zj7WRIhEQKB7Q4eN6y68I9RDxxGQ==",
+			"requires": {
+				"@babel/runtime": "^7.23.2"
+			}
+		},
+		"i18next-browser-languagedetector": {
+			"version": "7.2.0",
+			"resolved": "https://registry.npmjs.org/i18next-browser-languagedetector/-/i18next-browser-languagedetector-7.2.0.tgz",
+			"integrity": "sha512-U00DbDtFIYD3wkWsr2aVGfXGAj2TgnELzOX9qv8bT0aJtvPV9CRO77h+vgmHFBMe7LAxdwvT/7VkCWGya6L3tA==",
+			"requires": {
+				"@babel/runtime": "^7.23.2"
+			}
+		},
+		"i18next-resources-to-backend": {
+			"version": "1.2.0",
+			"resolved": "https://registry.npmjs.org/i18next-resources-to-backend/-/i18next-resources-to-backend-1.2.0.tgz",
+			"integrity": "sha512-8f1l03s+QxDmCfpSXCh9V+AFcxAwIp0UaroWuyOx+hmmv8484GcELHs+lnu54FrNij8cDBEXvEwhzZoXsKcVpg==",
+			"requires": {
+				"@babel/runtime": "^7.23.2"
+			}
+		},
 		"idb": {
 			"version": "7.1.1",
 			"resolved": "https://registry.npmjs.org/idb/-/idb-7.1.1.tgz",
@@ -5602,6 +5691,11 @@
 				"picomatch": "^2.2.1"
 			}
 		},
+		"regenerator-runtime": {
+			"version": "0.14.1",
+			"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz",
+			"integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw=="
+		},
 		"resolve": {
 			"version": "1.22.6",
 			"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.6.tgz",

+ 2 - 2
src/lib/components/chat/MessageInput.svelte

@@ -671,8 +671,8 @@
 							placeholder={chatInputPlaceholder !== ''
 								? chatInputPlaceholder
 								: isRecording
-								? $i18n.t('ChatInputPlaceholderListening')
-								: $i18n.t('ChatInputPlaceholder')}
+								? $i18n.t('Listening...')
+								: $i18n.t('Send a Messsage')}
 							bind:value={prompt}
 							on:keypress={(e) => {
 								if (e.keyCode == 13 && !e.shiftKey) {

+ 2 - 2
src/lib/components/chat/Messages/Placeholder.svelte

@@ -66,9 +66,9 @@
 					</div>
 				{/if}
 			{:else}
-				<div class=" line-clamp-1">{$i18n.t('Hello', { name: $user.name })}</div>
+				<div class=" line-clamp-1">{$i18n.t('Hello, {{name}}', { name: $user.name })}</div>
 
-				<div>{$i18n.t('GreetingPlaceholder')}</div>
+				<div>{$i18n.t('How can I help you today?')}</div>
 			{/if}
 		</div>
 	</div>

+ 2 - 2
src/lib/components/chat/ModelSelector.svelte

@@ -42,7 +42,7 @@
 				{disabled}
 			>
 				<option class=" text-gray-700" value="" selected disabled
-					>{$i18n.t('ModelSelectorPlaceholder')}</option
+					>{$i18n.t('Select a model')}</option
 				>
 
 				{#each $models as model}
@@ -137,5 +137,5 @@
 </div>
 
 <div class="text-left mt-1.5 text-xs text-gray-500">
-	<button on:click={saveDefaultModel}> {$i18n.t('SetAsDefault')}</button>
+	<button on:click={saveDefaultModel}> {$i18n.t('Set as default')}</button>
 </div>

+ 2 - 2
src/lib/components/chat/Settings/Images.svelte

@@ -195,10 +195,10 @@
 						<select
 							class="w-full rounded py-2 px-4 text-sm dark:text-gray-300 dark:bg-gray-800 outline-none"
 							bind:value={selectedModel}
-							placeholder={$i18n.t('ModelSelectorPlaceholder')}
+							placeholder={$i18n.t('Select a Model')}
 						>
 							{#if !selectedModel}
-								<option value="" disabled selected>{$i18n.t('ModelSelectorPlaceholder')}</option>
+								<option value="" disabled selected>{$i18n.t('Select a Model')}</option>
 							{/if}
 							{#each models ?? [] as model}
 								<option value={model.title} class="bg-gray-100 dark:bg-gray-700"

+ 1 - 1
src/lib/components/chat/Settings/Interface.svelte

@@ -190,7 +190,7 @@
 					<select
 						class="w-full rounded py-2 px-4 text-sm dark:text-gray-300 dark:bg-gray-800 outline-none"
 						bind:value={titleAutoGenerateModel}
-						placeholder={$i18n.t('ModelSelectorPlaceholder')}
+						placeholder={$i18n.t('Select a Model')}
 					>
 						<option value="" selected>Current Model</option>
 						{#each $models as model}

+ 4 - 4
src/lib/components/chat/Settings/Models.svelte

@@ -467,10 +467,10 @@
 							<select
 								class="w-full rounded py-2 px-4 text-sm dark:text-gray-300 dark:bg-gray-850 outline-none"
 								bind:value={deleteModelTag}
-								placeholder={$i18n.t('ModelSelectorPlaceholder')}
+								placeholder={$i18n.t('Select a model')}
 							>
 								{#if !deleteModelTag}
-									<option value="" disabled selected>{$i18n.t('ModelSelectorPlaceholder')}</option>
+									<option value="" disabled selected>{$i18n.t('Select a model')}</option>
 								{/if}
 								{#each $models.filter((m) => m.size != null) as model}
 									<option value={model.name} class="bg-gray-100 dark:bg-gray-700"
@@ -807,10 +807,10 @@
 								<select
 									class="w-full rounded py-2 px-4 text-sm dark:text-gray-300 dark:bg-gray-850 outline-none"
 									bind:value={deleteLiteLLMModelId}
-									placeholder={$i18n.t('ModelSelectorPlaceholder')}
+									placeholder={$i18n.t('Select a model')}
 								>
 									{#if !deleteLiteLLMModelId}
-										<option value="" disabled selected>{$i18n.t('ModelSelectorPlaceholder')}</option
+										<option value="" disabled selected>{$i18n.t('Select a model')}</option
 										>
 									{/if}
 									{#each liteLLMModelInfo as model}

+ 1 - 1
src/lib/components/layout/Sidebar.svelte

@@ -128,7 +128,7 @@
 						/>
 					</div>
 
-					<div class=" self-center font-medium text-sm">{$i18n.t('NewChat')}</div>
+					<div class=" self-center font-medium text-sm">{$i18n.t('New Chat')}</div>
 				</div>
 
 				<div class="self-center">

+ 7 - 7
src/lib/i18n/locales/de/common.json

@@ -1,10 +1,10 @@
 {
-	"NewChat": "Neuer Chat",
+	"New Chat": "Neuer Chat",
 	"Modelfiles": "Modelfiles",
-	"GreetingPlaceholder": "Wie kann ich dir heute behilflich sein?",
-	"Hello": "Hallo, {{name}}",
-	"ChatInputPlaceholderListening": "nimmt auf...",
-	"ChatInputPlaceholder": "Sende eine Nachricht",
-	"ModelSelectorPlaceholder": "Wähle ein Modell",
-	"SetAsDefault": "Als Standard festlegen"
+	"How can I help you today?": "Wie kann ich dir heute behilflich sein?",
+	"Hello, {{name}}": "Hallo, {{name}}",
+	"Listening...": "nimmt auf...",
+	"Send a Message": "Sende eine Nachricht",
+	"Select a model": "Wähle ein Modell",
+	"Set as default": "Als Standard festlegen"
 }

+ 7 - 7
src/lib/i18n/locales/en/common.json

@@ -1,10 +1,10 @@
 {
-	"NewChat": "New Chat",
+	"New Chat": "New Chat",
 	"Modelfiles": "Modelfiles",
-	"GreetingPlaceholder": "How can I help you today?",
-	"Hello": "Hello, {{name}}",
-	"ChatInputPlaceholderListening": "Listening...",
-	"ChatInputPlaceholder": "Send a Message",
-	"ModelSelectorPlaceholder": "Select a model",
-	"SetAsDefault": "Set as default"
+	"How can I help you today?": "How can I help you today?",
+	"Hello, {{name}}": "Hello, {{name}}",
+	"Listenin...": "Listening...",
+	"Send a Message": "Send a Message",
+	"Select a model": "Select a model",
+	"Set as default": "Set as default"
 }

+ 7 - 7
src/lib/i18n/locales/fa/common.json

@@ -1,10 +1,10 @@
 {
-	"NewChat": "چت جدید",
+	"New Chat": "چت جدید",
 	"Modelfiles": "فایل‌های مدل",
-	"GreetingPlaceholder": "امروز چطور می توانم کمک تان کنم؟",
-	"Hello": "سلام، {{name}}",
-	"ChatInputPlaceholderListening": "در حال گوش دادن...",
-	"ChatInputPlaceholder": "یک پیام ارسال کنید",
-	"ModelSelectorPlaceholder": "یک مدل انتخاب کنید",
-	"SetAsDefault": "تنظیم به عنوان پیشفرض"
+	"How can I help you today?": "امروز چطور می توانم کمک تان کنم؟",
+	"Hello, {{name}}": "سلام، {{name}}",
+	"Listening...": "در حال گوش دادن...",
+	"Send a Message": "یک پیام ارسال کنید",
+	"Select a model": "یک مدل انتخاب کنید",
+	"Set as default": "تنظیم به عنوان پیشفرض"
 }

+ 7 - 7
src/lib/i18n/locales/fr/common.json

@@ -1,10 +1,10 @@
 {
-	"NewChat": "New Chat",
+	"New Chat": "New Chat",
 	"Modelfiles": "Modelfiles",
-	"GreetingPlaceholder": "How can I help you today?",
-	"Hello": "Hello, {{name}}",
-	"ChatInputPlaceholderListening": "Listening...",
-	"ChatInputPlaceholder": "Send a Message",
-	"ModelSelectorPlaceholder": "Select a model",
-	"SetAsDefault": "Set as default"
+	"How can I help you today?": "How can I help you today?",
+	"Hello, {{name}}": "Hello, {{name}}",
+	"Listening...": "Listening...",
+	"Send a Message": "Send a Message",
+	"Select a model": "Select a model",
+	"Set as default": "Set as default"
 }