From 2ad60a40a8bebe75ae063ef721cb50ee9e431e98 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E6=9C=88=E6=9C=88?= <3600911665@qq.com>
Date: Wed, 16 Jul 2025 21:11:27 +0800
Subject: [PATCH] i18n: Refactor string formatting to use arg() method for
translations
---
.../ii/modules/sidebarLeft/AiChat.qml | 7 +--
.../ii/modules/sidebarLeft/Anime.qml | 9 ++--
.../modules/sidebarLeft/anime/BooruImage.qml | 2 +-
.../sidebarLeft/anime/BooruResponse.qml | 2 +-
.../ii/modules/sidebarRight/SidebarRight.qml | 2 +-
.../quickToggles/BluetoothToggle.qml | 2 +-
.../quickToggles/NetworkToggle.qml | 2 +-
.config/quickshell/ii/services/Ai.qml | 37 ++++++++-------
.../quickshell/ii/services/KeyringStorage.qml | 2 +-
.config/quickshell/translations/en_US.json | 46 ++++++++++---------
.config/quickshell/translations/zh_CN.json | 46 ++++++++++---------
11 files changed, 85 insertions(+), 72 deletions(-)
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