chore: refactoring and tests, splitting up files (#12495)

This commit is contained in:
Adam
2026-02-06 10:02:31 -06:00
committed by GitHub
parent a4bc883595
commit 2c58dd6203
117 changed files with 9457 additions and 5827 deletions

View File

@@ -28,8 +28,8 @@ export const dict = {
"command.settings.open": "فتح الإعدادات",
"command.session.previous": "الجلسة السابقة",
"command.session.next": "الجلسة التالية",
"command.session.previous.unseen": "Previous unread session",
"command.session.next.unseen": "Next unread session",
"command.session.previous.unseen": "الجلسة غير المقروءة السابقة",
"command.session.next.unseen": "الجلسة غير المقروءة التالية",
"command.session.archive": "أرشفة الجلسة",
"command.palette": "لوحة الأوامر",

View File

@@ -28,8 +28,8 @@ export const dict = {
"command.settings.open": "Abrir configurações",
"command.session.previous": "Sessão anterior",
"command.session.next": "Próxima sessão",
"command.session.previous.unseen": "Previous unread session",
"command.session.next.unseen": "Next unread session",
"command.session.previous.unseen": "Sessão não lida anterior",
"command.session.next.unseen": "Próxima sessão não lida",
"command.session.archive": "Arquivar sessão",
"command.palette": "Paleta de comandos",

View File

@@ -28,8 +28,8 @@ export const dict = {
"command.settings.open": "Åbn indstillinger",
"command.session.previous": "Forrige session",
"command.session.next": "Næste session",
"command.session.previous.unseen": "Previous unread session",
"command.session.next.unseen": "Next unread session",
"command.session.previous.unseen": "Forrige ulæste session",
"command.session.next.unseen": "Næste ulæste session",
"command.session.archive": "Arkivér session",
"command.palette": "Kommandopalette",

View File

@@ -32,8 +32,8 @@ export const dict = {
"command.settings.open": "Einstellungen öffnen",
"command.session.previous": "Vorherige Sitzung",
"command.session.next": "Nächste Sitzung",
"command.session.previous.unseen": "Previous unread session",
"command.session.next.unseen": "Next unread session",
"command.session.previous.unseen": "Vorherige ungelesene Sitzung",
"command.session.next.unseen": "Nächste ungelesene Sitzung",
"command.session.archive": "Sitzung archivieren",
"command.palette": "Befehlspalette",
@@ -147,6 +147,44 @@ export const dict = {
"provider.connect.toast.connected.title": "{{provider}} verbunden",
"provider.connect.toast.connected.description": "{{provider}} Modelle sind jetzt verfügbar.",
"provider.custom.title": "Benutzerdefinierter Anbieter",
"provider.custom.description.prefix": "Konfigurieren Sie einen OpenAI-kompatiblen Anbieter. Siehe die ",
"provider.custom.description.link": "Anbieter-Konfigurationsdokumente",
"provider.custom.description.suffix": ".",
"provider.custom.field.providerID.label": "Anbieter-ID",
"provider.custom.field.providerID.placeholder": "myprovider",
"provider.custom.field.providerID.description": "Kleinbuchstaben, Zahlen, Bindestriche oder Unterstriche",
"provider.custom.field.name.label": "Anzeigename",
"provider.custom.field.name.placeholder": "Mein KI-Anbieter",
"provider.custom.field.baseURL.label": "Basis-URL",
"provider.custom.field.baseURL.placeholder": "https://api.myprovider.com/v1",
"provider.custom.field.apiKey.label": "API-Schlüssel",
"provider.custom.field.apiKey.placeholder": "API-Schlüssel",
"provider.custom.field.apiKey.description":
"Optional. Leer lassen, wenn Sie die Authentifizierung über Header verwalten.",
"provider.custom.models.label": "Modelle",
"provider.custom.models.id.label": "ID",
"provider.custom.models.id.placeholder": "model-id",
"provider.custom.models.name.label": "Name",
"provider.custom.models.name.placeholder": "Anzeigename",
"provider.custom.models.remove": "Modell entfernen",
"provider.custom.models.add": "Modell hinzufügen",
"provider.custom.headers.label": "Header (optional)",
"provider.custom.headers.key.label": "Header",
"provider.custom.headers.key.placeholder": "Header-Name",
"provider.custom.headers.value.label": "Wert",
"provider.custom.headers.value.placeholder": "wert",
"provider.custom.headers.remove": "Header entfernen",
"provider.custom.headers.add": "Header hinzufügen",
"provider.custom.error.providerID.required": "Anbieter-ID ist erforderlich",
"provider.custom.error.providerID.format": "Verwenden Sie Kleinbuchstaben, Zahlen, Bindestriche oder Unterstriche",
"provider.custom.error.providerID.exists": "Diese Anbieter-ID existiert bereits",
"provider.custom.error.name.required": "Anzeigename ist erforderlich",
"provider.custom.error.baseURL.required": "Basis-URL ist erforderlich",
"provider.custom.error.baseURL.format": "Muss mit http:// oder https:// beginnen",
"provider.custom.error.required": "Erforderlich",
"provider.custom.error.duplicate": "Duplikat",
"provider.disconnect.toast.disconnected.title": "{{provider}} getrennt",
"provider.disconnect.toast.disconnected.description": "Die {{provider}}-Modelle sind nicht mehr verfügbar.",
"model.tag.free": "Kostenlos",
@@ -380,6 +418,7 @@ export const dict = {
"Wurzelelement nicht gefunden. Haben Sie vergessen, es in Ihre index.html aufzunehmen? Oder wurde das id-Attribut falsch geschrieben?",
"error.globalSync.connectFailed": "Verbindung zum Server fehlgeschlagen. Läuft ein Server unter `{{url}}`?",
"directory.error.invalidUrl": "Ungültiges Verzeichnis in der URL.",
"error.chain.unknown": "Unbekannter Fehler",
"error.chain.causedBy": "Verursacht durch:",

View File

@@ -149,6 +149,43 @@ export const dict = {
"provider.connect.toast.connected.title": "{{provider}} connected",
"provider.connect.toast.connected.description": "{{provider}} models are now available to use.",
"provider.custom.title": "Custom provider",
"provider.custom.description.prefix": "Configure an OpenAI-compatible provider. See the ",
"provider.custom.description.link": "provider config docs",
"provider.custom.description.suffix": ".",
"provider.custom.field.providerID.label": "Provider ID",
"provider.custom.field.providerID.placeholder": "myprovider",
"provider.custom.field.providerID.description": "Lowercase letters, numbers, hyphens, or underscores",
"provider.custom.field.name.label": "Display name",
"provider.custom.field.name.placeholder": "My AI Provider",
"provider.custom.field.baseURL.label": "Base URL",
"provider.custom.field.baseURL.placeholder": "https://api.myprovider.com/v1",
"provider.custom.field.apiKey.label": "API key",
"provider.custom.field.apiKey.placeholder": "API key",
"provider.custom.field.apiKey.description": "Optional. Leave empty if you manage auth via headers.",
"provider.custom.models.label": "Models",
"provider.custom.models.id.label": "ID",
"provider.custom.models.id.placeholder": "model-id",
"provider.custom.models.name.label": "Name",
"provider.custom.models.name.placeholder": "Display Name",
"provider.custom.models.remove": "Remove model",
"provider.custom.models.add": "Add model",
"provider.custom.headers.label": "Headers (optional)",
"provider.custom.headers.key.label": "Header",
"provider.custom.headers.key.placeholder": "Header-Name",
"provider.custom.headers.value.label": "Value",
"provider.custom.headers.value.placeholder": "value",
"provider.custom.headers.remove": "Remove header",
"provider.custom.headers.add": "Add header",
"provider.custom.error.providerID.required": "Provider ID is required",
"provider.custom.error.providerID.format": "Use lowercase letters, numbers, hyphens, or underscores",
"provider.custom.error.providerID.exists": "That provider ID already exists",
"provider.custom.error.name.required": "Display name is required",
"provider.custom.error.baseURL.required": "Base URL is required",
"provider.custom.error.baseURL.format": "Must start with http:// or https://",
"provider.custom.error.required": "Required",
"provider.custom.error.duplicate": "Duplicate",
"provider.disconnect.toast.disconnected.title": "{{provider}} disconnected",
"provider.disconnect.toast.disconnected.description": "{{provider}} models are no longer available.",
@@ -404,6 +441,7 @@ export const dict = {
"Root element not found. Did you forget to add it to your index.html? Or maybe the id attribute got misspelled?",
"error.globalSync.connectFailed": "Could not connect to server. Is there a server running at `{{url}}`?",
"directory.error.invalidUrl": "Invalid directory in URL.",
"error.chain.unknown": "Unknown error",
"error.chain.causedBy": "Caused by:",

View File

@@ -28,8 +28,8 @@ export const dict = {
"command.settings.open": "Abrir ajustes",
"command.session.previous": "Sesión anterior",
"command.session.next": "Siguiente sesión",
"command.session.previous.unseen": "Previous unread session",
"command.session.next.unseen": "Next unread session",
"command.session.previous.unseen": "Sesión no leída anterior",
"command.session.next.unseen": "Siguiente sesión no leída",
"command.session.archive": "Archivar sesión",
"command.palette": "Paleta de comandos",

View File

@@ -28,8 +28,8 @@ export const dict = {
"command.settings.open": "Ouvrir les paramètres",
"command.session.previous": "Session précédente",
"command.session.next": "Session suivante",
"command.session.previous.unseen": "Previous unread session",
"command.session.next.unseen": "Next unread session",
"command.session.previous.unseen": "Session non lue précédente",
"command.session.next.unseen": "Session non lue suivante",
"command.session.archive": "Archiver la session",
"command.palette": "Palette de commandes",

View File

@@ -28,8 +28,8 @@ export const dict = {
"command.settings.open": "設定を開く",
"command.session.previous": "前のセッション",
"command.session.next": "次のセッション",
"command.session.previous.unseen": "Previous unread session",
"command.session.next.unseen": "Next unread session",
"command.session.previous.unseen": "前の未読セッション",
"command.session.next.unseen": "次の未読セッション",
"command.session.archive": "セッションをアーカイブ",
"command.palette": "コマンドパレット",

View File

@@ -32,8 +32,8 @@ export const dict = {
"command.settings.open": "설정 열기",
"command.session.previous": "이전 세션",
"command.session.next": "다음 세션",
"command.session.previous.unseen": "Previous unread session",
"command.session.next.unseen": "Next unread session",
"command.session.previous.unseen": "이전 읽지 않은 세션",
"command.session.next.unseen": "다음 읽지 않은 세션",
"command.session.archive": "세션 보관",
"command.palette": "명령 팔레트",

View File

@@ -31,8 +31,8 @@ export const dict = {
"command.settings.open": "Åpne innstillinger",
"command.session.previous": "Forrige sesjon",
"command.session.next": "Neste sesjon",
"command.session.previous.unseen": "Previous unread session",
"command.session.next.unseen": "Next unread session",
"command.session.previous.unseen": "Forrige uleste økt",
"command.session.next.unseen": "Neste uleste økt",
"command.session.archive": "Arkiver sesjon",
"command.palette": "Kommandopalett",

View File

@@ -0,0 +1,31 @@
import { describe, expect, test } from "bun:test"
import { dict as en } from "./en"
import { dict as ar } from "./ar"
import { dict as br } from "./br"
import { dict as bs } from "./bs"
import { dict as da } from "./da"
import { dict as de } from "./de"
import { dict as es } from "./es"
import { dict as fr } from "./fr"
import { dict as ja } from "./ja"
import { dict as ko } from "./ko"
import { dict as no } from "./no"
import { dict as pl } from "./pl"
import { dict as ru } from "./ru"
import { dict as th } from "./th"
import { dict as zh } from "./zh"
import { dict as zht } from "./zht"
const locales = [ar, br, bs, da, de, es, fr, ja, ko, no, pl, ru, th, zh, zht]
const keys = ["command.session.previous.unseen", "command.session.next.unseen"] as const
describe("i18n parity", () => {
test("non-English locales translate targeted unseen session keys", () => {
for (const locale of locales) {
for (const key of keys) {
expect(locale[key]).toBeDefined()
expect(locale[key]).not.toBe(en[key])
}
}
})
})

View File

@@ -28,8 +28,8 @@ export const dict = {
"command.settings.open": "Otwórz ustawienia",
"command.session.previous": "Poprzednia sesja",
"command.session.next": "Następna sesja",
"command.session.previous.unseen": "Previous unread session",
"command.session.next.unseen": "Next unread session",
"command.session.previous.unseen": "Poprzednia nieprzeczytana sesja",
"command.session.next.unseen": "Następna nieprzeczytana sesja",
"command.session.archive": "Zarchiwizuj sesję",
"command.palette": "Paleta poleceń",

View File

@@ -28,8 +28,8 @@ export const dict = {
"command.settings.open": "Открыть настройки",
"command.session.previous": "Предыдущая сессия",
"command.session.next": "Следующая сессия",
"command.session.previous.unseen": "Previous unread session",
"command.session.next.unseen": "Next unread session",
"command.session.previous.unseen": "Предыдущая непрочитанная сессия",
"command.session.next.unseen": "Следующая непрочитанная сессия",
"command.session.archive": "Архивировать сессию",
"command.palette": "Палитра команд",

View File

@@ -28,8 +28,8 @@ export const dict = {
"command.settings.open": "เปิดการตั้งค่า",
"command.session.previous": "เซสชันก่อนหน้า",
"command.session.next": "เซสชันถัดไป",
"command.session.previous.unseen": "Previous unread session",
"command.session.next.unseen": "Next unread session",
"command.session.previous.unseen": "เซสชันที่ยังไม่ได้อ่านก่อนหน้า",
"command.session.next.unseen": "เซสชันที่ยังไม่ได้อ่านถัดไป",
"command.session.archive": "จัดเก็บเซสชัน",
"command.palette": "คำสั่งค้นหา",

View File

@@ -32,8 +32,8 @@ export const dict = {
"command.settings.open": "打开设置",
"command.session.previous": "上一个会话",
"command.session.next": "下一个会话",
"command.session.previous.unseen": "Previous unread session",
"command.session.next.unseen": "Next unread session",
"command.session.previous.unseen": "上一个未读会话",
"command.session.next.unseen": "下一个未读会话",
"command.session.archive": "归档会话",
"command.palette": "命令面板",
@@ -147,6 +147,43 @@ export const dict = {
"provider.connect.toast.connected.title": "{{provider}} 已连接",
"provider.connect.toast.connected.description": "现在可以使用 {{provider}} 模型了。",
"provider.custom.title": "自定义提供商",
"provider.custom.description.prefix": "配置与 OpenAI 兼容的提供商。请查看",
"provider.custom.description.link": "提供商配置文档",
"provider.custom.description.suffix": "。",
"provider.custom.field.providerID.label": "提供商 ID",
"provider.custom.field.providerID.placeholder": "myprovider",
"provider.custom.field.providerID.description": "使用小写字母、数字、连字符或下划线",
"provider.custom.field.name.label": "显示名称",
"provider.custom.field.name.placeholder": "我的 AI 提供商",
"provider.custom.field.baseURL.label": "基础 URL",
"provider.custom.field.baseURL.placeholder": "https://api.myprovider.com/v1",
"provider.custom.field.apiKey.label": "API 密钥",
"provider.custom.field.apiKey.placeholder": "API 密钥",
"provider.custom.field.apiKey.description": "可选。如果你通过请求头管理认证,可留空。",
"provider.custom.models.label": "模型",
"provider.custom.models.id.label": "ID",
"provider.custom.models.id.placeholder": "model-id",
"provider.custom.models.name.label": "名称",
"provider.custom.models.name.placeholder": "显示名称",
"provider.custom.models.remove": "移除模型",
"provider.custom.models.add": "添加模型",
"provider.custom.headers.label": "请求头(可选)",
"provider.custom.headers.key.label": "请求头",
"provider.custom.headers.key.placeholder": "Header-Name",
"provider.custom.headers.value.label": "值",
"provider.custom.headers.value.placeholder": "value",
"provider.custom.headers.remove": "移除请求头",
"provider.custom.headers.add": "添加请求头",
"provider.custom.error.providerID.required": "提供商 ID 为必填项",
"provider.custom.error.providerID.format": "请使用小写字母、数字、连字符或下划线",
"provider.custom.error.providerID.exists": "该提供商 ID 已存在",
"provider.custom.error.name.required": "显示名称为必填项",
"provider.custom.error.baseURL.required": "基础 URL 为必填项",
"provider.custom.error.baseURL.format": "必须以 http:// 或 https:// 开头",
"provider.custom.error.required": "必填",
"provider.custom.error.duplicate": "重复",
"provider.disconnect.toast.disconnected.title": "{{provider}} 已断开连接",
"provider.disconnect.toast.disconnected.description": "{{provider}} 模型已不再可用。",
"model.tag.free": "免费",
@@ -380,6 +417,7 @@ export const dict = {
"error.dev.rootNotFound": "未找到根元素。你是不是忘了把它添加到 index.html或者 id 属性拼写错了?",
"error.globalSync.connectFailed": "无法连接到服务器。是否有服务器正在 `{{url}}` 运行?",
"directory.error.invalidUrl": "URL 中的目录无效。",
"error.chain.unknown": "未知错误",
"error.chain.causedBy": "原因:",

View File

@@ -32,8 +32,8 @@ export const dict = {
"command.settings.open": "開啟設定",
"command.session.previous": "上一個工作階段",
"command.session.next": "下一個工作階段",
"command.session.previous.unseen": "Previous unread session",
"command.session.next.unseen": "Next unread session",
"command.session.previous.unseen": "上一個未讀會話",
"command.session.next.unseen": "下一個未讀會話",
"command.session.archive": "封存工作階段",
"command.palette": "命令面板",
@@ -144,6 +144,43 @@ export const dict = {
"provider.connect.toast.connected.title": "{{provider}} 已連線",
"provider.connect.toast.connected.description": "現在可以使用 {{provider}} 模型了。",
"provider.custom.title": "自訂提供商",
"provider.custom.description.prefix": "設定與 OpenAI 相容的提供商。請參閱",
"provider.custom.description.link": "提供商設定文件",
"provider.custom.description.suffix": "。",
"provider.custom.field.providerID.label": "提供商 ID",
"provider.custom.field.providerID.placeholder": "myprovider",
"provider.custom.field.providerID.description": "使用小寫字母、數字、連字號或底線",
"provider.custom.field.name.label": "顯示名稱",
"provider.custom.field.name.placeholder": "我的 AI 提供商",
"provider.custom.field.baseURL.label": "基礎 URL",
"provider.custom.field.baseURL.placeholder": "https://api.myprovider.com/v1",
"provider.custom.field.apiKey.label": "API 金鑰",
"provider.custom.field.apiKey.placeholder": "API 金鑰",
"provider.custom.field.apiKey.description": "選填。若您透過標頭管理驗證,可留空。",
"provider.custom.models.label": "模型",
"provider.custom.models.id.label": "ID",
"provider.custom.models.id.placeholder": "model-id",
"provider.custom.models.name.label": "名稱",
"provider.custom.models.name.placeholder": "顯示名稱",
"provider.custom.models.remove": "移除模型",
"provider.custom.models.add": "新增模型",
"provider.custom.headers.label": "標頭(選填)",
"provider.custom.headers.key.label": "標頭",
"provider.custom.headers.key.placeholder": "Header-Name",
"provider.custom.headers.value.label": "值",
"provider.custom.headers.value.placeholder": "value",
"provider.custom.headers.remove": "移除標頭",
"provider.custom.headers.add": "新增標頭",
"provider.custom.error.providerID.required": "提供商 ID 為必填",
"provider.custom.error.providerID.format": "請使用小寫字母、數字、連字號或底線",
"provider.custom.error.providerID.exists": "該提供商 ID 已存在",
"provider.custom.error.name.required": "顯示名稱為必填",
"provider.custom.error.baseURL.required": "基礎 URL 為必填",
"provider.custom.error.baseURL.format": "必須以 http:// 或 https:// 開頭",
"provider.custom.error.required": "必填",
"provider.custom.error.duplicate": "重複",
"provider.disconnect.toast.disconnected.title": "{{provider}} 已中斷連線",
"provider.disconnect.toast.disconnected.description": "{{provider}} 模型已不再可用。",
"model.tag.free": "免費",
@@ -377,6 +414,7 @@ export const dict = {
"error.dev.rootNotFound": "找不到根元素。你是不是忘了把它新增到 index.html? 或者 id 屬性拼錯了?",
"error.globalSync.connectFailed": "無法連線到伺服器。是否有伺服器正在 `{{url}}` 執行?",
"directory.error.invalidUrl": "URL 中的目錄無效。",
"error.chain.unknown": "未知錯誤",
"error.chain.causedBy": "原因:",