diff --git a/.config/quickshell/ii/modules/sidebarLeft/AiChat.qml b/.config/quickshell/ii/modules/sidebarLeft/AiChat.qml index e8a096a93..afd9f41c7 100644 --- a/.config/quickshell/ii/modules/sidebarLeft/AiChat.qml +++ b/.config/quickshell/ii/modules/sidebarLeft/AiChat.qml @@ -377,7 +377,7 @@ Inline w/ backslash and round brackets \\(e^{i\\pi} + 1 = 0\\) Layout.fillWidth: true padding: 10 color: activeFocus ? Appearance.m3colors.m3onSurface : Appearance.m3colors.m3onSurfaceVariant - placeholderText: StringUtils.format(Translation.tr('Message the model... "{0}" for commands'), root.commandPrefix) + placeholderText: Translation.tr('Message the model... "%1" for commands').arg(root.commandPrefix) background: null @@ -577,8 +577,9 @@ Inline w/ backslash and round brackets \\(e^{i\\pi} + 1 = 0\\) id: toolTip extraVisibleCondition: false alternativeVisibleCondition: mouseArea.containsMouse // Show tooltip when hovered - content: StringUtils.format(Translation.tr("Current model: {0}\nSet it with {1}model MODEL"), - Ai.getModel().name, root.commandPrefix) + content: Translation.tr("Current model: %1\nSet it with %2model MODEL") + .arg(Ai.getModel().name) + .arg(root.commandPrefix) } MouseArea { diff --git a/.config/quickshell/ii/modules/sidebarLeft/Anime.qml b/.config/quickshell/ii/modules/sidebarLeft/Anime.qml index 7498dceb2..304d8f32d 100644 --- a/.config/quickshell/ii/modules/sidebarLeft/Anime.qml +++ b/.config/quickshell/ii/modules/sidebarLeft/Anime.qml @@ -242,7 +242,7 @@ Item { font.pixelSize: Appearance.font.pixelSize.smaller color: Appearance.m3colors.m3inverseOnSurface wrapMode: Text.Wrap - text: StringUtils.format(Translation.tr("{0} queries pending"), Booru.runningRequests) + text: Translation.tr("%1 queries pending").arg(Booru.runningRequests) } } } @@ -354,7 +354,7 @@ Item { padding: 10 color: activeFocus ? Appearance.m3colors.m3onSurface : Appearance.m3colors.m3onSurfaceVariant renderType: Text.NativeRendering - placeholderText: StringUtils.format(Translation.tr('Enter tags, or "{0}" for commands'), root.commandPrefix) + placeholderText: Translation.tr('Enter tags, or "%1" for commands').arg(root.commandPrefix) background: null @@ -518,8 +518,9 @@ Item { extraVisibleCondition: false alternativeVisibleCondition: mouseArea.containsMouse // Show tooltip when hovered // content: Translation.tr("The current API used. Endpoint: ") + Booru.providers[Booru.currentProvider].url + Translation.tr("\nSet with /mode PROVIDER") - content: StringUtils.format(Translation.tr("Current API endpoint: {0}\nSet it with {1}mode PROVIDER"), - Booru.providers[Booru.currentProvider].url, root.commandPrefix) + content: Translation.tr("Current API endpoint: %1\nSet it with %2mode PROVIDER") + .arg(Booru.providers[Booru.currentProvider].url) + .arg(root.commandPrefix) } MouseArea { diff --git a/.config/quickshell/ii/modules/sidebarLeft/anime/BooruImage.qml b/.config/quickshell/ii/modules/sidebarLeft/anime/BooruImage.qml index a260dec5b..9ead31167 100644 --- a/.config/quickshell/ii/modules/sidebarLeft/anime/BooruImage.qml +++ b/.config/quickshell/ii/modules/sidebarLeft/anime/BooruImage.qml @@ -165,7 +165,7 @@ Button { id: sourceButton visible: root.imageData.source && root.imageData.source.length > 0 Layout.fillWidth: true - buttonText: StringUtils.format(Translation.tr("Go to source ({0})"), StringUtils.getDomain(root.imageData.source)) + buttonText: Translation.tr("Go to source (%1)").arg(StringUtils.getDomain(root.imageData.source)) enabled: root.imageData.source && root.imageData.source.length > 0 onClicked: { root.showActions = false diff --git a/.config/quickshell/ii/modules/sidebarLeft/anime/BooruResponse.qml b/.config/quickshell/ii/modules/sidebarLeft/anime/BooruResponse.qml index 574d57e2d..3676e24ff 100644 --- a/.config/quickshell/ii/modules/sidebarLeft/anime/BooruResponse.qml +++ b/.config/quickshell/ii/modules/sidebarLeft/anime/BooruResponse.qml @@ -95,7 +95,7 @@ Rectangle { font.pixelSize: Appearance.font.pixelSize.smaller color: Appearance.colors.colOnLayer2 // text: `Page ${root.responseData.page}` - text: StringUtils.format(Translation.tr("Page {0}"), root.responseData.page) + text: Translation.tr("Page %1").arg(root.responseData.page) } } } diff --git a/.config/quickshell/ii/modules/sidebarRight/SidebarRight.qml b/.config/quickshell/ii/modules/sidebarRight/SidebarRight.qml index c73a262e4..9c9af649a 100644 --- a/.config/quickshell/ii/modules/sidebarRight/SidebarRight.qml +++ b/.config/quickshell/ii/modules/sidebarRight/SidebarRight.qml @@ -124,7 +124,7 @@ Scope { StyledText { font.pixelSize: Appearance.font.pixelSize.normal color: Appearance.colors.colOnLayer0 - text: StringUtils.format(Translation.tr("Uptime: {0}"), DateTime.uptime) + text: Translation.tr("Uptime: %1").arg(DateTime.uptime) textFormat: Text.MarkdownText } diff --git a/.config/quickshell/ii/modules/sidebarRight/quickToggles/BluetoothToggle.qml b/.config/quickshell/ii/modules/sidebarRight/quickToggles/BluetoothToggle.qml index bdbfa9596..2b35f8ce2 100644 --- a/.config/quickshell/ii/modules/sidebarRight/quickToggles/BluetoothToggle.qml +++ b/.config/quickshell/ii/modules/sidebarRight/quickToggles/BluetoothToggle.qml @@ -29,7 +29,7 @@ QuickToggleButton { } } StyledToolTip { - content: StringUtils.format(Translation.tr("{0} | Right-click to configure"), + content: Translation.tr("%1 | Right-click to configure").arg( (Bluetooth.bluetoothEnabled && Bluetooth.bluetoothDeviceName.length > 0) ? Bluetooth.bluetoothDeviceName : Translation.tr("Bluetooth")) diff --git a/.config/quickshell/ii/modules/sidebarRight/quickToggles/NetworkToggle.qml b/.config/quickshell/ii/modules/sidebarRight/quickToggles/NetworkToggle.qml index 6ed954c20..06238f72b 100644 --- a/.config/quickshell/ii/modules/sidebarRight/quickToggles/NetworkToggle.qml +++ b/.config/quickshell/ii/modules/sidebarRight/quickToggles/NetworkToggle.qml @@ -29,6 +29,6 @@ QuickToggleButton { } } StyledToolTip { - content: StringUtils.format(Translation.tr("{0} | Right-click to configure"), Network.networkName) + content: Translation.tr("%1 | Right-click to configure").arg(Network.networkName) } } diff --git a/.config/quickshell/ii/services/Ai.qml b/.config/quickshell/ii/services/Ai.qml index 93764ca8b..31724d8e3 100644 --- a/.config/quickshell/ii/services/Ai.qml +++ b/.config/quickshell/ii/services/Ai.qml @@ -185,7 +185,7 @@ Singleton { "openrouter-llama4-maverick": { "name": "Llama 4 Maverick", "icon": "ollama-symbolic", - "description": StringUtils.format(Translation.tr("Online via {0} | {1}'s model"), "OpenRouter", "Meta"), + "description": Translation.tr("Online via %1 | %2's model").arg("OpenRouter").arg("Meta"), "homepage": "https://openrouter.ai/meta-llama/llama-4-maverick:free", "endpoint": "https://openrouter.ai/api/v1/chat/completions", "model": "meta-llama/llama-4-maverick:free", @@ -197,7 +197,7 @@ Singleton { "openrouter-deepseek-r1": { "name": "DeepSeek R1", "icon": "deepseek-symbolic", - "description": StringUtils.format(Translation.tr("Online via {0} | {1}'s model"), "OpenRouter", "DeepSeek"), + "description": Translation.tr("Online via %1 | %2's model").arg("OpenRouter").arg("DeepSeek"), "homepage": "https://openrouter.ai/deepseek/deepseek-r1:free", "endpoint": "https://openrouter.ai/api/v1/chat/completions", "model": "deepseek/deepseek-r1:free", @@ -250,7 +250,7 @@ Singleton { root.models[safeModelName] = { "name": guessModelName(model), "icon": guessModelLogo(model), - "description": StringUtils.format(Translation.tr("Local Ollama model | {0}"), model), + "description": Translation.tr("Local Ollama model | %1").arg(model), "homepage": `https://ollama.com/library/${model}`, "endpoint": "http://localhost:11434/v1/chat/completions", "model": model, @@ -314,12 +314,12 @@ Singleton { onLoadedChanged: { if (!promptLoader.loaded) return; Config.options.ai.systemPrompt = promptLoader.text(); - root.addMessage(StringUtils.format("Loaded the following system prompt\n\n---\n\n{0}", Config.options.ai.systemPrompt), root.interfaceRole); + root.addMessage(Translation.tr("Loaded the following system prompt\n\n---\n\n%1").arg(Config.options.ai.systemPrompt), root.interfaceRole); } } function printPrompt() { - root.addMessage(StringUtils.format("The current system prompt is\n\n---\n\n{0}", Config.options.ai.systemPrompt), root.interfaceRole); + root.addMessage(Translation.tr("The current system prompt is\n\n---\n\n%1").arg(Config.options.ai.systemPrompt), root.interfaceRole); } function loadPrompt(filePath) { @@ -352,8 +352,8 @@ Singleton { function addApiKeyAdvice(model) { root.addMessage( - StringUtils.format(Translation.tr('To set an API key, pass it with the command\n\nTo view the key, pass "get" with the command
\n\n### For {0}:\n\n**Link**: {1}\n\n{2}'), - model.name, model.key_get_link, model.key_get_description ?? Translation.tr("No further instruction provided")), + Translation.tr('To set an API key, pass it with the command\n\nTo view the key, pass "get" with the command
\n\n### For %1:\n\n**Link**: %2\n\n%3') + .arg(model.name).arg(model.key_get_link).arg(model.key_get_description ?? Translation.tr("No further instruction provided")), Ai.interfaceRole ); } @@ -371,11 +371,14 @@ Singleton { if (model?.requires_key) KeyringStorage.fetchKeyringData(); // See if policy prevents online models if (Config.options.policies.ai === 2 && !model.endpoint.includes("localhost")) { - root.addMessage(StringUtils.format(StringUtils.format("Online models disallowed\n\nControlled by `policies.ai` config option"), model.name), root.interfaceRole); + root.addMessage( + Translation.tr("Online models disallowed for %1\n\nControlled by `policies.ai` config option").arg(model.name), + root.interfaceRole + ); return; } if (setPersistentState) Persistent.states.ai.model = modelId; - if (feedback) root.addMessage(StringUtils.format("Model set to {0}", model.name), root.interfaceRole); + if (feedback) root.addMessage(Translation.tr("Model set to %1").arg(model.name), root.interfaceRole); if (model.requires_key) { // If key not there show advice if (root.apiKeysLoaded && (!root.apiKeys[model.key_id] || root.apiKeys[model.key_id].length === 0)) { @@ -398,13 +401,13 @@ Singleton { } Persistent.states.ai.temperature = value; root.temperature = value; - root.addMessage(StringUtils.format(Translation.tr("Temperature set to {0}"), value), Ai.interfaceRole); + root.addMessage(Translation.tr("Temperature set to %1").arg(value), Ai.interfaceRole); } function setApiKey(key) { const model = models[currentModelId]; if (!model.requires_key) { - root.addMessage(StringUtils.format(Translation.tr("{0} does not require an API key"), model.name), Ai.interfaceRole); + root.addMessage(Translation.tr("%1 does not require an API key").arg(model.name), Ai.interfaceRole); return; } if (!key || key.length === 0) { @@ -413,7 +416,7 @@ Singleton { return; } KeyringStorage.setNestedField(["apiKeys", model.key_id], key.trim()); - root.addMessage(StringUtils.format(Translation.tr("API key set for {0}"), model.name, Ai.interfaceRole)); + root.addMessage(Translation.tr("API key set for %1").arg(model.name), Ai.interfaceRole); } function printApiKey() { @@ -421,17 +424,17 @@ Singleton { if (model.requires_key) { const key = root.apiKeys[model.key_id]; if (key) { - root.addMessage(StringUtils.format(Translation.tr("API key:\n\n```txt\n{0}\n```"), key), Ai.interfaceRole); + root.addMessage(Translation.tr("API key:\n\n```txt\n%1\n```").arg(key), Ai.interfaceRole); } else { - root.addMessage(StringUtils.format(Translation.tr("No API key set for {0}"), model.name), Ai.interfaceRole); + root.addMessage(Translation.tr("No API key set for %1").arg(model.name), Ai.interfaceRole); } } else { - root.addMessage(StringUtils.format(Translation.tr("{0} does not require an API key"), model.name), Ai.interfaceRole); + root.addMessage(Translation.tr("%1 does not require an API key").arg(model.name), Ai.interfaceRole); } } function printTemperature() { - root.addMessage(StringUtils.format(Translation.tr("Temperature: {0}"), root.temperature), Ai.interfaceRole); + root.addMessage(Translation.tr("Temperature: %1").arg(root.temperature), Ai.interfaceRole); } function clearMessages() { @@ -799,7 +802,7 @@ Singleton { const value = args.value; Config.setNestedValue(key, value); } - else root.addMessage(Translation.tr("Unknown function call: {0}"), "assistant"); + else root.addMessage(Translation.tr("Unknown function call: %1").arg(name), "assistant"); } function chatToJson() { diff --git a/.config/quickshell/ii/services/KeyringStorage.qml b/.config/quickshell/ii/services/KeyringStorage.qml index 8138f28bb..33cfcd3b5 100644 --- a/.config/quickshell/ii/services/KeyringStorage.qml +++ b/.config/quickshell/ii/services/KeyringStorage.qml @@ -27,7 +27,7 @@ Singleton { return arr.concat([key, root.properties[key]]); }, [] ) - property string keyringLabel: StringUtils.format(Translation.tr("{0} Safe Storage"), "illogical-impulse") + property string keyringLabel: Translation.tr("%1 Safe Storage").arg("illogical-impulse") function setNestedField(path, value) { if (!root.keyringData) root.keyringData = {}; diff --git a/.config/quickshell/translations/en_US.json b/.config/quickshell/translations/en_US.json index f1da949c9..3f4118e17 100644 --- a/.config/quickshell/translations/en_US.json +++ b/.config/quickshell/translations/en_US.json @@ -4,8 +4,6 @@ "**Pricing**: free. Data used for training.\n\n**Instructions**: Log into Google account, allow AI Studio to create Google Cloud project or whatever it asks, go back and click Get API key": "**Pricing**: free. Data used for training.\n\n**Instructions**: Log into Google account, allow AI Studio to create Google Cloud project or whatever it asks, go back and click Get API key", ". Notes for Zerochan:\n- You must enter a color\n- Set your zerochan username in `sidebar.booru.zerochan.username` config option. You [might be banned for not doing so](https://www.zerochan.net/api#:~:text=The%20request%20may%20still%20be%20completed%20successfully%20without%20this%20custom%20header%2C%20but%20your%20project%20may%20be%20banned%20for%20being%20anonymous.)!": ". Notes for Zerochan:\n- You must enter a color\n- Set your zerochan username in `sidebar.booru.zerochan.username` config option. You [might be banned for not doing so](https://www.zerochan.net/api#:~:text=The%20request%20may%20still%20be%20completed%20successfully%20without%20this%20custom%20header%2C%20but%20your%20project%20may%20be%20banned%20for%20being%20anonymous.)!", "No further instruction provided": "No further instruction provided", - "API key set for {0}": "API key set for {0}", - "API key:\n\n```txt\n{0}\n```": "API key:\n\n```txt\n{0}\n```", "Action": "Action", "Add": "Add", "Add task": "Add task", @@ -35,8 +33,6 @@ "Closes right sidebar on press": "Closes right sidebar on press", "Copy": "Copy", "Copy code": "Copy code", - "Current API endpoint: {0}\nSet it with {1}mode PROVIDER": "Current API endpoint: {0}\nSet it with {1}mode PROVIDER", - "Current model: {0}\nSet it with {1}model MODEL": "Current model: {0}\nSet it with {1}model MODEL", "Decrease brightness": "Decrease brightness", "Delete": "Delete", "Desktop": "Desktop", @@ -51,7 +47,6 @@ "For storing API keys and other sensitive information": "For storing API keys and other sensitive information", "Game mode": "Game mode", "Get the next page of results": "Get the next page of results", - "Go to source ({0})": "Go to source ({0})", "Hibernate": "Hibernate", "Hides brightness OSD on press": "Hides brightness OSD on press", "Hides volume OSD on press": "Hides volume OSD on press", @@ -66,13 +61,11 @@ "Large images | God tier quality, no NSFW.": "Large images | God tier quality, no NSFW.", "Large language models": "Large language models", "Launch": "Launch", - "Local Ollama model | {0}": "Local Ollama model | {0}", "Lock": "Lock", "Logout": "Logout", "Markdown test": "Markdown test", "Math result": "Math result", "Night Light": "Night Light", - "No API key set for {0}": "No API key set for {0}", "No audio source": "No audio source", "No media": "No media", "No notifications": "No notifications", @@ -88,7 +81,6 @@ "Opens right sidebar on press": "Opens right sidebar on press", "Opens session screen on press": "Opens session screen on press", "Output": "Output", - "Page {0}": "Page {0}", "Reboot": "Reboot", "Reboot to firmware settings": "Reboot to firmware settings", "Reload Hyprland & Quickshell": "Reload Hyprland & Quickshell", @@ -111,8 +103,6 @@ "Task Manager": "Task Manager", "Task description": "Task description", "Temperature must be between 0 and 2": "Temperature must be between 0 and 2", - "Temperature set to {0}": "Temperature set to {0}", - "Temperature: {0}": "Temperature: {0}", "The hentai one | Great quantity, a lot of NSFW, quality varies wildly": "The hentai one | Great quantity, a lot of NSFW, quality varies wildly", "The popular one | Best quantity, but quality can vary wildly": "The popular one | Best quantity, but quality can vary wildly", "Thinking": "Thinking", @@ -136,18 +126,12 @@ "Unknown Album": "Unknown Album", "Unknown Artist": "Unknown Artist", "Unknown Title": "Unknown Title", - "Unknown function call: {0}": "Unknown function call: {0}", - "Uptime: {0}": "Uptime: {0}", "View Markdown source": "View Markdown source", "Volume": "Volume", "Volume mixer": "Volume mixer", "Waifus only | Excellent quality, limited quantity": "Waifus only | Excellent quality, limited quantity", "Waiting for response...": "Waiting for response...", "Workspace": "Workspace", - "{0} Safe Storage": "{0} Safe Storage", - "{0} does not require an API key": "{0} does not require an API key", - "{0} queries pending": "{0} queries pending", - "{0} | Right-click to configure": "{0} | Right-click to configure", "Set with /mode PROVIDER": "Set with /mode PROVIDER", "Invalid API provider. Supported: \n-": "Invalid API provider. Supported: \n-", "Unknown command:": "Unknown command:", @@ -157,14 +141,10 @@ "Provider set to": "Provider set to", "Invalid model. Supported: \n```": "Invalid model. Supported: \n```", "Interrupts possibility of overview being toggled on release.": "Interrupts possibility of overview being toggled on release.", - "Enter tags, or \"{0}\" for commands": "Enter tags, or \"{0}\" for commands", "That didn't work. Tips:\n- Check your tags and NSFW settings\n- If you don't have a tag in mind, type a page number": "That didn't work. Tips:\n- Check your tags and NSFW settings\n- If you don't have a tag in mind, type a page number", "Online | Google's model\nGives up-to-date information with search.": "Online | Google's model\nGives up-to-date information with search.", - "Online via {0} | {1}'s model": "Online via {0} | {1}'s model", "Switched to search mode. Continue with the user's request.": "Switched to search mode. Continue with the user's request.", "Experimental | Online | Google's model\nCan do a little more but doesn't search quickly": "Experimental | Online | Google's model\nCan do a little more but doesn't search quickly", - "Message the model... \"{0}\" for commands": "Message the model... \"{0}\" for commands", - "To set an API key, pass it with the command\n\nTo view the key, pass \"get\" with the command
\n\n### For {0}:\n\n**Link**: {1}\n\n{2}": "To set an API key, pass it with the command\n\nTo view the key, pass \"get\" with the command
\n\n### For {0}:\n\n**Link**: {1}\n\n{2}", "Settings": "Settings", "Save chat": "Save chat", "Load chat": "Load chat", @@ -302,5 +282,29 @@ "Qt apps": "Qt apps", "Report a Bug": "Report a Bug", "Issues": "Issues", - "Drag or click a region • LMB: Copy • RMB: Edit": "Drag or click a region • LMB: Copy • RMB: Edit" + "Drag or click a region • LMB: Copy • RMB: Edit": "Drag or click a region • LMB: Copy • RMB: Edit", + "Current model: %1\nSet it with %2model MODEL": "Current model: %1\nSet it with %2model MODEL", + "Message the model... \"%1\" for commands": "Message the model... \"%1\" for commands", + "No API key set for %1": "No API key set for %1", + "Loaded the following system prompt\n\n---\n\n%1": "Loaded the following system prompt\n\n---\n\n%1", + "%1 | Right-click to configure": "%1 | Right-click to configure", + "API key set for %1": "API key set for %1", + "Online models disallowed for %1\n\nControlled by `policies.ai` config option": "Online models disallowed for %1\n\nControlled by `policies.ai` config option", + "Online via %1 | %2's model": "Online via %1 | %2's model", + "Current API endpoint: %1\nSet it with %2mode PROVIDER": "Current API endpoint: %1\nSet it with %2mode PROVIDER", + "Go to source (%1)": "Go to source (%1)", + "Temperature set to %1": "Temperature set to %1", + "To set an API key, pass it with the command\n\nTo view the key, pass \"get\" with the command
\n\n### For %1:\n\n**Link**: %2\n\n%3": "To set an API key, pass it with the command\n\nTo view the key, pass \"get\" with the command
\n\n### For %1:\n\n**Link**: %2\n\n%3", + "Enter tags, or \"%1\" for commands": "Enter tags, or \"%1\" for commands", + "%1 queries pending": "%1 queries pending", + "API key:\n\n```txt\n%1\n```": "API key:\n\n```txt\n%1\n```", + "Uptime: %1": "Uptime: %1", + "%1 Safe Storage": "%1 Safe Storage", + "%1 does not require an API key": "%1 does not require an API key", + "Temperature: %1": "Temperature: %1", + "Model set to %1": "Model set to %1", + "Page %1": "Page %1", + "Local Ollama model | %1": "Local Ollama model | %1", + "The current system prompt is\n\n---\n\n%1": "The current system prompt is\n\n---\n\n%1", + "Unknown function call: %1": "Unknown function call: %1" } \ No newline at end of file diff --git a/.config/quickshell/translations/zh_CN.json b/.config/quickshell/translations/zh_CN.json index a51b8a790..71e64d7ea 100644 --- a/.config/quickshell/translations/zh_CN.json +++ b/.config/quickshell/translations/zh_CN.json @@ -4,8 +4,8 @@ "**Pricing**: free. Data use policy varies depending on your OpenRouter account settings.\n\n**Instructions**: Log into OpenRouter account, go to Keys on the topright menu, click Create API Key": "**价格**:免费。数据使用政策取决于您的 OpenRouter 账户设置。\n\n**说明**:登录 OpenRouter 账户,在右上角菜单中选择 Keys,点击创建 API 密钥", ". Notes for Zerochan:\n- You must enter a color\n- Set your zerochan username in `sidebar.booru.zerochan.username` config option. You [might be banned for not doing so](https://www.zerochan.net/api#:~:text=The%20request%20may%20still%20be%20completed%20successfully%20without%20this%20custom%20header%2C%20but%20your%20project%20may%20be%20banned%20for%20being%20anonymous.)!": ". Notes for Zerochan:\n- You must enter a color\n- Set your zerochan username in `sidebar.booru.zerochan.username` config option. You [might be banned for not doing so](https://www.zerochan.net/api#:~:text=The%20request%20may%20still%20be%20completed%20successfully%20without%20this%20custom%20header%2C%20but%20your%20project%20may%20be%20banned%20for%20being%20anonymous.)!", "No further instruction provided": "未提供进一步说明", - "API key set for {0}": "已为 {0} 设置 API 密钥", - "API key:\n\n```txt\n{0}\n```": "API 密钥:\n\n```txt\n{0}\n```", + "API key set for %1": "已为 %1 设置 API 密钥", + "API key:\n\n```txt\n%1\n```": "API 密钥:\n\n```txt\n%1\n```", "Action": "操作", "Add": "添加", "Add task": "添加任务", @@ -35,8 +35,7 @@ "Closes right sidebar on press": "按下时关闭右侧边栏", "Copy": "复制", "Copy code": "复制代码", - "Current API endpoint: {0}\nSet it with {1}mode PROVIDER": "当前 API 端点:{0}\n使用 {1}mode PROVIDER 设置", - "Current model: {0}\nSet it with {1}model MODEL": "当前模型:{0}\n使用 {1}model MODEL 设置", + "Current API endpoint: %1\nSet it with %2mode PROVIDER": "当前 API 端点:%1\n使用 %2mode PROVIDER 设置", "Decrease brightness": "降低亮度", "Delete": "删除", "Desktop": "桌面", @@ -51,7 +50,7 @@ "For storing API keys and other sensitive information": "用于存储 API 密钥和其他敏感信息", "Game mode": "游戏模式", "Get the next page of results": "获取下一页结果", - "Go to source ({0})": "转到源 ({0})", + "Go to source (%1)": "转到源 (%1)", "Hibernate": "休眠", "Hides brightness OSD on press": "按下时隐藏亮度显示", "Hides volume OSD on press": "按下时隐藏音量显示", @@ -66,13 +65,13 @@ "Large images | God tier quality, no NSFW.": "大尺寸图片 | 顶级质量,无 NSFW", "Large language models": "大语言模型", "Launch": "启动", - "Local Ollama model | {0}": "本地 Ollama 模型 | {0}", + "Local Ollama model | %1": "本地 Ollama 模型 | %1", "Lock": "锁定", "Logout": "注销", "Markdown test": "Markdown 测试", "Math result": "数学结果", "Night Light": "护眼模式", - "No API key set for {0}": "未为 {0} 设置 API 密钥", + "No API key set for %1": "未为 %1 设置 API 密钥", "No audio source": "无音频源", "No media": "无媒体", "No notifications": "无通知", @@ -88,7 +87,7 @@ "Opens right sidebar on press": "按下时打开右侧边栏", "Opens session screen on press": "按下时打开会话屏幕", "Output": "输出", - "Page {0}": "第 {0} 页", + "Page %1": "第 %1 页", "Reboot": "重启", "Reboot to firmware settings": "重启到固件设置", "Reload Hyprland & Quickshell": "重新加载 Hyprland 和 Quickshell", @@ -111,8 +110,8 @@ "Task Manager": "任务管理器", "Task description": "任务描述", "Temperature must be between 0 and 2": "温度必须在 0 到 2 之间", - "Temperature set to {0}": "温度设置为 {0}", - "Temperature: {0}": "温度:{0}", + "Temperature set to %1": "温度设置为 %1", + "Temperature: %1": "温度:%1", "The hentai one | Great quantity, a lot of NSFW, quality varies wildly": "成人向 | 数量巨大,大量 NSFW,质量参差不齐", "The popular one | Best quantity, but quality can vary wildly": "最受欢迎 | 数量最多,但质量参差不齐", "Thinking": "思考中", @@ -136,18 +135,18 @@ "Unknown Album": "未知专辑", "Unknown Artist": "未知艺术家", "Unknown Title": "未知标题", - "Unknown function call: {0}": "未知函数调用:{0}", - "Uptime: {0}": "运行时间:{0}", + "Unknown function call: %1": "未知函数调用:%1", + "Uptime: %1": "运行时间:%1", "View Markdown source": "查看 Markdown 源码", "Volume": "音量", "Volume mixer": "音量混合器", "Waifus only | Excellent quality, limited quantity": "仅限角色 | 优秀质量,数量有限", "Waiting for response...": "等待响应...", "Workspace": "工作区", - "{0} Safe Storage": "{0} 安全存储", - "{0} does not require an API key": "{0} 不需要 API 密钥", - "{0} queries pending": "{0} 个查询等待中", - "{0} | Right-click to configure": "{0} | 右键点击进行配置", + "%1 Safe Storage": "%1 安全存储", + "%1 does not require an API key": "%1 不需要 API 密钥", + "%1 queries pending": "%1 个查询等待中", + "%1 | Right-click to configure": "%1 | 右键点击进行配置", "Set with /mode PROVIDER": "使用 /mode PROVIDER 设置", "Invalid API provider. Supported: \n-": "无效的 API 提供商。支持的:\n-", "Unknown command:": "未知命令:", @@ -158,11 +157,10 @@ "Invalid model. Supported: \n```": "无效模型。支持的:\n```", "Interrupts possibility of overview being toggled on release.": "中断松开时切换概览的可能性。", "Switched to search mode. Continue with the user's request.": "已切换到搜索模式。继续处理用户请求。", - "Message the model... \"{0}\" for commands": "与模型对话... \"{0}\" 查看命令", "Experimental | Online | Google's model\nCan do a little more but doesn't search quickly": "实验性 | 在线 | Google 模型\n功能更多但搜索速度较慢", - "To set an API key, pass it with the command\n\nTo view the key, pass \"get\" with the command
\n\n### For {0}:\n\n**Link**: {1}\n\n{2}": "要设置 API 密钥,请将其与命令一起传递\n\n要查看密钥,请将 \"get\" 与命令一起传递
\n\n### 对于 {0}:\n\n**链接**:{1}\n\n{2}", - "Enter tags, or \"{0}\" for commands": "输入标签,或 \"{0}\" 查看命令", - "Online via {0} | {1}'s model": "通过 {0} 在线 | {1} 的模型", + "To set an API key, pass it with the command\n\nTo view the key, pass \"get\" with the command
\n\n### For %1:\n\n**Link**: %2\n\n%3": "要设置 API 密钥,请将其与命令一起传递\n\n要查看密钥,请将 \"get\" 与命令一起传递
\n\n### 对于 %1:\n\n**链接**:%2\n\n%3", + "Enter tags, or \"%1\" for commands": "输入标签,或 \"%1\" 查看命令", + "Online via %1 | %2's model": "通过 %1 在线 | %2 的模型", "That didn't work. Tips:\n- Check your tags and NSFW settings\n- If you don't have a tag in mind, type a page number": "没有找到结果。提示:\n- 检查您的标签和 NSFW 设置\n- 如果没有想到标签,请输入页码", "Online | Google's model\nGives up-to-date information with search.": "在线 | Google 模型\n通过搜索提供最新信息。", "Settings": "设置", @@ -302,5 +300,11 @@ "Qt apps": "Qt 应用", "Report a Bug": "报告问题", "Issues": "问题追踪", - "Drag or click a region • LMB: Copy • RMB: Edit": "拖动或点击一个区域 • 鼠标左键:复制 • 鼠标右键:编辑" + "Drag or click a region • LMB: Copy • RMB: Edit": "拖动或点击一个区域 • 鼠标左键:复制 • 鼠标右键:编辑", + "Current model: %1\nSet it with %2model MODEL": "当前模型:%1\n使用 %2model MODEL 设置", + "Message the model... \"%1\" for commands": "与模型对话... \"%1\" 查看命令", + "The current system prompt is\n\n---\n\n%1": "The current system prompt is\n\n---\n\n%1", + "Model set to %1": "Model set to %1", + "Online models disallowed for %1\n\nControlled by `policies.ai` config option": "Online models disallowed for %1\n\nControlled by `policies.ai` config option", + "Loaded the following system prompt\n\n---\n\n%1": "Loaded the following system prompt\n\n---\n\n%1" } \ No newline at end of file