Merge upstream/main into doom-lite-expression-sync-v2

This commit is contained in:
Tremendoussly
2026-04-14 16:21:07 +02:00
38 changed files with 1922 additions and 477 deletions
+184 -1
View File
@@ -1,8 +1,10 @@
{
"settings.language.label": "Language",
"settings.language.option.en": "English",
"settings.language.option.zh-cn": "简体中文",
"settings.language.option.zh-tw": "繁體中文",
"settings.language.option.ru": "Русский",
"settings.language.option.fr": "Français",
"settings.extensionEnabled": "Enable RPG Companion",
"settings.note": "Toggle to enable/disable the RPG Companion extension. Configure additional settings within the panel itself.",
"template.settingsTitle": "RPG Companion Settings",
@@ -81,6 +83,12 @@
"template.settingsModal.display.showStartEncounterNote": "Display button to initiate interactive combat encounters.",
"template.settingsModal.display.showDiceDisplay": "Show Dice Roll Display",
"template.settingsModal.display.showDiceDisplayNote": "Display the \"Last Roll\" indicator in the panel.",
"template.settingsModal.display.showCYOAToggle": "Show CYOA",
"template.settingsModal.display.showCYOAToggleNote": "Display a toggle button to enable/disable \"Choose Your Own Adventure\" formatting instruction that makes the model produce five possible actions/dialogues for you to choose from at the end of the output.",
"template.settingsModal.display.weatherPosition.background": "Show in Background",
"template.settingsModal.display.weatherPosition.backgroundNote": "Display weather effects behind the chat (standard behavior).",
"template.settingsModal.display.weatherPosition.foreground": "Show in Foreground",
"template.settingsModal.display.weatherPosition.foregroundNote": "Display weather effects in front of the chat (experimental).",
"template.mainPanel.autoAvatars": "Auto Avatars",
"template.settingsModal.advancedTitle": "Advanced",
"template.settingsModal.advanced.encounterHistoryDepth": "Chat History Depth For Encounters:",
@@ -176,6 +184,7 @@
"template.mainPanel.coloredDialogues": "Colored Dialogues",
"template.mainPanel.deceptionSystem": "Deception System",
"template.mainPanel.omniscienceFilter": "Omniscience Filter",
"template.mainPanel.cyoa": "CYOA",
"template.mainPanel.spotifyMusic": "Spotify Music",
"template.mainPanel.snowflakesEffect": "Snowflakes Effect",
"template.mainPanel.dynamicWeatherEffects": "Dynamic Weather",
@@ -194,6 +203,12 @@
"global.inventory": "Inventory",
"global.quests": "Quests",
"global.info": "Info",
"global.removeItem": "Remove item",
"global.clickToEdit": "Click to edit",
"global.collapseExpandPanel": "Collapse/Expand Panel",
"global.refreshRpgInfo": "Refresh RPG Info",
"global.showHideApiKey": "Show/Hide API Key",
"global.closeDialog": "Close dialog",
"infobox.noData.title": "No data yet",
"infobox.noData.instruction": "Generate a new response in the roleplay or switch to \"Separate Generation\" in Settings to access and click the \"Refresh RPG Info\" button",
"infobox.recentEvents.title": "Recent Events",
@@ -226,6 +241,13 @@
"inventory.assets.addAssetButton": "Add Asset",
"inventory.assets.addAssetPlaceholder": "Enter asset name...",
"inventory.assets.description": "Assets include vehicles (cars, motorcycles), property (homes, apartments), and major equipment (workshop tools, special items).",
"inventory.onPerson.addItemTitle": "Add new item",
"inventory.clothing.addItemTitle": "Add new clothing item",
"inventory.stored.addLocationTitle": "Add new storage location",
"inventory.stored.addItemToLocationTitle": "Add item to this location",
"inventory.stored.removeLocationTitle": "Remove this storage location",
"inventory.assets.addItemTitle": "Add new asset",
"inventory.assets.removeAssetTitle": "Remove asset",
"quests.section.main": "Main Quest",
"quests.section.optional": "Optional Quests",
"quests.main.title": "Main Quests",
@@ -238,6 +260,8 @@
"quests.optional.addQuestPlaceholder": "Enter optional quest title...",
"quests.optional.empty": "No active optional quests",
"quests.optional.hint": "Optional quests are side objectives that complement your main story.",
"quests.editQuestTitle": "Edit quest",
"quests.removeQuestTitle": "Complete/Remove quest",
"checkpoint.setChapterStart": "Set Chapter Start",
"checkpoint.clearChapterStart": "Clear Chapter Start",
"checkpoint.indicator": "Chapter Start",
@@ -253,6 +277,7 @@
"thoughts.clickToEdit": "Click to edit",
"thoughts.clickToUpload": "Click to upload avatar",
"thoughts.removeCharacter": "Remove character",
"thoughts.empty": "No character data generated yet",
"userStats.level": "LVL",
"userStats.clickToEditLevel": "Click to edit level",
"userStats.statsLocked": "Locked - AI cannot change stats",
@@ -265,6 +290,7 @@
"userStats.skillsLocked": "Locked - AI cannot change skills",
"userStats.skillsUnlocked": "Unlocked - AI can change skills",
"userStats.clickToEditSkills": "Click to edit skills",
"userStats.empty": "No statuses generated yet",
"infoBox.clickToEdit": "Click to edit",
"infoBox.locked": "Locked - AI cannot change this",
"infoBox.unlocked": "Unlocked - AI can change this",
@@ -280,5 +306,162 @@
"stats.con": "CON",
"stats.int": "INT",
"stats.wis": "WIS",
"stats.cha": "CHA"
"stats.cha": "CHA",
"stats.displayMode": "Display Mode:",
"stats.displayMode.percentage": "Percentage",
"stats.displayMode.number": "Number",
"dice.title": "Roll Dice",
"dice.numberOfDice": "Number of Dice:",
"dice.diceType": "Dice Type:",
"dice.rolling": "Rolling...",
"dice.result": "Result:",
"dice.saveRoll": "Save Roll",
"preset.createNewPresetTitle": "Create New Preset",
"preset.deleteCurrentPresetTitle": "Delete Current Preset",
"preset.setDefaultPresetTitle": "Set as Default Preset",
"preset.defaultPresetDescription": "This is the default preset",
"preset.label": "Preset:",
"preset.useThisPresetFor": "Use this preset for: ",
"stats.showLevel": "Show Level",
"dateFormat.weekdayMonthYear": "Weekday, Month, Year",
"dateFormat.dayNumericalMonthYear": "Day (Numerical), Month, Year",
"historyPersistence.tabTitle": "History Persistence",
"historyPersistence.settingsTitle": "History Persistence Settings",
"historyPersistence.enable": "Enable History Persistence",
"template.trackerEditorModal.tabs.historyPersistence": "History Persistence",
"historyPersistence.hint": "Inject selected tracker data into historical messages to help the AI maintain continuity for time-sensitive events, weather changes, and location tracking.",
"historyPersistence.sendAllEnabledStats": "Send All Enabled Stats on Refresh",
"historyPersistence.sendAllEnabledStatsHint": "When enabled, Refresh RPG Info will include all enabled stats from the preset in history context, ignoring the individual selections below.",
"historyPersistence.numberOfMessages": "Number of messages to include (0 = all available):",
"historyPersistence.injectionPosition": "Injection Position:",
"historyPersistence.injectionPosition.userMessageEnd": "End of the User's Message",
"historyPersistence.injectionPosition.assistantMessageEnd": "End of the Assistant's Message",
"historyPersistence.customContextPreamble": "Custom Context Preamble:",
"historyPersistence.customContextPreamblePlaceholder": "Context for that moment:",
"historyPersistence.userStatsSection": "User Stats",
"historyPersistence.userStatsHint": "Select which stats should be included in historical messages.",
"historyPersistence.statusSection": "Status (Mood/Conditions)",
"historyPersistence.inventory": "Inventory",
"historyPersistence.quests": "Quests",
"historyPersistence.infoBoxSection": "Info Box",
"historyPersistence.infoBoxHint": "Select which info box fields should be included in historical messages. These are recommended for time tracking.",
"historyPersistence.presentCharactersSection": "Present Characters",
"historyPersistence.presentCharactersHint": "Select which character fields should be included in historical messages.",
"historyPersistence.widget.date": "Date",
"historyPersistence.widget.weather": "Weather",
"historyPersistence.widget.temperature": "Temperature",
"historyPersistence.widget.time": "Time",
"historyPersistence.widget.location": "Location",
"historyPersistence.widget.recentEvents": "Recent Events",
"historyPersistence.thoughts": "Thoughts",
"historyPersistence.skills": "Skills",
"template.promptsEditor.button": "Customize Prompts",
"template.promptsEditor.buttonNote": "Edit all AI prompts used for generation, plot progression, and combat encounters.",
"template.promptsEditor.title": "Customize Prompts",
"template.promptsEditor.description": "Customize the AI prompts used throughout the extension. Leave fields empty to use defaults.",
"template.promptsEditor.restoreDefault": "Restore Default",
"template.promptsEditor.htmlPrompt.title": "HTML Prompt",
"template.promptsEditor.htmlPrompt.note": "Injected when \"Enable Immersive HTML\" is enabled. Affects all generation modes.",
"template.promptsEditor.dialogueColoringPrompt.title": "Dialogue Coloring Prompt",
"template.promptsEditor.dialogueColoringPrompt.note": "Injected when \"Enable Colored Dialogues\" is enabled. Affects all generation modes.",
"template.promptsEditor.deceptionPrompt.title": "Deception System Prompt",
"template.promptsEditor.deceptionPrompt.note": "Injected when \"Enable Deception System\" is enabled. Instructs AI to mark lies and deceptions with hidden tags.",
"template.promptsEditor.omnisciencePrompt.title": "Omniscience Filter Prompt",
"template.promptsEditor.omnisciencePrompt.note": "Injected when \"Enable Omniscience Filter\" is enabled. Instructs AI to separate information the player character cannot perceive into hidden <ofilter> tags.",
"template.promptsEditor.cyoaPrompt.title": "CYOA Prompt",
"template.promptsEditor.cyoaPrompt.note": "Injected when \"Enable CYOA\" is enabled. Instructs AI to end responses with numbered action choices. Uses very high priority (depth 102) to ensure it's the last instruction.",
"template.promptsEditor.spotifyPrompt.title": "Spotify Music Prompt",
"template.promptsEditor.spotifyPrompt.note": "Injected when \"Enable Spotify Music\" is enabled. Asks AI to suggest appropriate music for the scene.",
"template.promptsEditor.narratorPrompt.title": "Narrator Mode Prompt",
"template.promptsEditor.narratorPrompt.note": "Injected when \"Narrator Mode\" is enabled. Instructs AI to infer characters from context.",
"template.promptsEditor.contextPrompt.title": "Context Instructions Prompt",
"template.promptsEditor.contextPrompt.note": "Injected in Separate/External mode after the context summary. Tells the AI how to use the context.",
"template.promptsEditor.randomPlotPrompt.title": "Random Plot Progression Prompt",
"template.promptsEditor.randomPlotPrompt.note": "Injected when the \"Randomized Plot\" button is clicked. Introduces random elements to the story.",
"template.promptsEditor.naturalPlotPrompt.title": "Natural Plot Progression Prompt",
"template.promptsEditor.naturalPlotPrompt.note": "Injected when the \"Natural Plot\" button is clicked. Progresses the story naturally.",
"template.promptsEditor.avatarPrompt.title": "Avatar Generation Instruction",
"template.promptsEditor.avatarPrompt.note": "Instructions for LLM when generating avatar image prompts. Used by Auto-generate Missing Avatars feature.",
"template.promptsEditor.trackerPrompt.title": "Tracker Instructions",
"template.promptsEditor.trackerPrompt.note": "Instruction portion only (format specification is hardcoded). {userName} will be replaced with the user's name.",
"template.promptsEditor.trackerContinuationPrompt.title": "Tracker Continuation Instruction",
"template.promptsEditor.trackerContinuationPrompt.note": "Instructions added after tracker format specifications, telling the AI how to continue the narrative.",
"template.promptsEditor.combatPrompt.title": "Combat Narrative Style Instruction",
"template.promptsEditor.combatPrompt.note": "Writing style instructions for combat encounters. Includes prose quality guidelines and anti-repetition rules. {userName} will be replaced with the user's name.",
"template.settingsModal.mobileFabTitle": "Mobile Button Widgets",
"template.settingsModal.mobileFabNote": "Show compact info widgets around the floating button on mobile. Widgets are positioned automatically.",
"template.settingsModal.mobileFab.enabled": "Enable Floating Mobile Widgets",
"template.settingsModal.mobileFab.enabledNote": "Master toggle to show info widgets around the mobile floating button.",
"template.settingsModal.mobileFab.weatherIcon": "Weather Icon",
"template.settingsModal.mobileFab.weatherDesc": "Weather Description",
"template.settingsModal.mobileFab.clock": "Time/Clock",
"template.settingsModal.mobileFab.date": "Date",
"template.settingsModal.mobileFab.location": "Location",
"template.settingsModal.mobileFab.stats": "Stats (Health, Energy, etc.)",
"template.settingsModal.mobileFab.attributes": "RPG Attributes (STR, DEX, etc.)",
"template.settingsModal.desktopStripTitle": "Desktop Collapsed Strip Widgets",
"template.settingsModal.desktopStripNote": "Show compact info widgets in the collapsed panel strip on desktop. Displays stats vertically without needing to expand the panel.",
"template.settingsModal.desktopStrip.enabled": "Enable Strip Widgets",
"template.settingsModal.desktopStrip.enabledNote": "Shows widgets in the collapsed panel strip for quick access to stats.",
"template.settingsModal.desktopStrip.weatherIcon": "Weather Icon",
"template.settingsModal.desktopStrip.clock": "Time/Clock",
"template.settingsModal.desktopStrip.date": "Date",
"template.settingsModal.desktopStrip.location": "Location",
"template.settingsModal.desktopStrip.stats": "Stats (Health, Energy, etc.)",
"template.settingsModal.desktopStrip.attributes": "RPG Attributes (STR, DEX, etc.)",
"plotProgression.buttons.randomizedPlot": "Randomized Plot",
"plotProgression.buttons.naturalPlot": "Natural Plot",
"plotProgression.buttons.enterEncounter": "Enter Encounter",
"plotProgression.tooltips.randomizedPlot": "Generate a random plot twist or event",
"plotProgression.tooltips.naturalPlot": "Continue the story naturally without twists",
"plotProgression.tooltips.enterEncounter": "Enter combat encounter",
"encounter.configModal.title": "Configure Combat Narrative",
"encounter.configModal.combatNarrativeStyle": "Combat Narrative Style",
"encounter.configModal.combatSummaryStyle": "Combat Summary Style",
"encounter.configModal.labels.tense": "Tense:",
"encounter.configModal.labels.person": "Person:",
"encounter.configModal.labels.narration": "Narration:",
"encounter.configModal.labels.pointOfView": "Point of View:",
"encounter.configModal.options.present": "Present",
"encounter.configModal.options.past": "Past",
"encounter.configModal.options.firstPerson": "First Person",
"encounter.configModal.options.secondPerson": "Second Person",
"encounter.configModal.options.thirdPerson": "Third Person",
"encounter.configModal.options.omniscient": "Omniscient",
"encounter.configModal.options.limited": "Limited",
"encounter.configModal.placeholders.narrator": "narrator",
"encounter.configModal.rememberSettings": "Remember these settings for future encounters",
"encounter.configModal.buttons.proceed": "Proceed",
"encounter.ui.concludeEncounterTitle": "Conclude encounter early",
"encounter.ui.closeTitle": "Close (ends combat)",
"encounter.ui.initializingCombat": "Initializing combat...",
"encounter.ui.combatBegins": "Combat begins!",
"encounter.ui.allEnemies": "All Enemies",
"encounter.ui.areaOfEffect": "Area of Effect",
"encounter.ui.youHaveBeenDefeated": "You have been defeated...",
"encounter.ui.attacks": "Attacks",
"encounter.ui.items": "Items",
"encounter.ui.customAction": "Custom Action",
"encounter.ui.customActionPlaceholder": "Describe what you want to do...",
"encounter.ui.generatingCombatSummary": "Generating combat summary...",
"encounter.ui.pleaseWait": "Please wait...",
"encounter.ui.failedToCreateSummary": "Failed to create summary. You can close this window.",
"encounter.ui.wrongFormatDetected": "Wrong Format Detected",
"encounter.ui.concludeEncounterButton": "Conclude Encounter",
"encounter.ui.combatEncounterTitle": "Combat Encounter",
"encounter.ui.errorGeneratingCombatSummary": "Error generating combat summary.",
"encounter.ui.closeCombatWindow": "Close Combat Window",
"encounter.ui.combatLog": "Combat Log",
"encounter.ui.selectTarget": "Select Target",
"encounter.ui.submit": "Submit",
"encounter.ui.regenerate": "Regenerate",
"encounter.ui.or": "OR",
"global.locked": "Locked",
"global.unlocked": "Unlocked",
"global.confirm": "Confirm",
"inventory.addItemPlaceholder": "Enter item name...",
"inventory.stored.removeLocationConfirm": "Remove \"{location}\"? This will delete all items stored there.",
"userStats.clickToEdit": "Click to edit",
"quests.main.addQuestTitle": "Add main quests",
"quests.optional.addQuestTitle": "Add optional quest"
}
+1
View File
@@ -1,6 +1,7 @@
{
"settings.language.label": "Langue",
"settings.language.option.en": "English",
"settings.language.option.zh-cn": "简体中文",
"settings.language.option.zh-tw": "繁體中文",
"settings.language.option.ru": "Русский",
"settings.language.option.fr": "Français",
+1
View File
@@ -1,6 +1,7 @@
{
"settings.language.label": "Язык",
"settings.language.option.en": "English",
"settings.language.option.zh-cn": "简体中文",
"settings.language.option.zh-tw": "繁體中文",
"settings.language.option.ru": "Русский",
"settings.extensionEnabled": "Включить RPG Companion",
+264
View File
@@ -0,0 +1,264 @@
const fs = require('fs-extra');
const path = require('path');
const chokidar = require('chokidar');
const glob = require('glob');
const COMPILED_DIR = __dirname // path.join(__dirname, 'compiled');
function findUnlocalizedText() {
const srcArg = process.argv.find(arg => arg.startsWith('--src='));
const srcDir = srcArg ? srcArg.split('=')[1] : '.';
console.log(`\n🔎 Scanning for unlocalized text in ${srcDir}...`);
const files = glob.sync(`${srcDir}/**/*.{html,js,jsx}`, {
ignore: ['**/node_modules/**', '**/dist/**', '**/build/**']
});
if (files.length === 0) {
console.log('⚠️ No .html/.js/.jsx files found');
return;
}
let totalFound = 0;
for (const file of files) {
const content = fs.readFileSync(file, 'utf8');
const lines = content.split('\n');
const relPath = path.relative(process.cwd(), file);
// Searching for string number
lines.forEach((line, index) => {
let match;
const localPattern = /<([a-zA-Z][a-zA-Z0-9]*)(?:\s(?:[^>](?!data-i18n-key))*)?>([\p{L}\p{N}\s\-.,!?:'"()]+)<\/\1>/gu;
while ((match = localPattern.exec(line)) !== null) {
const text = match[2].trim();
if (!text) continue;
// Passing JSX expressions like {someVar}
if (text.includes('{') || text.includes('}')) continue;
// Passing if tag has data-i18n-key
if (match[0].includes('data-i18n-key')) continue;
console.log(` - ${relPath}:${index + 1} — <${match[1]}> "${text}"`);
totalFound++;
}
});
}
if (totalFound === 0) {
console.log('✅ No unlocalized text found!');
} else {
console.log(`\n📋 Found ${totalFound} potentially unlocalized text node(s)`);
}
}
// Function to validate translations
function validateTranslations() {
console.log('🔍 Validating translation files...');
// Parse --locales=en,fr argument
const localesArg = process.argv.find(arg => arg.startsWith('--locales='));
const selectedLocales = localesArg
? localesArg.split('=')[1].split(',').map(l => l.trim())
: null;
const files = fs.readdirSync(COMPILED_DIR)
.filter(file => file.endsWith('.json'))
.filter(file => {
const locale = path.basename(file, '.json');
return !selectedLocales || selectedLocales.includes(locale);
});
if (files.length === 0) {
console.log('⚠️ No compiled translation files found');
return;
}
// Load all translation data
const translations = {};
for (const file of files) {
const locale = path.basename(file, '.json');
const filePath = path.join(COMPILED_DIR, file);
translations[locale] = fs.readJsonSync(filePath);
}
// Get all locales
const locales = Object.keys(translations);
console.log(`📁 Found ${locales.length} locales: ${locales.join(', ')}`);
if (locales.length < 2) {
console.log('⚠️ Need at least 2 locales to compare');
return;
}
// Choose the first locale as reference
const referenceLocale = locales[0];
console.log(`🔑 Using ${referenceLocale} as reference locale`);
// Get all keys from reference locale
const referenceKeys = Object.keys(translations[referenceLocale]);
console.log(`🔢 Reference locale has ${referenceKeys.size} unique keys`);
// Track statistics
const stats = {
missingKeys: {},
extraKeys: {},
typeErrors: {}
};
// Initialize stats for each locale
for (const locale of locales) {
if (locale !== referenceLocale) {
stats.missingKeys[locale] = [];
stats.extraKeys[locale] = [];
stats.typeErrors[locale] = [];
}
}
// Check each locale against the reference
for (const locale of locales) {
if (locale === referenceLocale) continue;
const localeKeys = Object.keys(translations[locale]);
// Check for missing keys
for (const key of referenceKeys) {
if (!key in translations[locale]) {
stats.missingKeys[locale].push(key);
} else {
// Check for type mismatches
const refValue = translations[referenceLocale][key];
const localeValue = translations[locale][key];
if (typeof refValue !== typeof localeValue) {
stats.typeErrors[locale].push({
key,
refType: typeof refValue,
localeType: typeof localeValue
});
}
}
}
// Check for extra keys
for (const key of localeKeys) {
if (!key in translations[referenceLocale]) {
stats.extraKeys[locale].push(key);
}
}
}
// Print results
let hasIssues = false;
// Print missing keys
for (const locale in stats.missingKeys) {
const missing = stats.missingKeys[locale];
if (missing.length > 0) {
hasIssues = true;
console.log(`${locale} is missing ${missing.length} keys:`);
missing.forEach(key => {
console.log(` - ${key}`);
});
}
}
// Print extra keys
for (const locale in stats.extraKeys) {
const extra = stats.extraKeys[locale];
if (extra.length > 0) {
hasIssues = true;
console.log(`⚠️ ${locale} has ${extra.length} extra keys:`);
extra.forEach(key => {
console.log(` - ${key}`);
});
}
}
// Print type errors
for (const locale in stats.typeErrors) {
const typeErrors = stats.typeErrors[locale];
if (typeErrors.length > 0) {
hasIssues = true;
console.log(`⚠️ ${locale} has ${typeErrors.length} type mismatches:`);
typeErrors.forEach(err => {
console.log(` - ${err.key}: expected ${err.refType}, got ${err.localeType}`);
});
}
}
// Print empty values check if needed
console.log('\n📊 Checking for empty values...');
for (const locale of locales) {
checkEmptyValues(translations[locale], locale);
}
if (!hasIssues) {
console.log('✅ All locales have consistent structure!');
}
return hasIssues;
}
// Function to check for empty values
function checkEmptyValues(obj, locale, prefix = '') {
for (const key in obj) {
const fullKey = prefix ? `${prefix}.${key}` : key;
const value = obj[key];
if (value === '') {
console.log(`⚠️ ${locale} has empty string at ${fullKey}`);
} else if (value === null) {
console.log(`⚠️ ${locale} has null value at ${fullKey}`);
} else if (typeof value === 'object' && !Array.isArray(value)) {
checkEmptyValues(value, locale, fullKey);
}
}
}
// Main function
function main() {
// Create compiled directory if it doesn't exist
fs.ensureDirSync(COMPILED_DIR);
// Run validation
validateTranslations();
// Find unlocalized text
findUnlocalizedText();
}
// Watch mode
if (process.argv.includes('--watch')) {
console.log('👀 Watching for changes...');
let debounceTimer;
const debounceDelay = 100;
// Initial validation
clearTimeout(debounceTimer);
debounceTimer = setTimeout(() => {
main();
}, debounceDelay);
// Watch for changes in the compiled directory
chokidar.watch(COMPILED_DIR, {
ignoreInitial: true,
ignored: /.*~$/, // Игнорировать скрытые файлы
}).on('all', (event, path) => {
if (event === 'change' || event === 'add' || event === 'unlink') {
clearTimeout(debounceTimer);
debounceTimer = setTimeout(() => {
console.log(`🔁 Detected changes in ${path} (${event}), revalidating...`);
main();
}, debounceDelay);
}
});
} else {
// Run once
main();
}
+485
View File
@@ -0,0 +1,485 @@
{
"settings.language.label": "语言",
"settings.language.option.en": "English",
"settings.language.option.zh-cn": "简体中文",
"settings.language.option.zh-tw": "繁體中文",
"settings.language.option.ru": "Русский",
"settings.language.option.fr": "Français",
"settings.extensionEnabled": "启用 RPG Companion",
"settings.note": "切换以启用/禁用 RPG Companion 扩展。其他设置可在面板内配置。",
"template.settingsTitle": "RPG Companion 设置",
"template.settingsModal.themeTitle": "主题",
"template.settingsModal.themeLabel": "视觉主题:",
"template.settingsModal.themeOptions.default": "默认",
"template.settingsModal.themeOptions.sciFi": "科幻 (合成波)",
"template.settingsModal.themeOptions.fantasy": "奇幻 (古朴羊皮纸)",
"template.settingsModal.themeOptions.cyberpunk": "赛博朋克 (霓虹网格)",
"template.settingsModal.themeOptions.custom": "自定义",
"template.settingsModal.themeOptions.custom.background": "背景:",
"template.settingsModal.themeOptions.custom.accent": "强调色:",
"template.settingsModal.themeOptions.custom.text": "文字:",
"template.settingsModal.themeOptions.custom.highlight": "高亮:",
"template.settingsModal.theme.statBarLow": "状态条颜色 (低)",
"template.settingsModal.theme.statBarLowNote": "数值为 0% 时的颜色。",
"template.settingsModal.theme.statBarHigh": "状态条颜色 (高)",
"template.settingsModal.theme.statBarHighNote": "数值为 100% 时的颜色。",
"template.settingsModal.displayTitle": "显示选项",
"template.settingsModal.displayNote": "您可以在 SillyTavern 的扩展标签页中启用/禁用整个 RPG Companion 扩展。",
"template.settingsModal.display.panelPosition": "面板位置:",
"template.settingsModal.display.panelPositionOptions.right": "右侧边栏",
"template.settingsModal.display.panelPositionOptions.left": "左侧边栏",
"template.settingsModal.display.toggleAutoUpdate": "消息后自动更新",
"template.settingsModal.display.toggleAutoUpdateNote": "每条消息后自动刷新 RPG 信息。",
"template.settingsModal.display.showUserStats": "显示用户数值",
"template.settingsModal.display.showUserStatsNote": "启用用户数值,跟踪您角色的数值、心情、属性、技能等。",
"template.settingsModal.display.showInfoBox": "显示信息框",
"template.settingsModal.display.showInfoBoxNote": "显示位置、时间、天气和最近事件。",
"template.settingsModal.display.showPresentCharacters": "显示在场角色",
"template.settingsModal.display.showPresentCharactersNote": "显示角色肖像及其当前想法和状态。",
"template.settingsModal.display.narratorMode": "旁白模式",
"template.settingsModal.display.narratorModeNote": "使用角色卡作为旁白。根据上下文推断角色,而非使用固定的角色引用。",
"template.settingsModal.display.showInventory": "显示物品栏",
"template.settingsModal.display.showInventoryNote": "跟踪携带的物品、穿戴的衣物、存储的物品和资产。",
"template.settingsModal.display.showQuests": "显示任务",
"template.settingsModal.display.showQuestsNote": "管理带有目标的主要和可选任务。",
"template.settingsModal.display.showLockIcons": "显示锁定/解锁跟踪器",
"template.settingsModal.display.showLockIconsNote": "在跟踪器项目上显示锁定/解锁图标,以防止 AI 修改它们。",
"template.settingsModal.display.showThoughtsInChat": "显示想法",
"template.settingsModal.display.showThoughtsInChatNote": "将角色想法显示为其消息旁边的气泡。",
"template.settingsModal.display.alwaysShowThoughtBubble": "始终显示想法气泡",
"template.settingsModal.display.alwaysShowThoughtBubbleNote": "自动展开想法气泡,无需先点击图标",
"template.settingsModal.display.enableAnimations": "启用动画",
"template.settingsModal.display.enableAnimationsNote": "数值、内容更新和掷骰的平滑过渡。",
"template.settingsModal.display.showImmersiveHtmlToggle": "显示沉浸式 HTML",
"template.settingsModal.display.showImmersiveHtmlToggleNote": "显示一个切换按钮以启用/禁用消息中的 HTML 格式。",
"template.settingsModal.display.showDialogueColoringToggle": "显示彩色对话",
"template.settingsModal.display.showDialogueColoringToggleNote": "显示一个切换按钮以启用/禁用彩色对话格式。",
"template.settingsModal.display.showDeceptionToggle": "显示欺骗系统",
"template.settingsModal.display.showDeceptionToggleNote": "显示一个切换按钮以启用/禁用用于标记谎言和欺骗的欺骗系统。",
"template.settingsModal.display.showOmniscienceToggle": "显示全知过滤器",
"template.settingsModal.display.showOmniscienceToggleNote": "显示一个切换按钮以启用/禁用用于过滤隐藏事件的全知过滤器。",
"template.settingsModal.display.showSpotifyMusicToggle": "显示 Spotify 音乐",
"template.settingsModal.display.showSpotifyMusicToggleNote": "显示 Spotify 音乐播放器,带有 AI 推荐的适合场景的曲目。",
"template.settingsModal.display.showSnowflakesToggle": "显示雪花效果",
"template.settingsModal.display.showDynamicWeatherToggle": "显示动态天气效果",
"template.settingsModal.display.showDynamicWeatherToggleNote": "显示一个切换按钮以启用/禁用动画天气效果。",
"template.settingsModal.display.showNarratorMode": "显示旁白模式",
"template.settingsModal.display.showNarratorModeNote": "显示一个切换按钮以启用/禁用旁白模式(根据上下文推断角色)。",
"template.settingsModal.display.showAutoAvatars": "显示自动生成头像",
"template.settingsModal.display.showAutoAvatarsNote": "显示一个切换按钮以自动为没有图片的角色生成头像。",
"template.settingsModal.display.showRandomizedPlot": "显示随机化剧情推进",
"template.settingsModal.display.showRandomizedPlotNote": "显示用于 AI 生成的随机剧情推进提示的按钮。",
"template.settingsModal.display.showNaturalPlot": "显示自然剧情推进",
"template.settingsModal.display.showNaturalPlotNote": "显示用于上下文感知的叙事延续提示的按钮。",
"template.settingsModal.display.showStartEncounter": "显示开始遭遇",
"template.settingsModal.display.showStartEncounterNote": "显示按钮以启动交互式战斗遭遇。",
"template.settingsModal.display.showDiceDisplay": "显示掷骰显示",
"template.settingsModal.display.showDiceDisplayNote": "在面板中显示“上次掷骰”指示器。",
"template.settingsModal.display.showCYOAToggle": "显示选择冒险",
"template.settingsModal.display.showCYOAToggleNote": "显示一个切换按钮,用于启用/禁用“选择你自己的冒险”格式指令,该指令使模型在输出结束时生成五个可能的行动/对话供你选择。",
"template.settingsModal.display.weatherPosition.background": "在背景中显示",
"template.settingsModal.display.weatherPosition.backgroundNote": "在聊天背景中显示天气效果(标准行为)。",
"template.settingsModal.display.weatherPosition.foreground": "在前景中显示",
"template.settingsModal.display.weatherPosition.foregroundNote": "在聊天前景中显示天气效果(实验性)。",
"template.mainPanel.autoAvatars": "自动头像",
"template.settingsModal.advancedTitle": "高级",
"template.settingsModal.advanced.encounterHistoryDepth": "遭遇战的聊天历史深度:",
"template.settingsModal.advanced.encounterHistoryDepthNote": "包含在战斗初始化中的最近消息数量。",
"template.settingsModal.advanced.autoSaveCombatLogs": "自动保存战斗日志",
"template.settingsModal.advanced.autoSaveCombatLogsNote": "将详细战斗日志保存到文件以供将来参考和分析。",
"template.settingsModal.advanced.clearCacheNote": "清除当前活动聊天中已提交和显示的跟踪器数据。",
"template.settingsModal.advanced.generationMode": "生成模式:",
"template.settingsModal.advanced.generationModeOptions.together": "集成生成",
"template.settingsModal.advanced.generationModeOptions.separate": "单独生成",
"template.settingsModal.advanced.generationModeNote": "集成:将 RPG 跟踪添加到主要角色扮演中。单独:单独生成 RPG 数据(手动或自动)。外部:直接连接到 OpenAI 兼容端点。",
"template.settingsModal.advanced.generationModeOptions.external": "外部 API",
"template.settingsModal.advanced.externalApi.title": "外部 API 设置",
"template.settingsModal.advanced.externalApi.baseUrl": "API 基础 URL",
"template.settingsModal.advanced.externalApi.baseUrlNote": "OpenAI 兼容端点(例如 OpenAI、OpenRouter、本地 LLM 服务器)。",
"template.settingsModal.advanced.externalApi.apiKey": "API 密钥",
"template.settingsModal.advanced.externalApi.apiKeyNote": "您的外部服务 API 密钥。",
"template.settingsModal.advanced.externalApi.model": "模型",
"template.settingsModal.advanced.externalApi.modelNote": "模型标识符(例如 gpt-4o-mini、claude-3-haiku、mistral-7b)。",
"template.settingsModal.advanced.externalApi.maxTokens": "最大token数",
"template.settingsModal.advanced.externalApi.temperature": "温度",
"template.settingsModal.advanced.externalApi.testConnection": "测试连接",
"template.settingsModal.advanced.contextMessages": "上下文消息:",
"template.settingsModal.advanced.contextMessagesNote": "包含的最近消息数量。",
"template.settingsModal.advanced.useSeparatePreset": "使用连接到 RPG Companion Trackers 预设的模型",
"template.settingsModal.advanced.useSeparatePresetNote": "启用后,跟踪器生成将使用“RPG Companion Trackers”预设中的模型,而不是您的主 API 模型。预设将在生成期间自动切换并在之后恢复。在该预设中选择所需模型,并确保“将预设绑定到 API 连接”切换已打开(位于导入/导出预设按钮旁边)。",
"template.settingsModal.advanced.skipInjections": "在引导生成期间跳过注入:",
"template.settingsModal.advanced.skipInjectionsOptions.none": "从不跳过",
"template.settingsModal.advanced.skipInjectionsOptions.impersonation": "仅在模拟请求时",
"template.settingsModal.advanced.skipInjectionsOptions.guided": "始终针对引导或静默提示",
"template.settingsModal.advanced.skipInjectionsNote": "设置后,当检测到引导生成(通过 `instruct` 或 `quiet_prompt`)时,扩展将不会根据所选模式注入跟踪器提示、示例或 HTML 指令。在使用 GuidedGenerations 或类似扩展时很有用。",
"template.settingsModal.advanced.customHtmlPromptTitle": "自定义 HTML 提示:",
"template.settingsModal.advanced.restoreDefaultHtmlPrompt": "恢复默认",
"template.settingsModal.advanced.customHtmlPromptNote": "自定义启用“启用沉浸式 HTML”时注入的 HTML 提示。默认提示显示在上面 - 您可以直接编辑或完全替换。点击“恢复默认”以重置。这会影响所有生成模式(同时、单独和剧情推进)。",
"template.settingsModal.advanced.clearCache": "清除扩展缓存",
"template.settingsModal.advanced.resetFabPositions": "重置按钮位置",
"template.settingsModal.advanced.resetFabPositionsNote": "将所有浮动操作按钮(切换、刷新、调试)重置为默认的左上角位置。如果按钮在屏幕外,这很有用。",
"template.trackerEditorModal.title": "编辑跟踪器",
"template.trackerEditorModal.tabs.userStats": "用户数值",
"template.trackerEditorModal.tabs.infoBox": "信息框",
"template.trackerEditorModal.tabs.presentCharacters": "在场角色",
"template.trackerEditorModal.buttons.reset": "重置",
"template.trackerEditorModal.buttons.cancel": "取消",
"template.trackerEditorModal.buttons.save": "保存并应用",
"template.trackerEditorModal.buttons.export": "导出",
"template.trackerEditorModal.buttons.import": "导入",
"template.trackerEditorModal.messages.exportSuccess": "跟踪器预设导出成功!",
"template.trackerEditorModal.messages.exportError": "跟踪器预设导出失败。请检查控制台以获取详细信息。",
"template.trackerEditorModal.messages.importSuccess": "跟踪器预设导入成功!",
"template.trackerEditorModal.messages.importError": "跟踪器预设导入失败",
"template.trackerEditorModal.messages.importConfirm": "这将替换您当前的跟踪器配置。继续吗?",
"template.trackerEditorModal.userStatsTab.customStatsTitle": "自定义数值",
"template.trackerEditorModal.userStatsTab.addCustomStatButton": "添加自定义数值",
"template.trackerEditorModal.userStatsTab.rpgAttributesTitle": "RPG 属性",
"template.trackerEditorModal.userStatsTab.enableRpgAttributes": "启用 RPG 属性部分",
"template.trackerEditorModal.userStatsTab.alwaysIncludeAttributes": "始终在提示中包含属性",
"template.trackerEditorModal.userStatsTab.alwaysIncludeAttributesNote": "如果禁用,属性仅在掷骰活动时发送。",
"template.trackerEditorModal.userStatsTab.addAttributeButton": "添加属性",
"template.trackerEditorModal.userStatsTab.statusSectionTitle": "状态部分",
"template.trackerEditorModal.userStatsTab.enableStatusSection": "启用状态部分",
"template.trackerEditorModal.userStatsTab.showMoodEmoji": "显示心情表情",
"template.trackerEditorModal.userStatsTab.statusFieldsLabel": "状态字段(逗号分隔):",
"template.trackerEditorModal.userStatsTab.skillsSectionTitle": "技能部分",
"template.trackerEditorModal.userStatsTab.enableSkillsSection": "启用技能部分",
"template.trackerEditorModal.userStatsTab.skillsLabelLabel": "技能标签:",
"template.trackerEditorModal.userStatsTab.skillsListLabel": "技能列表(逗号分隔):",
"template.trackerEditorModal.infoBoxTab.widgetsTitle": "小部件",
"template.trackerEditorModal.infoBoxTab.dateWidget": "日期",
"template.trackerEditorModal.infoBoxTab.weatherWidget": "天气",
"template.trackerEditorModal.infoBoxTab.temperatureWidget": "温度",
"template.trackerEditorModal.infoBoxTab.timeWidget": "时间",
"template.trackerEditorModal.infoBoxTab.locationWidget": "位置",
"template.trackerEditorModal.infoBoxTab.recentEventsWidget": "最近事件",
"template.trackerEditorModal.presentCharactersTab.relationshipStatusTitle": "关系状态字段",
"template.trackerEditorModal.presentCharactersTab.enableRelationshipStatus": "启用关系状态字段",
"template.trackerEditorModal.presentCharactersTab.relationshipStatusHint": "定义关系类型,并在角色肖像上显示相应的表情符号。",
"template.trackerEditorModal.presentCharactersTab.newRelationshipButton": "新关系",
"template.trackerEditorModal.presentCharactersTab.appearanceDemeanorTitle": "外观/举止字段",
"template.trackerEditorModal.presentCharactersTab.appearanceDemeanorHint": "显示在角色名字下方的字段。",
"template.trackerEditorModal.presentCharactersTab.addCustomFieldButton": "添加自定义字段",
"template.trackerEditorModal.presentCharactersTab.thoughtsConfigTitle": "想法配置",
"template.trackerEditorModal.presentCharactersTab.enableCharacterThoughts": "启用角色想法",
"template.trackerEditorModal.presentCharactersTab.thoughtsLabelLabel": "想法标签:",
"template.trackerEditorModal.presentCharactersTab.aiInstructionLabel": "AI 指令:",
"template.trackerEditorModal.presentCharactersTab.characterStatsTitle": "角色数值",
"template.trackerEditorModal.presentCharactersTab.trackCharacterStats": "跟踪角色数值",
"template.trackerEditorModal.presentCharactersTab.characterStatsHint": "为每个角色创建要跟踪的数值(显示为彩色数字)。",
"template.trackerEditorModal.presentCharactersTab.addCharacterStatButton": "添加角色数值",
"template.mainPanel.title": "RPG Companion",
"template.mainPanel.lastRoll": "上次掷骰:",
"template.mainPanel.clearLastRoll": "清除上次掷骰",
"template.mainPanel.immersiveHtml": "沉浸式 HTML",
"template.mainPanel.coloredDialogues": "彩色对话",
"template.mainPanel.deceptionSystem": "欺骗系统",
"template.mainPanel.omniscienceFilter": "全知过滤器",
"template.mainPanel.cyoa": "选择冒险",
"template.mainPanel.spotifyMusic": "Spotify 音乐",
"template.mainPanel.snowflakesEffect": "雪花效果",
"template.mainPanel.dynamicWeatherEffects": "动态天气",
"template.mainPanel.narratorMode": "旁白模式",
"template.mainPanel.refreshRpgInfo": "刷新 RPG 信息",
"template.mainPanel.updating": "更新中...",
"template.mainPanel.editTrackersButton": "编辑跟踪器",
"template.mainPanel.settingsButton": "设置",
"global.none": "无",
"global.add": "添加",
"global.cancel": "取消",
"global.listView": "列表视图",
"global.gridView": "网格视图",
"global.save": "保存",
"global.status": "状态",
"global.inventory": "物品栏",
"global.quests": "任务",
"global.info": "信息",
"global.removeItem": "移除物品",
"global.clickToEdit": "点击编辑",
"global.collapseExpandPanel": "折叠/展开面板",
"global.refreshRpgInfo": "刷新RPG信息",
"global.showHideApiKey": "显示/隐藏API密钥",
"global.closeDialog": "关闭对话框",
"infobox.noData.title": "尚无数据",
"infobox.noData.instruction": "在角色扮演中生成新响应,或在设置中切换到“单独生成”以访问并点击“刷新 RPG 信息”按钮",
"infobox.recentEvents.title": "最近事件",
"infobox.recentEvents.addEventPlaceholder": "添加事件...",
"inventory.section.onPerson": "随身携带",
"inventory.section.clothing": "衣物",
"inventory.section.stored": "存储",
"inventory.section.assets": "资产",
"inventory.onPerson.empty": "未携带任何物品",
"inventory.onPerson.title": "当前携带的物品",
"inventory.onPerson.addItemButton": "添加物品",
"inventory.onPerson.addItemPlaceholder": "输入物品名称...",
"inventory.clothing.empty": "未穿戴任何衣物",
"inventory.clothing.title": "衣物和护甲",
"inventory.clothing.addItemButton": "添加衣物",
"inventory.clothing.addItemPlaceholder": "输入衣物物品...",
"inventory.stored.title": "存储位置",
"inventory.stored.addLocationButton": "添加位置",
"inventory.stored.addLocationPlaceholder": "输入位置名称...",
"inventory.stored.saveButton": "保存",
"inventory.stored.empty": "尚无存储位置。点击“添加位置”以创建一个。",
"inventory.stored.noItems": "此处未存储任何物品",
"inventory.stored.addItemToLocationPlaceholder": "输入物品名称...",
"inventory.stored.addItemButton": "添加物品",
"inventory.stored.confirmRemoveLocationMessage": "删除“${location}”?这将删除存储在该处的所有物品。",
"inventory.stored.confirmRemoveLocationConfirmButton": "确认",
"inventory.assets.empty": "未拥有任何资产",
"inventory.assets.title": "车辆、财产和主要所有物",
"inventory.assets.addAssetModalTitle": "添加资产",
"inventory.assets.addAssetButton": "添加资产",
"inventory.assets.addAssetPlaceholder": "输入资产名称...",
"inventory.assets.description": "资产包括车辆(汽车、摩托车)、财产(房屋、公寓)和主要设备(车间工具、特殊物品)。",
"inventory.onPerson.addItemTitle": "添加新物品",
"inventory.clothing.addItemTitle": "添加新衣物",
"inventory.stored.addLocationTitle": "添加新存储位置",
"inventory.stored.addItemToLocationTitle": "添加物品到此位置",
"inventory.stored.removeLocationTitle": "移除此存储位置",
"inventory.assets.addItemTitle": "添加新资产",
"inventory.assets.removeAssetTitle": "移除资产",
"quests.section.main": "主要任务",
"quests.section.optional": "可选任务",
"quests.main.title": "主要任务",
"quests.main.addQuestButton": "添加任务",
"quests.main.addQuestPlaceholder": "输入主要任务标题...",
"quests.main.empty": "无活跃的主要任务",
"quests.main.hint": "主要任务代表您在故事中的主要目标。",
"quests.optional.title": "可选任务",
"quests.optional.addQuestButton": "添加任务",
"quests.optional.addQuestPlaceholder": "输入可选任务标题...",
"quests.optional.empty": "无活跃的可选任务",
"quests.optional.hint": "可选任务是补充您主要故事的次要目标。",
"quests.editQuestTitle": "编辑任务",
"quests.removeQuestTitle": "完成/移除任务",
"checkpoint.setChapterStart": "设置章节开始",
"checkpoint.clearChapterStart": "清除章节开始",
"checkpoint.indicator": "章节开始",
"checkpoint.tooltip": "此点之前的消息从上下文中排除",
"musicPlayer.title": "场景音乐",
"musicPlayer.noMusic": "AI 将在适合场景时推荐音乐",
"errors.parsingError": "RPG Companion Trackers 解析错误!模型返回了错误的格式。如果问题持续存在,请考虑更换生成模型。",
"settings.recommendedModels.title": "推荐模型",
"settings.recommendedModels.description": "为使扩展正常工作,**不建议使用任何低于 20B 的模型,尤其是旧模型。** 它与 SOTA 模型(如 Deepseek、Claude、GPT 或 Gemini)配合最佳。",
"thoughts.addCharacter": "添加角色",
"thoughts.locked": "已锁定",
"thoughts.unlocked": "已解锁",
"thoughts.clickToEdit": "点击编辑",
"thoughts.clickToUpload": "点击上传头像",
"thoughts.removeCharacter": "移除角色",
"thoughts.empty": "尚无角色数据生成",
"userStats.level": "LVL",
"userStats.clickToEditLevel": "点击编辑等级",
"userStats.statsLocked": "已锁定 - AI 无法更改数值",
"userStats.statsUnlocked": "已解锁 - AI 可以更改数值",
"userStats.clickToEditStatName": "点击编辑数值名称",
"userStats.clickToEditStatValue": "点击编辑",
"userStats.moodLocked": "已锁定 - AI 无法更改心情",
"userStats.moodUnlocked": "已解锁 - AI 可以更改心情",
"userStats.clickToEditEmoji": "点击编辑表情",
"userStats.skillsLocked": "已锁定 - AI 无法更改技能",
"userStats.skillsUnlocked": "已解锁 - AI 可以更改技能",
"userStats.clickToEditSkills": "点击编辑技能",
"userStats.empty": "尚无数值生成",
"infoBox.clickToEdit": "点击编辑",
"infoBox.locked": "已锁定 - AI 无法更改此项",
"infoBox.unlocked": "已解锁 - AI 可以更改此项",
"infoBox.weatherFallback": "天气",
"infoBox.locationFallback": "位置",
"stats.health": "Health",
"stats.satiety": "Satiety",
"stats.energy": "Energy",
"stats.hygiene": "Hygiene",
"stats.arousal": "Arousal",
"stats.str": "STR",
"stats.dex": "DEX",
"stats.con": "CON",
"stats.int": "INT",
"stats.wis": "WIS",
"stats.cha": "CHA",
"stats.displayMode": "显示模式:",
"stats.displayMode.percentage": "百分比",
"stats.displayMode.number": "数值",
"dice.title": "掷骰子",
"dice.numberOfDice": "骰子数量:",
"dice.diceType": "骰子类型:",
"dice.rolling": "掷骰中...",
"dice.result": "结果:",
"dice.saveRoll": "保存掷骰",
"preset.createNewPresetTitle": "创建新预设",
"preset.deleteCurrentPresetTitle": "删除当前预设",
"preset.setDefaultPresetTitle": "设为默认预设",
"preset.defaultPresetDescription": "这是默认预设",
"preset.label": "预设:",
"preset.useThisPresetFor": "将此预设用于:",
"stats.showLevel": "显示等级",
"dateFormat.weekdayMonthYear": "星期,月份,年份",
"dateFormat.dayNumericalMonthYear": "日(数字),月份,年份",
"historyPersistence.tabTitle": "历史持久性",
"historyPersistence.settingsTitle": "历史持久性设置",
"historyPersistence.enable": "启用历史持久性",
"template.trackerEditorModal.tabs.historyPersistence": "历史持久性",
"historyPersistence.hint": "将选定的跟踪器数据注入历史消息中,帮助AI保持时间敏感事件、天气变化和位置跟踪的连续性。",
"historyPersistence.sendAllEnabledStats": "刷新时发送所有启用的数值",
"historyPersistence.sendAllEnabledStatsHint": "启用后,刷新RPG信息将在历史上下文中包含预设中的所有启用数值,忽略下面的单个选择。",
"historyPersistence.numberOfMessages": "包含的消息数量(0 = 所有可用):",
"historyPersistence.injectionPosition": "注入位置:",
"historyPersistence.injectionPosition.userMessageEnd": "用户消息末尾",
"historyPersistence.injectionPosition.assistantMessageEnd": "助手消息末尾",
"historyPersistence.customContextPreamble": "自定义上下文前言:",
"historyPersistence.customContextPreamblePlaceholder": "该时刻的上下文:",
"historyPersistence.userStatsSection": "用户数值",
"historyPersistence.userStatsHint": "选择哪些数值应包含在历史消息中。",
"historyPersistence.statusSection": "状态(心情/状况)",
"historyPersistence.inventory": "物品栏",
"historyPersistence.quests": "任务",
"historyPersistence.infoBoxSection": "信息框",
"historyPersistence.infoBoxHint": "选择哪些信息框字段应包含在历史消息中。这些字段推荐用于时间跟踪。",
"historyPersistence.presentCharactersSection": "当前角色",
"historyPersistence.presentCharactersHint": "选择哪些角色字段应包含在历史消息中。",
"historyPersistence.widget.date": "日期",
"historyPersistence.widget.weather": "天气",
"historyPersistence.widget.temperature": "温度",
"historyPersistence.widget.time": "时间",
"historyPersistence.widget.location": "位置",
"historyPersistence.widget.recentEvents": "近期事件",
"historyPersistence.thoughts": "想法",
"historyPersistence.skills": "技能",
"template.promptsEditor.button": "自定义提示",
"template.promptsEditor.buttonNote": "编辑用于生成、剧情推进和战斗遭遇的所有AI提示。",
"template.promptsEditor.title": "自定义提示",
"template.promptsEditor.description": "自定义整个扩展中使用的AI提示。留空字段以使用默认值。",
"template.promptsEditor.restoreDefault": "恢复默认",
"template.promptsEditor.htmlPrompt.title": "HTML提示",
"template.promptsEditor.htmlPrompt.note": "当“启用沉浸式HTML”启用时注入。影响所有生成模式。",
"template.promptsEditor.dialogueColoringPrompt.title": "对话着色提示",
"template.promptsEditor.dialogueColoringPrompt.note": "当“启用彩色对话”启用时注入。影响所有生成模式。",
"template.promptsEditor.deceptionPrompt.title": "欺骗系统提示",
"template.promptsEditor.deceptionPrompt.note": "当“启用欺骗系统”启用时注入。指示AI用隐藏标签标记谎言和欺骗行为。",
"template.promptsEditor.omnisciencePrompt.title": "全知过滤器提示",
"template.promptsEditor.omnisciencePrompt.note": "当“启用全知过滤器”启用时注入。指示AI将玩家角色无法感知的信息分离到隐藏的过滤器标签中。",
"template.promptsEditor.cyoaPrompt.title": "选择冒险提示",
"template.promptsEditor.cyoaPrompt.note": "当“启用选择冒险”启用时注入。指示AI在回复结尾提供带编号的动作选项。使用非常高的优先级(深度102)确保它是最后一条指令。",
"template.promptsEditor.spotifyPrompt.title": "Spotify音乐提示",
"template.promptsEditor.spotifyPrompt.note": "当“启用Spotify音乐”启用时注入。要求AI为场景推荐合适的音乐。",
"template.promptsEditor.narratorPrompt.title": "旁白模式提示",
"template.promptsEditor.narratorPrompt.note": "当“旁白模式”启用时注入。指示AI从上下文中推断角色信息。",
"template.promptsEditor.contextPrompt.title": "上下文指令提示",
"template.promptsEditor.contextPrompt.note": "在Separate/External模式中,上下文摘要后注入。告诉AI如何使用上下文。",
"template.promptsEditor.randomPlotPrompt.title": "随机剧情推进提示",
"template.promptsEditor.randomPlotPrompt.note": "当点击“随机剧情”按钮时注入。为故事引入随机元素。",
"template.promptsEditor.naturalPlotPrompt.title": "自然剧情推进提示",
"template.promptsEditor.naturalPlotPrompt.note": "当点击“自然剧情”按钮时注入。自然地推进故事发展。",
"template.promptsEditor.avatarPrompt.title": "头像生成指令",
"template.promptsEditor.avatarPrompt.note": "生成头像图像提示时给LLM的指令。用于“自动生成缺失头像”功能。",
"template.promptsEditor.trackerPrompt.title": "跟踪器指令",
"template.promptsEditor.trackerPrompt.note": "仅指令部分(格式规范已硬编码)。{userName}将被替换为用户名称。",
"template.promptsEditor.trackerContinuationPrompt.title": "跟踪器延续指令",
"template.promptsEditor.trackerContinuationPrompt.note": "在跟踪器格式规范后添加的指令,告诉AI如何继续叙事。",
"template.promptsEditor.combatPrompt.title": "战斗叙事风格指令",
"template.promptsEditor.combatPrompt.note": "战斗遭遇的写作风格指令。包括散文质量指南和防重复规则。{userName}将被替换为用户名称。",
"template.settingsModal.mobileFabTitle": "移动按钮小部件",
"template.settingsModal.mobileFabNote": "在移动设备上显示围绕浮动按钮的紧凑信息小部件。小部件自动定位。",
"template.settingsModal.mobileFab.enabled": "启用浮动移动小部件",
"template.settingsModal.mobileFab.enabledNote": "主开关,用于在移动浮动按钮周围显示信息小部件。",
"template.settingsModal.mobileFab.weatherIcon": "天气图标",
"template.settingsModal.mobileFab.weatherDesc": "天气描述",
"template.settingsModal.mobileFab.clock": "时间/时钟",
"template.settingsModal.mobileFab.date": "日期",
"template.settingsModal.mobileFab.location": "位置",
"template.settingsModal.mobileFab.stats": "数值(生命值、能量等)",
"template.settingsModal.mobileFab.attributes": "RPG属性(力量、敏捷等)",
"template.settingsModal.desktopStripTitle": "桌面折叠面板条小部件",
"template.settingsModal.desktopStripNote": "在桌面上的折叠面板条中显示紧凑信息小部件。垂直显示数值,无需展开面板。",
"template.settingsModal.desktopStrip.enabled": "启用面板条小部件",
"template.settingsModal.desktopStrip.enabledNote": "在折叠面板条中显示小部件,以便快速访问数值。",
"template.settingsModal.desktopStrip.weatherIcon": "天气图标",
"template.settingsModal.desktopStrip.clock": "时间/时钟",
"template.settingsModal.desktopStrip.date": "日期",
"template.settingsModal.desktopStrip.location": "位置",
"template.settingsModal.desktopStrip.stats": "数值(生命值、能量等)",
"template.settingsModal.desktopStrip.attributes": "RPG属性(力量、敏捷等)",
"plotProgression.buttons.randomizedPlot": "随机化剧情",
"plotProgression.buttons.naturalPlot": "自然剧情",
"plotProgression.buttons.enterEncounter": "进入遭遇战",
"plotProgression.tooltips.randomizedPlot": "生成随机剧情转折或事件",
"plotProgression.tooltips.naturalPlot": "无转折地自然延续故事",
"plotProgression.tooltips.enterEncounter": "进入战斗遭遇",
"encounter.configModal.title": "配置战斗叙事",
"encounter.configModal.combatNarrativeStyle": "战斗叙事风格",
"encounter.configModal.combatSummaryStyle": "战斗总结风格",
"encounter.configModal.labels.tense": "时态:",
"encounter.configModal.labels.person": "人称:",
"encounter.configModal.labels.narration": "叙述:",
"encounter.configModal.labels.pointOfView": "视角:",
"encounter.configModal.options.present": "现在时",
"encounter.configModal.options.past": "过去时",
"encounter.configModal.options.firstPerson": "第一人称",
"encounter.configModal.options.secondPerson": "第二人称",
"encounter.configModal.options.thirdPerson": "第三人称",
"encounter.configModal.options.omniscient": "全知视角",
"encounter.configModal.options.limited": "有限视角",
"encounter.configModal.placeholders.narrator": "叙述者",
"encounter.configModal.rememberSettings": "记住这些设置以供未来遭遇使用",
"encounter.configModal.buttons.proceed": "继续",
"encounter.ui.concludeEncounterTitle": "提前结束遭遇",
"encounter.ui.closeTitle": "关闭(结束战斗)",
"encounter.ui.initializingCombat": "正在初始化战斗...",
"encounter.ui.initializingCombatEncounter": "正在初始化战斗遭遇...",
"encounter.ui.combatBegins": "战斗开始!",
"encounter.ui.allEnemies": "所有敌人",
"encounter.ui.areaOfEffect": "范围效果",
"encounter.ui.youHaveBeenDefeated": "你已被击败...",
"encounter.ui.attacks": "攻击",
"encounter.ui.items": "物品",
"encounter.ui.customAction": "自定义动作",
"encounter.ui.customActionPlaceholder": "描述你想要做什么...",
"encounter.ui.generatingCombatSummary": "正在生成战斗总结...",
"encounter.ui.pleaseWait": "请稍候...",
"encounter.ui.failedToCreateSummary": "无法创建总结。你可以关闭此窗口。",
"encounter.ui.wrongFormatDetected": "检测到错误格式",
"encounter.ui.concludeEncounterButton": "结束遭遇",
"encounter.ui.combatEncounterTitle": "战斗遭遇",
"encounter.ui.errorGeneratingCombatSummary": "生成战斗总结时出错。",
"encounter.ui.closeCombatWindow": "关闭战斗窗口",
"encounter.ui.combatLog": "战斗日志",
"encounter.ui.selectTarget": "选择目标",
"encounter.ui.submit": "提交",
"encounter.ui.regenerate": "重新生成",
"encounter.ui.or": "或",
"encounter.ui.result.victory": "胜利",
"encounter.ui.result.defeat": "失败",
"encounter.ui.result.fled": "逃跑",
"encounter.ui.result.interrupted": "中断",
"encounter.ui.error.noResponse": "未收到AI响应。模型可能不可用。",
"encounter.ui.error.invalidJsonFormat": "检测到无效的JSON格式。AI返回了格式错误的数据。请确保最大响应长度至少设置为2048个token,否则模型可能会用完token并产生不完整的结构。",
"encounter.ui.error.failedToInitialize": "初始化战斗失败:",
"encounter.ui.error.errorProcessingAction": "处理动作时出错:",
"encounter.ui.combatSummaryAddedBy": "战斗总结已由{speakerName}添加到聊天。",
"encounter.ui.combatSummaryAdded": "战斗总结已添加到聊天。",
"encounter.ui.environment.default": "战斗竞技场",
"encounter.ui.enemiesTitle": "敌人",
"encounter.ui.partyTitle": "队伍",
"encounter.ui.hpSuffix": " HP",
"encounter.ui.playerSuffix": "(你)",
"encounter.ui.confirmConcludeEarly": "提前结束遭遇战并生成总结?",
"encounter.ui.confirmEndCombat": "确定要结束这场战斗遭遇战吗?",
"encounter.ui.enemyDefaultEmoji": "👹",
"encounter.ui.yourActions": "你的行动",
"encounter.ui.attackType.aoe": "范围效果",
"encounter.ui.attackType.both": "单体或范围",
"encounter.ui.attackType.single": "单体目标",
"encounter.ui.targetingAllEnemies": " targeting all enemies!",
"encounter.ui.on": " on ",
"encounter.ui.youPrefix": "你: ",
"global.locked": "已锁定",
"global.unlocked": "已解锁",
"global.confirm": "确认",
"inventory.addItemPlaceholder": "输入物品名称...",
"inventory.stored.removeLocationConfirm": "删除\"{location}\"?这将删除该位置存储的所有物品。",
"userStats.clickToEdit": "点击编辑",
"quests.main.addQuestTitle": "添加主线任务",
"quests.optional.addQuestTitle": "添加可选任务"
}
+2
View File
@@ -1,8 +1,10 @@
{
"settings.language.label": "語言",
"settings.language.option.en": "English",
"settings.language.option.zh-cn": "简体中文",
"settings.language.option.zh-tw": "繁體中文",
"settings.language.option.ru": "Русский",
"settings.language.option.fr": "Français",
"settings.extensionEnabled": "啟用 RPG Companion",
"settings.note": "切換開關以啟用/停用 RPG Companion。其他設定可在面板內配置。",
"template.settingsTitle": "RPG Companion 設定",