feat: add Crowdin localization support

This commit is contained in:
Gustavo Carreiro 2026-02-26 10:25:20 -03:00
parent 3c66932c13
commit 29c4bbb86b
19 changed files with 827 additions and 937 deletions

View file

@ -150,6 +150,10 @@ Contributions are welcome! If you encounter bugs or have feature requests, pleas
- **Build:** `npm run build`
- **Dev:** `npm run dev`
### 🌍 Translations
Help us make the plugin accessible to everyone! We use **[Crowdin](https://crowdin.com/project/obsidian-syncthing-manager)** to manage translations. You don't need to be a developer to contribute. Just create a free account and start translating strings to your language directly in the browser!
---
## License

7
crowdin.yml Normal file
View file

@ -0,0 +1,7 @@
project_id_env: CROWDIN_PROJECT_ID
api_token_env: CROWDIN_PERSONAL_TOKEN
preserve_hierarchy: true
files:
- source: /src/lang/locales/en.json
translation: /src/lang/locales/%two_letters_code%.json

View file

@ -8,14 +8,11 @@ Help us make **Syncthing Manager** accessible to everyone! We welcome contributi
## Translating the Plugin
The plugin uses a simple key-value system for localization. To add or update a translation:
We use **Crowdin** to manage all plugin translations. You don't need any coding experience to help!
1. Navigate to [`src/lang/locales/`](https://github.com/gustjose/obsidian-syncthing-manager/tree/main/src/lang/locales).
2. If you want to update an existing language, edit the corresponding `.ts` file (e.g., `pt.ts` for Portuguese).
3. To add a **new language**:
- Copy `en.ts` and rename it using the ISO 639-1 code (e.g., `es.ts` for Spanish).
- Update the translations inside the file.
- Register the new locale in `src/lang/lang.ts`.
1. Go to our **[Crowdin Project Page](https://crowdin.com/project/obsidian-syncthing-manager)**.
2. Choose your language from the list. If it isn't listed, you can request it on Crowdin.
3. Start translating! Your changes will automatically be synced to our GitHub repository.
## Translating Documentation

View file

@ -8,14 +8,11 @@ Ajude-nos a tornar o **Syncthing Manager** acessível a todos! Aceitamos contrib
## Traduzindo o Plugin
O plugin utiliza um sistema simples de chave-valor para localização. Para adicionar ou atualizar uma tradução:
Nós usamos o **Crowdin** para gerenciar todas as traduções do plugin. Você não precisa de nenhuma experiência com código para ajudar!
1. Navegue até [`src/lang/locales/`](https://github.com/gustjose/obsidian-syncthing-manager/tree/main/src/lang/locales).
2. Se desejar atualizar um idioma existente, edite o arquivo `.ts` correspondente (ex: `pt.ts` para Português).
3. Para adicionar um **novo idioma**:
- Copie o arquivo `en.ts` e renomeie-o usando o código ISO 639-1 (ex: `es.ts` para Espanhol).
- Atualize as traduções dentro do arquivo.
- Registre o novo local em `src/lang/lang.ts`.
1. Acesse a nossa **[Página do Projeto no Crowdin](https://crowdin.com/project/obsidian-syncthing-manager)**.
2. Escolha o seu idioma na lista. Se ele não estiver listado, você pode solicitá-lo no próprio Crowdin.
3. Comece a traduzir! Suas alterações serão sincronizadas automaticamente com nosso repositório no GitHub.
## Traduzindo a Documentação

View file

@ -15,6 +15,7 @@ export default defineConfig([
"package.json",
"package-lock.json",
"vitest.config.ts",
"src/lang/locales/*.json",
],
},
// 2. Configuração para os SCRIPTS (Node.js)

View file

@ -0,0 +1,41 @@
import fs from "fs";
import path from "path";
import { evaluateSentenceCase } from "eslint-plugin-obsidianmd/dist/lib/rules/ui/sentenceCaseUtil.js";
const enPath = path.resolve("./src/lang/locales/en.json");
const enData = JSON.parse(fs.readFileSync(enPath, "utf8"));
const options = {
brands: [
"Syncthing",
"Obsidian",
"GitHub",
"Android",
"Mac",
"Windows",
"macOS",
"Crowdin",
],
acronyms: ["OK", "API", "URL", "HTTPS", "HTTP", "TLS", "IP", "ID", "GUI"],
enforceCamelCaseLower: true,
};
let modified = false;
for (const [key, value] of Object.entries(enData)) {
if (typeof value === "string") {
const result = evaluateSentenceCase(value, options);
if (!result.ok && result.suggestion) {
enData[key] = result.suggestion;
modified = true;
console.log(`Fixing ${key}: "${value}" -> "${result.suggestion}"`);
}
}
}
if (modified) {
fs.writeFileSync(enPath, JSON.stringify(enData, null, "\t") + "\n");
console.log("Updated en.json with sentence case fixes.");
} else {
console.log("No issues found to fix.");
}

View file

@ -0,0 +1,40 @@
import { build } from "esbuild";
import fs from "fs/promises";
import url from "url";
import path from "path";
const __dirname = url.fileURLToPath(new URL(".", import.meta.url));
async function run() {
const localesDir = path.join(__dirname, "../src/lang/locales");
const files = ["en", "pt", "ru"];
for (const file of files) {
const tsPath = path.join(localesDir, `${file}.ts`);
const jsPath = path.join(localesDir, `${file}.mjs`);
const jsonPath = path.join(localesDir, `${file}.json`);
try {
await build({
entryPoints: [tsPath],
outfile: jsPath,
format: "esm",
});
const module = await import(url.pathToFileURL(jsPath).href);
const data = module.default;
await fs.writeFile(
jsonPath,
JSON.stringify(data, null, "\t") + "\n",
);
console.log(`Converted ${file}.ts to ${file}.json`);
await fs.rm(tsPath);
await fs.rm(jsPath);
} catch (e) {
console.error(`Error converting ${file}:`, e);
}
}
}
run();

View file

@ -1,11 +1,11 @@
import { moment } from "obsidian";
import en from "./locales/en";
import pt from "./locales/pt";
import ru from "./locales/ru";
import en from "./locales/en.json";
import pt from "./locales/pt.json";
import ru from "./locales/ru.json";
const locales: Record<string, Partial<typeof en>> = {
pt: pt,
ru: ru,
const locales: Record<string, Record<string, string>> = {
pt: pt as Record<string, string>,
ru: ru as Record<string, string>,
};
export const LANGUAGE_LIST = [
@ -34,8 +34,12 @@ export function t(key: TranslationKey): string {
}
const dict = locales[lang];
const defaultDict = en as Record<string, string>;
const translation = dict && dict[key] ? dict[key] : en[key];
const translation =
dict && dict[key as string]
? dict[key as string]
: defaultDict[key as string];
return translation || key;
}

200
src/lang/locales/en.json Normal file
View file

@ -0,0 +1,200 @@
{
"cmd_open_panel": "Open side panel",
"cmd_force_sync": "Force sync now",
"cmd_debug_connect": "Debug: test connection",
"cmd_copy_debug": "Copy debug info",
"ribbon_tooltip": "Open Syncthing manager",
"status_synced": "Synced",
"status_syncing": "Syncing...",
"status_error": "Error",
"status_offline": "Offline",
"status_unknown": "Unknown",
"status_paused": "Paused",
"status_config": "Pending config",
"info_last_sync": "Last sync",
"info_devices": "Online devices",
"info_folder": "Vault folder",
"info_history": "Recent activity",
"history_empty": "No recent activity",
"history_incoming": "Incoming (remote)",
"history_outgoing": "Outgoing (local)",
"btn_sync_now": "Sync now",
"btn_requesting": "Requesting...",
"tooltip_pause": "Pause sync",
"tooltip_resume": "Resume sync",
"setting_header_conn": "Connection settings",
"setting_header_folder": "Folder & files",
"setting_header_interface": "Interface options",
"setting_header_general": "General",
"setting_lang_name": "Language",
"setting_lang_desc": "Force the plugin interface to a specific language or follow Obsidian. This plugin is localized by the community. To help translate into your language, click the globe icon to join our Crowdin project.",
"tooltip_help_translate": "Help translate via Crowdin",
"setting_https_name": "Use HTTPS",
"setting_https_desc": "Important: keep this disabled for Android/mobile to work correctly. Only enable if you have configured a valid TLS certificate on your desktop.",
"setting_host_name": "IP address / host",
"setting_host_desc": "The address where Syncthing GUI is running. Use \"127.0.0.1\" for localhost.",
"setting_host_placeholder": "Localhost",
"setting_port_name": "Port",
"setting_port_desc": "Default is 8384. Check your Syncthing GUI settings if you changed it.",
"setting_api_name": "API key",
"setting_api_desc": "Copy this from Syncthing > actions > settings > general.",
"btn_test_conn": "Test connection",
"setting_api_stored_securely": "API key is stored securely in your system keychain.",
"setting_api_stored_legacy": "API key is stored locally (upgrade Obsidian for keychain support).",
"setting_api_configured": "Configured",
"setting_api_not_configured": "Not configured",
"btn_modify_secret": "Modify secret",
"setting_folder_name": "Vault folder ID",
"setting_folder_desc": "Select the Syncthing folder ID that matches this Obsidian vault to track its specific status.",
"dropdown_default": "Select a folder...",
"dropdown_none": "No folder selected",
"btn_search_folders": "Fetch folders from Syncthing",
"setting_modal_conflict_name": "Conflict detection",
"setting_modal_conflict_desc": "Enable automatic scanning for \".sync-conflict\" files. A red alert will appear in the side panel if conflicts are found.",
"setting_status_bar_name": "Show status bar item",
"setting_status_bar_desc": "Displays the connection icon and quick actions in the bottom right status bar (desktop only).",
"setting_ribbon_name": "Show ribbon icon",
"setting_ribbon_desc": "Displays the icon in the left sidebar ribbon to quickly open the controller panel.",
"setting_tab_icon_name": "Show sync status in tabs",
"setting_tab_icon_desc": "Displays a icon in the file tab when syncing.",
"setting_explorer_icon_name": "File explorer icon",
"setting_explorer_icon_desc": "Show a sync button on hover next to files in the sidebar.",
"setting_history_filter_name": "History filter",
"setting_history_filter_desc": "Files or folders to hide from the history panel (comma separated, e.g. .Obsidian, .ds_store).",
"notice_syncing": "Sync requested...",
"notice_success_conn": "Connection successful! Device ID: ",
"notice_fail_conn": "Connection failed. Please check the IP, port, and ensure HTTPS is disabled (especially on Android).",
"notice_error_auth": "Authentication failed. Please check your API key.",
"notice_offline": "Syncthing is unreachable. Is it running?",
"notice_folders_found": "Folders found.",
"notice_config_first": "Please configure the API key, URL and folder first",
"notice_searching": "Connecting to Syncthing...",
"notice_invalid_host": "Invalid host format. Please use ipv4, ipv6, localhost or a valid domain without HTTP/HTTPS.",
"notice_invalid_port": "Invalid port. Must be a number between 1 and 65535.",
"modal_conflict_title": "Resolve sync conflicts",
"modal_conflict_empty": "Great news! No conflict files found in your vault.",
"modal_conflict_desc": "The following files have conflicting versions. Compare the content and choose which one to keep.",
"btn_compare": "Compare content",
"btn_keep_original": "Keep original",
"tooltip_keep_original": "Deletes the conflict file (right side) and keeps your current local file.",
"btn_keep_conflict": "Use conflict version",
"tooltip_keep_conflict": "Overwrites your local file with the conflict version (right side).",
"btn_use_this_version": "Use this version",
"diff_instructions": "Use the arrows in the middle to transfer changes to the original file. To keep one version entirely, click 'use this version' above it.",
"btn_save_merge": "Save merge",
"diff_legend": "Original (a) ↔ conflict (b)",
"diff_original_header": "Current file (original)",
"diff_conflict_header": "Incoming conflict",
"diff_loading": "Loading file content...",
"diff_original_missing": "(original file was deleted or not found)",
"diff_read_error": "Error reading file content.",
"setting_ignore_name": "Ignored files (.stignore)",
"setting_ignore_desc": "Edit the .stignore file to prevent specific files (like workspace layouts) from syncing between devices.",
"btn_edit_ignore": "Edit .stignore",
"modal_ignore_title": "Edit .stignore",
"modal_ignore_desc": "Files or patterns listed below will be completely ignored by Syncthing.",
"header_ignore_templates": "Quick add templates:",
"btn_add_ignore": "Add",
"btn_save_ignore": "Save changes",
"notice_ignore_saved": ".stignore file saved successfully.",
"notice_ignore_exists": "This rule is already in the list.",
"ignore_help_text": "Click \"add\" to include common rules that prevent sync issues between desktop and mobile.",
"ignore_pattern_workspace_label": "Workspace config",
"ignore_pattern_workspace_desc": "Essential! Ignores open window positions and tabs (avoids visual conflicts between desktop and mobile).",
"ignore_pattern_installer_label": "Installer cache",
"ignore_pattern_installer_desc": "Ignores temporary Obsidian update files.",
"ignore_pattern_hidden_label": "Hidden files",
"ignore_pattern_hidden_desc": "Ignores system files (like .ds_store on Mac or thumbs.db on Windows).",
"notice_ignore_added": "Added: ",
"notice_ignore_error": "Error saving .stignore",
"alert_conflict_detected": "Conflict(s) detected!",
"alert_click_to_resolve": "Click here to resolve",
"explorer_sync_tooltip": "Sync this file",
"setting_header_about": "About",
"setting_version_name": "Version",
"setting_version_tooltip": "View release notes",
"setting_github_desc": "Access source code or report an issue.",
"btn_github_repo": "GitHub repo",
"btn_report_bug": "Report bug",
"modal_versions_title": "File versions",
"modal_versions_empty": "No previous versions found.",
"btn_restore": "Restore",
"notice_version_restored": "Version restored successfully.",
"notice_restore_fail": "Failed to restore version.",
"confirm_restore": "Are you sure you want to restore the version from {date}? Current content will be overwritten.",
"cmd_view_versions": "File versions",
"btn_cancel": "Cancel",
"modal_confirm_title": "Confirm action",
"modal_context_menu_title": "Context menu",
"btn_manage_context_menu": "Manage context menu items",
"setting_group_context_menu_name": "Group items",
"setting_group_context_menu_desc": "Group all Syncthing items under a single submenu.",
"header_context_menu_items": "Items",
"btn_view_version": "View content",
"cmd_sync_file": "Sync file",
"cmd_ignore_file": "Don't sync this",
"notice_ignored_success": "Added to .stignore",
"notice_ignored_error": "Failed to add to .stignore",
"setting_debug_mode_name": "Debug mode",
"setting_debug_mode_desc": "Enable verbose logging to console (dev).",
"tooltip_configure_modules": "Configure debug modules",
"modal_debug_title": "Debug configuration",
"modal_debug_desc": "Select which modules should output debug logs to the console.",
"debug_report_title": "Debug report",
"debug_report_desc": "Copy the information below and paste it in a bug report.",
"debug_report_copy": "Copy to clipboard",
"debug_report_copied": "Debug info copied!",
"debug_report_open_issue": "Open issue on GitHub",
"debug_report_no_errors": "No recent errors or warnings.",
"btn_debug_report": "Debug report",
"setting_log_level_name": "Log level",
"setting_log_level_desc": "Set the minimum severity of logs to capture.",
"log_level_off": "Off",
"log_level_error": "Error only",
"log_level_warn": "Warnings + errors",
"log_level_debug": "All (debug)",
"debug_console_title": "Debug console",
"debug_console_empty": "No logs captured yet.",
"debug_console_clear": "Clear",
"btn_open_console": "Open console",
"debug_console_filter_level": "Minimum level",
"debug_console_filter_modules": "Modules",
"modal_versioning_title": "File versioning",
"versioning_type": "Versioning strategy",
"versioning_type_desc": "Select the method used to keep previous versions of files.",
"versioning_none": "No versioning",
"versioning_trashcan": "Trash can",
"versioning_simple": "Simple file versioning",
"versioning_staggered": "Staggered file versioning",
"versioning_external": "External file versioning",
"versioning_cleanout_days": "Clean out after (days)",
"versioning_cleanout_days_desc": "The number of days to keep files in the trash can. Zero means forever.",
"versioning_keep": "Keep versions",
"versioning_keep_desc": "The number of versions to keep.",
"versioning_max_age": "Maximum age (days)",
"versioning_max_age_desc": "The maximum age of versions to keep.",
"versioning_clean_interval": "Clean interval (seconds)",
"versioning_clean_interval_desc": "The interval between running the cleanup process.",
"versioning_command": "Command",
"versioning_command_desc": "External command to execute for versioning.",
"btn_save": "Save",
"notice_versioning_saved": "Versioning configuration saved.",
"notice_versioning_error": "Failed to save versioning configuration.",
"setting_file_versioning_name": "File versioning",
"setting_file_versioning_desc": "Configure how Syncthing keeps previous versions of your files.",
"btn_configure": "Configure",
"notice_folder_missing": "Syncthing folder not found. Please reselect it in the settings.",
"notice_folder_migration": "Folder config needs update. Please reselect your vault folder in Syncthing settings.",
"notice_resuming": "Resuming sync...",
"notice_pausing": "Pausing sync...",
"notice_is_paused": "Sync is paused.",
"loading_versions": "Loading versions...",
"loading_config": "Loading configuration...",
"error_folder_not_found": "Folder not found in configuration.",
"saving": "Saving...",
"error_loading_versions": "Error loading versions. Check console.",
"tab_syncing": "Syncing...",
"tab_synced": "Synced!",
"conflict_delete_error": "Error deleting file.",
"conflict_restore_error": "Error restoring conflict."
}

View file

@ -1,296 +0,0 @@
export default {
// Commands
cmd_open_panel: "Open side panel",
cmd_force_sync: "Force sync now",
cmd_debug_connect: "Debug: test connection",
cmd_copy_debug: "Copy debug info",
// Ribbon Icon
ribbon_tooltip: "Open syncthing manager",
// Status / View
status_synced: "Synced",
status_syncing: "Syncing...",
status_error: "Error",
status_offline: "Offline",
status_unknown: "Unknown",
status_paused: "Paused",
status_config: "Pending config",
info_last_sync: "Last sync",
info_devices: "Online devices",
info_folder: "Vault folder",
info_history: "Recent activity",
history_empty: "No recent activity",
// History Directions (Tooltips for arrows)
history_incoming: "Incoming (remote)",
history_outgoing: "Outgoing (local)",
btn_sync_now: "Sync now",
btn_requesting: "Requesting...",
tooltip_pause: "Pause sync",
tooltip_resume: "Resume sync",
// Settings - Headers
setting_header_conn: "Connection settings",
setting_header_folder: "Folder & files",
setting_header_interface: "Interface options",
setting_header_general: "General",
// Settings - General
setting_lang_name: "Language",
setting_lang_desc:
"Force the plugin interface to a specific language or follow Obsidian.",
// Settings - Connection
setting_https_name: "Use HTTPS",
setting_https_desc:
"Important: keep this disabled for Android/mobile to work correctly. Only enable if you have configured a valid TLS certificate on your desktop.",
setting_host_name: "IP address / host",
setting_host_desc:
'The address where syncthing GUI is running. Use "127.0.0.1" for localhost.',
setting_host_placeholder: "Localhost",
setting_port_name: "Port",
setting_port_desc:
"Default is 8384. Check your syncthing GUI settings if you changed it.",
setting_api_name: "API key",
setting_api_desc:
"Copy this from syncthing > actions > settings > general.",
btn_test_conn: "Test connection",
setting_api_stored_securely:
"API key is stored securely in your system keychain.",
setting_api_stored_legacy:
"API key is stored locally (upgrade Obsidian for keychain support).",
setting_api_configured: "Configured",
setting_api_not_configured: "Not configured",
btn_modify_secret: "Modify secret",
// Settings - Folder
setting_folder_name: "Vault folder ID",
setting_folder_desc:
"Select the syncthing folder ID that matches this Obsidian vault to track its specific status.",
dropdown_default: "Select a folder...",
dropdown_none: "No folder selected",
btn_search_folders: "Fetch folders from syncthing",
// Settings - Conflict
setting_modal_conflict_name: "Conflict detection",
setting_modal_conflict_desc:
'Enable automatic scanning for ".sync-conflict" files. A red alert will appear in the side panel if conflicts are found.',
// Settings - Interface
setting_status_bar_name: "Show status bar item",
setting_status_bar_desc:
"Displays the connection icon and quick actions in the bottom right status bar (desktop only).",
setting_ribbon_name: "Show ribbon icon",
setting_ribbon_desc:
"Displays the icon in the left sidebar ribbon to quickly open the controller panel.",
setting_tab_icon_name: "Show sync status in tabs",
setting_tab_icon_desc: "Displays a icon in the file tab when syncing.",
setting_explorer_icon_name: "File explorer icon",
setting_explorer_icon_desc:
"Show a sync button on hover next to files in the sidebar.",
// --- History Filter ---
setting_history_filter_name: "History filter",
setting_history_filter_desc:
"Files or folders to hide from the history panel (comma separated, e.g. .Obsidian, .ds_store).",
// Notices / Errors
notice_syncing: "Sync requested...",
notice_success_conn: "Connection successful! Device ID: ",
notice_fail_conn:
"Connection failed. Please check the IP, port, and ensure HTTPS is disabled (especially on Android).",
notice_error_auth: "Authentication failed. Please check your API key.",
notice_offline: "Syncthing is unreachable. Is it running?",
notice_folders_found: "Folders found.",
notice_config_first: "Please configure the API key, URL and folder first",
notice_searching: "Connecting to syncthing...",
notice_invalid_host:
"Invalid host format. Please use ipv4, ipv6, localhost or a valid domain without HTTP/HTTPS.",
notice_invalid_port: "Invalid port. Must be a number between 1 and 65535.",
// Conflict Modal
modal_conflict_title: "Resolve sync conflicts",
modal_conflict_empty: "Great news! No conflict files found in your vault.",
modal_conflict_desc:
"The following files have conflicting versions. Compare the content and choose which one to keep.",
btn_compare: "Compare content",
btn_keep_original: "Keep original",
tooltip_keep_original:
"Deletes the conflict file (right side) and keeps your current local file.",
btn_keep_conflict: "Use conflict version",
tooltip_keep_conflict:
"Overwrites your local file with the conflict version (right side).",
btn_use_this_version: "Use this version",
diff_instructions:
"Use the arrows in the middle to transfer changes to the original file. To keep one version entirely, click 'use this version' above it.",
btn_save_merge: "Save merge",
diff_legend: "Original (a) ↔ conflict (b)",
// Diff View
diff_original_header: "Current file (original)",
diff_conflict_header: "Incoming conflict",
diff_loading: "Loading file content...",
diff_original_missing: "(original file was deleted or not found)",
diff_read_error: "Error reading file content.",
// Ignore (.stignore)
setting_ignore_name: "Ignored files (.stignore)",
setting_ignore_desc:
"Edit the .stignore file to prevent specific files (like workspace layouts) from syncing between devices.",
btn_edit_ignore: "Edit .stignore",
// Ignore Modal
modal_ignore_title: "Edit .stignore",
modal_ignore_desc:
"Files or patterns listed below will be completely ignored by syncthing.",
header_ignore_templates: "Quick add templates:",
btn_add_ignore: "Add",
btn_save_ignore: "Save changes",
notice_ignore_saved: ".stignore file saved successfully.",
notice_ignore_exists: "This rule is already in the list.",
ignore_help_text:
'Click "add" to include common rules that prevent sync issues between desktop and mobile.',
ignore_pattern_workspace_label: "Workspace config",
ignore_pattern_workspace_desc:
"Essential! Ignores open window positions and tabs (avoids visual conflicts between desktop and mobile).",
ignore_pattern_installer_label: "Installer cache",
ignore_pattern_installer_desc: "Ignores temporary Obsidian update files.",
ignore_pattern_hidden_label: "Hidden files",
ignore_pattern_hidden_desc:
"Ignores system files (like .ds_store on mac or thumbs.db on Windows).",
notice_ignore_added: "Added: ",
notice_ignore_error: "Error saving .stignore",
// Alerts
alert_conflict_detected: "Conflict(s) detected!",
alert_click_to_resolve: "Click here to resolve",
// Placeholders
explorer_sync_tooltip: "Sync this file",
// About
setting_header_about: "About",
setting_version_name: "Version",
setting_version_tooltip: "View release notes",
setting_github_desc: "Access source code or report an issue.",
btn_github_repo: "GitHub repo",
btn_report_bug: "Report bug",
// Versions
modal_versions_title: "File versions",
modal_versions_empty: "No previous versions found.",
btn_restore: "Restore",
notice_version_restored: "Version restored successfully.",
notice_restore_fail: "Failed to restore version.",
confirm_restore:
"Are you sure you want to restore the version from {date}? Current content will be overwritten.",
cmd_view_versions: "File versions",
btn_cancel: "Cancel",
modal_confirm_title: "Confirm action",
// Context Menu
modal_context_menu_title: "Context menu",
btn_manage_context_menu: "Manage context menu items",
setting_group_context_menu_name: "Group items",
setting_group_context_menu_desc:
"Group all syncthing items under a single submenu.",
header_context_menu_items: "Items",
btn_view_version: "View content",
cmd_sync_file: "Sync file",
cmd_ignore_file: "Don't sync this",
notice_ignored_success: "Added to .stignore",
notice_ignored_error: "Failed to add to .stignore",
// Debug
setting_debug_mode_name: "Debug mode",
setting_debug_mode_desc: "Enable verbose logging to console (dev).",
tooltip_configure_modules: "Configure debug modules",
modal_debug_title: "Debug configuration",
modal_debug_desc:
"Select which modules should output debug logs to the console.",
// Debug Report
debug_report_title: "Debug report",
debug_report_desc:
"Copy the information below and paste it in a bug report.",
debug_report_copy: "Copy to clipboard",
debug_report_copied: "Debug info copied!",
debug_report_open_issue: "Open issue on GitHub",
debug_report_no_errors: "No recent errors or warnings.",
btn_debug_report: "Debug report",
// Log Levels
setting_log_level_name: "Log level",
setting_log_level_desc: "Set the minimum severity of logs to capture.",
log_level_off: "Off",
log_level_error: "Error only",
log_level_warn: "Warnings + errors",
log_level_debug: "All (debug)",
// Debug Console
debug_console_title: "Debug console",
debug_console_empty: "No logs captured yet.",
debug_console_clear: "Clear",
btn_open_console: "Open console",
debug_console_filter_level: "Minimum level",
debug_console_filter_modules: "Modules",
// Versioning
modal_versioning_title: "File versioning",
versioning_type: "Versioning strategy",
versioning_type_desc:
"Select the method used to keep previous versions of files.",
versioning_none: "No versioning",
versioning_trashcan: "Trash can",
versioning_simple: "Simple file versioning",
versioning_staggered: "Staggered file versioning",
versioning_external: "External file versioning",
versioning_cleanout_days: "Clean out after (days)",
versioning_cleanout_days_desc:
"The number of days to keep files in the trash can. Zero means forever.",
versioning_keep: "Keep versions",
versioning_keep_desc: "The number of versions to keep.",
versioning_max_age: "Maximum age (days)",
versioning_max_age_desc: "The maximum age of versions to keep.",
versioning_clean_interval: "Clean interval (seconds)",
versioning_clean_interval_desc:
"The interval between running the cleanup process.",
versioning_command: "Command",
versioning_command_desc: "External command to execute for versioning.",
btn_save: "Save",
notice_versioning_saved: "Versioning configuration saved.",
notice_versioning_error: "Failed to save versioning configuration.",
setting_file_versioning_name: "File versioning",
setting_file_versioning_desc:
"Configure how syncthing keeps previous versions of your files.",
// General
btn_configure: "Configure",
// Connection Check
notice_folder_missing:
"Syncthing folder not found. Please reselect it in the settings.",
notice_folder_migration:
"Folder config needs update. Please reselect your vault folder in syncthing settings.",
// Dynamic UI Strings
notice_resuming: "Resuming sync...",
notice_pausing: "Pausing sync...",
notice_is_paused: "Sync is paused.",
loading_versions: "Loading versions...",
loading_config: "Loading configuration...",
error_folder_not_found: "Folder not found in configuration.",
saving: "Saving...",
error_loading_versions: "Error loading versions. Check console.",
tab_syncing: "Syncing...",
tab_synced: "Synced!",
conflict_delete_error: "Error deleting file.",
conflict_restore_error: "Error restoring conflict.",
};

200
src/lang/locales/pt.json Normal file
View file

@ -0,0 +1,200 @@
{
"cmd_open_panel": "Abrir Painel Lateral",
"cmd_force_sync": "Forçar Sincronização Agora",
"cmd_debug_connect": "Debug: Testar Conexão",
"cmd_copy_debug": "Copiar informações de depuração",
"ribbon_tooltip": "Abrir Syncthing Controller",
"status_synced": "Sincronizado",
"status_syncing": "Sincronizando...",
"status_offline": "Desconectado",
"status_error": "Erro",
"status_unknown": "Desconhecido",
"status_paused": "Pausado",
"status_config": "Configuração pendente",
"info_last_sync": "Último Sync",
"info_devices": "Dispositivos Online",
"info_folder": "Pasta Monitorada",
"info_history": "Atividade Recente",
"history_empty": "Nenhuma atividade recente",
"history_incoming": "Recebido (Remoto)",
"history_outgoing": "Enviado (Local)",
"btn_sync_now": "Sincronizar Agora",
"btn_requesting": "Solicitando...",
"tooltip_pause": "Pausar sincronização",
"tooltip_resume": "Retomar sincronização",
"setting_header_conn": "Configurações de Conexão",
"setting_header_folder": "Pastas e Arquivos",
"setting_header_interface": "Interface",
"setting_header_general": "Geral",
"setting_lang_name": "Idioma",
"setting_lang_desc": "Force a interface do plugin para um idioma específico ou siga o Obsidian. Este plugin é traduzido pela comunidade. Para ajudar a, clique no ícone para entrar no nosso projeto do Crowdin.",
"tooltip_help_translate": "Ajudar a traduzir (Crowdin)",
"setting_https_name": "Usar HTTPS",
"setting_https_desc": "IMPORTANTE: Mantenha DESATIVADO para Android/Mobile funcionar corretamente, também deve estar desativado no syncthing. Só ative se você configurou certificados TLS válidos no Desktop.",
"setting_host_name": "Endereço IP / Host",
"setting_host_desc": "O endereço onde a interface do Syncthing roda. Use \"127.0.0.1\" para localhost.",
"setting_host_placeholder": "localhost",
"setting_port_name": "Porta",
"setting_port_desc": "Padrão é 8384. Verifique nas configurações do Syncthing se você alterou.",
"setting_api_name": "Chave da API (API Key)",
"setting_api_desc": "Copie este código no Syncthing em: Ações > Configurações > Geral.",
"btn_test_conn": "Testar Conexão",
"setting_api_stored_securely": "A chave da API está armazenada com segurança no chaveiro do sistema.",
"setting_api_stored_legacy": "A chave da API está armazenada localmente (atualize o Obsidian para suporte ao chaveiro).",
"setting_api_configured": "Configurada",
"setting_api_not_configured": "Não configurada",
"btn_modify_secret": "Modificar secret",
"setting_folder_name": "Pasta do Cofre",
"setting_folder_desc": "Selecione qual ID de pasta do Syncthing corresponde a este cofre do Obsidian para monitorar o status específico dele.",
"dropdown_default": "Selecione uma pasta...",
"dropdown_none": "Nenhuma selecionada",
"btn_search_folders": "Buscar pastas no Syncthing",
"setting_modal_conflict_name": "Detecção de Conflitos",
"setting_modal_conflict_desc": "Ativa a busca automática por arquivos \".sync-conflict\". Um alerta vermelho aparecerá no Painel Lateral se conflitos forem encontrados.",
"setting_status_bar_name": "Mostrar na Barra de Status",
"setting_status_bar_desc": "Exibe o ícone de conexão e status no rodapé direito (Apenas Desktop). Reinicie o obsidian para aplicar.",
"setting_ribbon_name": "Mostrar Ícone no Ribbon",
"setting_ribbon_desc": "Exibe o ícone na barra lateral esquerda para acesso rápido ao painel. Reinicie o obsidian para aplicar.",
"setting_tab_icon_name": "Mostrar status de sync nas abas",
"setting_tab_icon_desc": "Exibe um ícone na aba do arquivo enquanto ele está sendo sincronizado.",
"setting_explorer_icon_name": "Ícone no Gerenciador de Arquivos",
"setting_explorer_icon_desc": "Exibe um botão de sincronização ao passar o mouse sobre os arquivos na barra lateral.",
"setting_history_filter_name": "Filtro de Histórico",
"setting_history_filter_desc": "Arquivos ou pastas para esconder do painel de histórico (separados por vírgula, ex: .Obsidian, .DS_Store).",
"notice_syncing": "Sincronização solicitada...",
"notice_success_conn": "Conexão realizada com sucesso! ID do Dispositivo: ",
"notice_fail_conn": "Falha na conexão. Verifique IP, Porta e se o HTTPS está desativado (especialmente no Android).",
"notice_error_auth": "Erro de Autenticação. Verifique sua API Key.",
"notice_offline": "Syncthing inacessível. O aplicativo está rodando?",
"notice_folders_found": "pastas encontradas.",
"notice_config_first": "Por favor, configure a API Key, a URL e a pasta primeiro.",
"notice_searching": "Conectando ao Syncthing...",
"notice_invalid_host": "Formato de host inválido. Use IPv4, IPv6, localhost ou um domínio válido sem http/https.",
"notice_invalid_port": "Porta inválida. Deve ser um número entre 1 e 65535.",
"modal_conflict_title": "Resolver Conflitos de Sync",
"modal_conflict_empty": "Ótimo! Nenhum arquivo de conflito encontrado no cofre.",
"modal_conflict_desc": "Os arquivos abaixo possuem versões conflitantes. Compare o conteúdo e escolha qual manter.",
"btn_compare": "Comparar Conteúdo",
"btn_keep_original": "Manter Original",
"tooltip_keep_original": "Apaga o arquivo de conflito (da direita) e mantém o seu arquivo atual.",
"btn_keep_conflict": "Usar Versão do Conflito",
"tooltip_keep_conflict": "Substitui o seu arquivo local pela versão do conflito (da direita).",
"btn_use_this_version": "Usar esta versão",
"diff_instructions": "Use as setas no meio para transferir alterações para o arquivo original. Para manter uma das versões integralmente, clique em 'Usar esta versão' acima dela.",
"btn_save_merge": "Salvar Merge",
"diff_legend": "Original (A) ↔ conflito (B)",
"diff_original_header": "Arquivo Atual (Original)",
"diff_conflict_header": "Versão do Conflito",
"diff_loading": "Carregando conteúdo...",
"diff_original_missing": "(O arquivo original foi deletado ou não encontrado)",
"diff_read_error": "Erro ao ler o conteúdo do arquivo.",
"setting_ignore_name": "Arquivos Ignorados (.stignore)",
"setting_ignore_desc": "Edite o arquivo .stignore para impedir que arquivos específicos (como configs de workspace) sejam sincronizados, evitando bagunça de layout.",
"btn_edit_ignore": "Editar .stignore",
"modal_ignore_title": "Editar .stignore",
"modal_ignore_desc": "Arquivos ou padrões listados abaixo serão completamente ignorados pelo Syncthing.",
"header_ignore_templates": "Modelos Rápidos:",
"ignore_help_text": "Clique em \"Adicionar\" para incluir regras comuns que evitam problemas de sincronização entre Desktop e Mobile.",
"ignore_pattern_workspace_label": "Configurações de Workspace",
"ignore_pattern_workspace_desc": "Essencial! Ignora posições de janelas e abas abertas (evita conflitos visuais entre PC e Celular).",
"ignore_pattern_installer_label": "Cache do Instalador",
"ignore_pattern_installer_desc": "Ignora arquivos temporários de atualização do Obsidian.",
"ignore_pattern_hidden_label": "Arquivos Ocultos",
"ignore_pattern_hidden_desc": "Ignora arquivos de sistema (como .DS_Store no Mac ou thumbs.db no Windows).",
"btn_add_ignore": "Adicionar",
"btn_save_ignore": "Salvar Alterações",
"notice_ignore_saved": "Arquivo .stignore salvo com sucesso.",
"notice_ignore_exists": "Esta regra já está na lista.",
"notice_ignore_added": "Adicionado: ",
"notice_ignore_error": "Erro ao salvar .stignore",
"alert_conflict_detected": "Conflito(s) Detectado(s)!",
"alert_click_to_resolve": "Clique aqui para resolver",
"explorer_sync_tooltip": "Sincronizar este arquivo",
"setting_header_about": "Sobre",
"setting_version_name": "Versão",
"setting_version_tooltip": "Ver notas da versão",
"setting_github_desc": "Acesse o código fonte ou reporte um problema.",
"btn_github_repo": "Repositório GitHub",
"btn_report_bug": "Reportar Bug",
"modal_versions_title": "Versões do Arquivo",
"modal_versions_empty": "Nenhuma versão anterior encontrada.",
"btn_restore": "Restaurar",
"notice_version_restored": "Versão restaurada com sucesso.",
"notice_restore_fail": "Falha ao restaurar versão.",
"confirm_restore": "Tem certeza que deseja restaurar a versão de {date}? O conteúdo atual será sobrescrito.",
"cmd_view_versions": "Versões de Arquivo",
"btn_cancel": "Cancelar",
"modal_confirm_title": "Confirmar Ação",
"modal_context_menu_title": "Menu de Contexto",
"btn_manage_context_menu": "Gerenciar itens do menu de contexto",
"setting_group_context_menu_name": "Agrupar itens",
"setting_group_context_menu_desc": "Agrupa todos os itens do syncthing em um único submenu.",
"header_context_menu_items": "Itens",
"btn_view_version": "Ver conteúdo",
"cmd_sync_file": "Sincronizar arquivo",
"cmd_ignore_file": "Não sincronizar isto",
"notice_ignored_success": "Adicionado ao .stignore",
"notice_ignored_error": "Falha ao adicionar ao .stignore",
"setting_debug_mode_name": "Modo de Depuração",
"setting_debug_mode_desc": "Habilita logs detalhados no console (dev).",
"tooltip_configure_modules": "Configurar módulos",
"modal_debug_title": "Configuração de Depuração",
"modal_debug_desc": "Selecione quais módulos devem exibir logs no console.",
"debug_report_title": "Relatório de depuração",
"debug_report_desc": "Copie as informações abaixo e cole em um relatório de bug.",
"debug_report_copy": "Copiar para área de transferência",
"debug_report_copied": "Informações copiadas!",
"debug_report_open_issue": "Abrir Issue no GitHub",
"debug_report_no_errors": "Nenhum erro ou aviso recente.",
"btn_debug_report": "Relatório de depuração",
"setting_log_level_name": "Nível de log",
"setting_log_level_desc": "Define a severidade mínima dos logs a serem capturados.",
"log_level_off": "Desligado",
"log_level_error": "Apenas erros",
"log_level_warn": "Avisos + erros",
"log_level_debug": "Todos (debug)",
"debug_console_title": "Console de depuração",
"debug_console_empty": "Nenhum log capturado ainda.",
"debug_console_clear": "Limpar",
"btn_open_console": "Abrir console",
"debug_console_filter_level": "Nível mínimo",
"debug_console_filter_modules": "Módulos",
"modal_versioning_title": "Versionamento de Arquivos",
"versioning_type": "Estratégia de versionamento",
"versioning_type_desc": "Selecione o método usado para manter versões anteriores dos arquivos.",
"versioning_none": "Sem versionamento",
"versioning_trashcan": "Lixeira (Trash can)",
"versioning_simple": "Simples (Simple)",
"versioning_staggered": "Escalonado (Staggered)",
"versioning_external": "Externo (External)",
"versioning_cleanout_days": "Limpar após (dias)",
"versioning_cleanout_days_desc": "Dias para manter arquivos na lixeira. 0 significa para sempre.",
"versioning_keep": "Manter versões",
"versioning_keep_desc": "Número de versões a manter.",
"versioning_max_age": "Idade máxima (dias)",
"versioning_max_age_desc": "Idade máxima das versões a manter.",
"versioning_clean_interval": "Intervalo de limpeza (segundos)",
"versioning_clean_interval_desc": "Intervalo entre a limpeza de versões antigas.",
"versioning_command": "Comando",
"versioning_command_desc": "Comando externo para executar o versionamento.",
"btn_save": "Salvar",
"notice_versioning_saved": "Configuração de versionamento salva.",
"notice_versioning_error": "Falha ao salvar configuração de versionamento.",
"setting_file_versioning_name": "Versionamento de Arquivos",
"setting_file_versioning_desc": "Configure como o Syncthing mantém versões anteriores dos seus arquivos.",
"btn_configure": "Configurar",
"notice_folder_missing": "Pasta do Syncthing não encontrada. Por favor, reconfigure nas opções.",
"notice_folder_migration": "Configuração de pasta desatualizada. Por favor, selecione novamente a pasta do cofre nas configurações do Syncthing.",
"notice_resuming": "Retomando sincronização...",
"notice_pausing": "Pausando sincronização...",
"notice_is_paused": "Sincronização pausada.",
"loading_versions": "Carregando versões...",
"loading_config": "Carregando configuração...",
"error_folder_not_found": "Pasta não encontrada na configuração.",
"saving": "Salvando...",
"error_loading_versions": "Erro ao carregar versões. Verifique o console.",
"tab_syncing": "Sincronizando...",
"tab_synced": "Sincronizado!",
"conflict_delete_error": "Erro ao deletar arquivo.",
"conflict_restore_error": "Erro ao restaurar conflito."
}

View file

@ -1,301 +0,0 @@
export default {
// Comandos
cmd_open_panel: "Abrir Painel Lateral",
cmd_force_sync: "Forçar Sincronização Agora",
cmd_debug_connect: "Debug: Testar Conexão",
cmd_copy_debug: "Copiar informações de depuração",
// Ribbon
ribbon_tooltip: "Abrir Syncthing Controller",
// Status / View
status_synced: "Sincronizado",
status_syncing: "Sincronizando...",
status_offline: "Desconectado",
status_error: "Erro",
status_unknown: "Desconhecido",
status_paused: "Pausado",
info_last_sync: "Último Sync",
info_devices: "Dispositivos Online",
info_folder: "Pasta Monitorada",
info_history: "Atividade Recente",
history_empty: "Nenhuma atividade recente",
// History Directions (Tooltips for arrows)
history_incoming: "Recebido (Remoto)",
history_outgoing: "Enviado (Local)",
btn_sync_now: "Sincronizar Agora",
btn_requesting: "Solicitando...",
tooltip_pause: "Pausar sincronização",
tooltip_resume: "Retomar sincronização",
// Settings - Headers
setting_header_conn: "Configurações de Conexão",
setting_header_folder: "Pastas e Arquivos",
setting_header_interface: "Interface",
setting_header_general: "Geral",
// Settings - General
setting_lang_name: "Idioma",
setting_lang_desc:
"Force a interface do plugin para um idioma específico ou siga o Obsidian.",
// Settings - Connection
setting_https_name: "Usar HTTPS",
setting_https_desc:
"IMPORTANTE: Mantenha DESATIVADO para Android/Mobile funcionar corretamente, também deve estar desativado no syncthing. Só ative se você configurou certificados TLS válidos no Desktop.",
setting_host_name: "Endereço IP / Host",
setting_host_desc:
'O endereço onde a interface do Syncthing roda. Use "127.0.0.1" para localhost.',
setting_host_placeholder: "localhost",
setting_port_name: "Porta",
setting_port_desc:
"Padrão é 8384. Verifique nas configurações do Syncthing se você alterou.",
setting_api_name: "Chave da API (API Key)",
setting_api_desc:
"Copie este código no Syncthing em: Ações > Configurações > Geral.",
btn_test_conn: "Testar Conexão",
setting_api_stored_securely:
"A chave da API está armazenada com segurança no chaveiro do sistema.",
setting_api_stored_legacy:
"A chave da API está armazenada localmente (atualize o Obsidian para suporte ao chaveiro).",
setting_api_configured: "Configurada",
setting_api_not_configured: "Não configurada",
btn_modify_secret: "Modificar secret",
// Settings - Folder
setting_folder_name: "Pasta do Cofre",
setting_folder_desc:
"Selecione qual ID de pasta do Syncthing corresponde a este cofre do Obsidian para monitorar o status específico dele.",
dropdown_default: "Selecione uma pasta...",
dropdown_none: "Nenhuma selecionada",
btn_search_folders: "Buscar pastas no Syncthing",
// Settings - Conflict
setting_modal_conflict_name: "Detecção de Conflitos",
setting_modal_conflict_desc:
'Ativa a busca automática por arquivos ".sync-conflict". Um alerta vermelho aparecerá no Painel Lateral se conflitos forem encontrados.',
// Settings - Interface
setting_status_bar_name: "Mostrar na Barra de Status",
setting_status_bar_desc:
"Exibe o ícone de conexão e status no rodapé direito (Apenas Desktop). Reinicie o obsidian para aplicar.",
setting_ribbon_name: "Mostrar Ícone no Ribbon",
setting_ribbon_desc:
"Exibe o ícone na barra lateral esquerda para acesso rápido ao painel. Reinicie o obsidian para aplicar.",
setting_tab_icon_name: "Mostrar status de sync nas abas",
setting_tab_icon_desc:
"Exibe um ícone na aba do arquivo enquanto ele está sendo sincronizado.",
setting_explorer_icon_name: "Ícone no Gerenciador de Arquivos",
setting_explorer_icon_desc:
"Exibe um botão de sincronização ao passar o mouse sobre os arquivos na barra lateral.",
// --- History Filter ---
setting_history_filter_name: "Filtro de Histórico",
setting_history_filter_desc:
"Arquivos ou pastas para esconder do painel de histórico (separados por vírgula, ex: .Obsidian, .DS_Store).",
// Notices / Errors
notice_syncing: "Sincronização solicitada...",
notice_success_conn: "Conexão realizada com sucesso! ID do Dispositivo: ",
notice_fail_conn:
"Falha na conexão. Verifique IP, Porta e se o HTTPS está desativado (especialmente no Android).",
notice_error_auth: "Erro de Autenticação. Verifique sua API Key.",
notice_offline: "Syncthing inacessível. O aplicativo está rodando?",
notice_folders_found: "pastas encontradas.",
notice_config_first:
"Por favor, configure a API Key, a URL e a pasta primeiro.",
notice_searching: "Conectando ao Syncthing...",
notice_invalid_host:
"Formato de host inválido. Use IPv4, IPv6, localhost ou um domínio válido sem http/https.",
notice_invalid_port: "Porta inválida. Deve ser um número entre 1 e 65535.",
// Modal de Conflitos
modal_conflict_title: "Resolver Conflitos de Sync",
modal_conflict_empty:
"Ótimo! Nenhum arquivo de conflito encontrado no cofre.",
modal_conflict_desc:
"Os arquivos abaixo possuem versões conflitantes. Compare o conteúdo e escolha qual manter.",
btn_compare: "Comparar Conteúdo",
btn_keep_original: "Manter Original",
tooltip_keep_original:
"Apaga o arquivo de conflito (da direita) e mantém o seu arquivo atual.",
btn_keep_conflict: "Usar Versão do Conflito",
tooltip_keep_conflict:
"Substitui o seu arquivo local pela versão do conflito (da direita).",
btn_use_this_version: "Usar esta versão",
diff_instructions:
"Use as setas no meio para transferir alterações para o arquivo original. Para manter uma das versões integralmente, clique em 'Usar esta versão' acima dela.",
btn_save_merge: "Salvar Merge",
diff_legend: "Original (A) ↔ conflito (B)",
// Visualização de Diferença
diff_original_header: "Arquivo Atual (Original)",
diff_conflict_header: "Versão do Conflito",
diff_loading: "Carregando conteúdo...",
diff_original_missing:
"(O arquivo original foi deletado ou não encontrado)",
diff_read_error: "Erro ao ler o conteúdo do arquivo.",
// Ignore (.stignore)
setting_ignore_name: "Arquivos Ignorados (.stignore)",
setting_ignore_desc:
"Edite o arquivo .stignore para impedir que arquivos específicos (como configs de workspace) sejam sincronizados, evitando bagunça de layout.",
btn_edit_ignore: "Editar .stignore",
// Modal de Ignore
modal_ignore_title: "Editar .stignore",
modal_ignore_desc:
"Arquivos ou padrões listados abaixo serão completamente ignorados pelo Syncthing.",
header_ignore_templates: "Modelos Rápidos:",
ignore_help_text:
'Clique em "Adicionar" para incluir regras comuns que evitam problemas de sincronização entre Desktop e Mobile.',
ignore_pattern_workspace_label: "Configurações de Workspace",
ignore_pattern_workspace_desc:
"Essencial! Ignora posições de janelas e abas abertas (evita conflitos visuais entre PC e Celular).",
ignore_pattern_installer_label: "Cache do Instalador",
ignore_pattern_installer_desc:
"Ignora arquivos temporários de atualização do Obsidian.",
ignore_pattern_hidden_label: "Arquivos Ocultos",
ignore_pattern_hidden_desc:
"Ignora arquivos de sistema (como .DS_Store no Mac ou thumbs.db no Windows).",
btn_add_ignore: "Adicionar",
btn_save_ignore: "Salvar Alterações",
notice_ignore_saved: "Arquivo .stignore salvo com sucesso.",
notice_ignore_exists: "Esta regra já está na lista.",
notice_ignore_added: "Adicionado: ",
notice_ignore_error: "Erro ao salvar .stignore",
// Alerta de Conflito (View)
alert_conflict_detected: "Conflito(s) Detectado(s)!",
alert_click_to_resolve: "Clique aqui para resolver",
// Placeholders
explorer_sync_tooltip: "Sincronizar este arquivo",
// About
setting_header_about: "Sobre",
setting_version_name: "Versão",
setting_version_tooltip: "Ver notas da versão",
setting_github_desc: "Acesse o código fonte ou reporte um problema.",
btn_github_repo: "Repositório GitHub",
btn_report_bug: "Reportar Bug",
// Versões
modal_versions_title: "Versões do Arquivo",
modal_versions_empty: "Nenhuma versão anterior encontrada.",
btn_restore: "Restaurar",
notice_version_restored: "Versão restaurada com sucesso.",
notice_restore_fail: "Falha ao restaurar versão.",
confirm_restore:
"Tem certeza que deseja restaurar a versão de {date}? O conteúdo atual será sobrescrito.",
cmd_view_versions: "Versões de Arquivo",
btn_cancel: "Cancelar",
modal_confirm_title: "Confirmar Ação",
// Menu de Contexto
modal_context_menu_title: "Menu de Contexto",
btn_manage_context_menu: "Gerenciar itens do menu de contexto",
setting_group_context_menu_name: "Agrupar itens",
setting_group_context_menu_desc:
"Agrupa todos os itens do syncthing em um único submenu.",
header_context_menu_items: "Itens",
btn_view_version: "Ver conteúdo",
cmd_sync_file: "Sincronizar arquivo",
cmd_ignore_file: "Não sincronizar isto",
notice_ignored_success: "Adicionado ao .stignore",
notice_ignored_error: "Falha ao adicionar ao .stignore",
// Debug
setting_debug_mode_name: "Modo de Depuração",
setting_debug_mode_desc: "Habilita logs detalhados no console (dev).",
tooltip_configure_modules: "Configurar módulos",
modal_debug_title: "Configuração de Depuração",
modal_debug_desc: "Selecione quais módulos devem exibir logs no console.",
// Relatório de Depuração
debug_report_title: "Relatório de depuração",
debug_report_desc:
"Copie as informações abaixo e cole em um relatório de bug.",
debug_report_copy: "Copiar para área de transferência",
debug_report_copied: "Informações copiadas!",
debug_report_open_issue: "Abrir Issue no GitHub",
debug_report_no_errors: "Nenhum erro ou aviso recente.",
btn_debug_report: "Relatório de depuração",
// Níveis de Log
setting_log_level_name: "Nível de log",
setting_log_level_desc:
"Define a severidade mínima dos logs a serem capturados.",
log_level_off: "Desligado",
log_level_error: "Apenas erros",
log_level_warn: "Avisos + erros",
log_level_debug: "Todos (debug)",
// Console de Depuração
debug_console_title: "Console de depuração",
debug_console_empty: "Nenhum log capturado ainda.",
debug_console_clear: "Limpar",
btn_open_console: "Abrir console",
debug_console_filter_level: "Nível mínimo",
debug_console_filter_modules: "Módulos",
// Versioning
modal_versioning_title: "Versionamento de Arquivos",
versioning_type: "Estratégia de versionamento",
versioning_type_desc:
"Selecione o método usado para manter versões anteriores dos arquivos.",
versioning_none: "Sem versionamento",
versioning_trashcan: "Lixeira (Trash can)",
versioning_simple: "Simples (Simple)",
versioning_staggered: "Escalonado (Staggered)",
versioning_external: "Externo (External)",
versioning_cleanout_days: "Limpar após (dias)",
versioning_cleanout_days_desc:
"Dias para manter arquivos na lixeira. 0 significa para sempre.",
versioning_keep: "Manter versões",
versioning_keep_desc: "Número de versões a manter.",
versioning_max_age: "Idade máxima (dias)",
versioning_max_age_desc: "Idade máxima das versões a manter.",
versioning_clean_interval: "Intervalo de limpeza (segundos)",
versioning_clean_interval_desc:
"Intervalo entre a limpeza de versões antigas.",
versioning_command: "Comando",
versioning_command_desc: "Comando externo para executar o versionamento.",
btn_save: "Salvar",
notice_versioning_saved: "Configuração de versionamento salva.",
notice_versioning_error: "Falha ao salvar configuração de versionamento.",
setting_file_versioning_name: "Versionamento de Arquivos",
setting_file_versioning_desc:
"Configure como o Syncthing mantém versões anteriores dos seus arquivos.",
btn_configure: "Configurar",
// Connection Check
notice_folder_missing:
"Pasta do Syncthing não encontrada. Por favor, reconfigure nas opções.",
notice_folder_migration:
"Configuração de pasta desatualizada. Por favor, selecione novamente a pasta do cofre nas configurações do Syncthing.",
// Dynamic UI Strings
notice_resuming: "Retomando sincronização...",
notice_pausing: "Pausando sincronização...",
notice_is_paused: "Sincronização pausada.",
loading_versions: "Carregando versões...",
loading_config: "Carregando configuração...",
error_folder_not_found: "Pasta não encontrada na configuração.",
saving: "Salvando...",
error_loading_versions: "Erro ao carregar versões. Verifique o console.",
tab_syncing: "Sincronizando...",
tab_synced: "Sincronizado!",
conflict_delete_error: "Erro ao deletar arquivo.",
conflict_restore_error: "Erro ao restaurar conflito.",
};

200
src/lang/locales/ru.json Normal file
View file

@ -0,0 +1,200 @@
{
"cmd_open_panel": "Открыть Боковую Панель",
"cmd_force_sync": "Принудительно синхронизировать сейчас",
"cmd_debug_connect": "Отладка: Тест подключения",
"cmd_copy_debug": "Скопировать отладочную информацию",
"ribbon_tooltip": "Открыть контроллер Syncthing",
"status_synced": "Синхронизировано",
"status_syncing": "Синхронизация...",
"status_offline": "Не в сети",
"status_error": "Ошибка",
"status_unknown": "Неизвестно",
"status_paused": "Пауза",
"status_config": "Ожидание конфигурации",
"info_last_sync": "Последняя синхронизация",
"info_devices": "Устройств в сети",
"info_folder": "Папка хранилища",
"info_history": "Недавняя активность",
"history_empty": "Нет недавней активности",
"history_incoming": "Входящие (удаленно)",
"history_outgoing": "Исходящие (локально)",
"btn_sync_now": "Синхронизировать сейчас",
"btn_requesting": "Запрашивается...",
"tooltip_pause": "Приостановить синхронизацию",
"tooltip_resume": "Возобновить синхронизацию",
"setting_header_conn": "Настройки соединения",
"setting_header_folder": "Папки и файлы",
"setting_header_interface": "Параметры интерфейса",
"setting_header_general": "Основные",
"setting_lang_name": "Язык интерфейса",
"setting_lang_desc": "Выберите предпочитаемый язык или используйте выставленный в Obsidian. Плагин локализуется сообществом. Чтобы помочь перевести его на ваш язык, нажмите на значок глобуса (Crowdin).",
"tooltip_help_translate": "Помочь с переводом (Crowdin)",
"setting_https_name": "Использовать HTTPS",
"setting_https_desc": "ВАЖНО: Для корректной работы c Android/Mobile ОТКЛЮЧИТЕ эту функцию, она также должна быть ОТКЛЮЧЕНА в Syncthing. Включайте только в том случае, если вы настроили действующий сертификат TLS на своем Устройстве.",
"setting_host_name": "IP Адрес / Хост",
"setting_host_desc": "Адрес, по которому открывается доступ к интерфейсу Syncthing. Используйте \"127.0.0.1\" для локальной сети.",
"setting_host_placeholder": "localhost",
"setting_port_name": "Порт",
"setting_port_desc": "Стандартный 8384. Проверьте настройки Syncthing через интерфейс, если вы его изменили.",
"setting_api_name": "API Ключ",
"setting_api_desc": "Найдите его по пути Syncthing > Действия > Настройки > Общие.",
"btn_test_conn": "Проверить соединение",
"setting_api_stored_securely": "API ключ надёжно хранится в связке ключей системы.",
"setting_api_stored_legacy": "API ключ хранится локально (обновите Obsidian для поддержки связки ключей).",
"setting_api_configured": "Настроен",
"setting_api_not_configured": "Не настроен",
"btn_modify_secret": "Изменить секрет",
"setting_folder_name": "ID папки хранилища",
"setting_folder_desc": "Выберите ID папки в Syncthing, соответствующий этому хранилищу Obsidian, чтобы отслеживать ее конкретный статус.",
"dropdown_default": "Выберите папку...",
"dropdown_none": "Папка не выбрана",
"btn_search_folders": "Найти папки из Syncthing",
"setting_modal_conflict_name": "Обнаружение конфликтов",
"setting_modal_conflict_desc": "Включить автоматический поиск \".sync-conflict\" файлов. При обнаружении конфликтов на Боковой Панели появится красное предупреждение.",
"setting_status_bar_name": "Показывать значок в Строке Состояния",
"setting_status_bar_desc": "Отображает значок подключения и быстрые действия в нижней правой строке состояния (Только для ПК). Перезапустите Obsidian, чтобы применить.",
"setting_ribbon_name": "Показывать иконку на Вертикальной Панели",
"setting_ribbon_desc": "Отображает значок на левой вертикальной панели, чтобы быстро открыть панель управления. Перезапустите Obsidian, чтобы применить.",
"setting_tab_icon_name": "Показывать статус синхронизации во вкладках",
"setting_tab_icon_desc": "Отображает иконку во вкладке файла во время его синхронизации.",
"setting_explorer_icon_name": "Иконка в проводнике файлов",
"setting_explorer_icon_desc": "Показывать кнопку синхронизации при наведении на файлы в боковой панели.",
"setting_history_filter_name": "Фильтр истории",
"setting_history_filter_desc": "Файлы или папки, которые нужно скрыть из панели истории (через запятую, например .Obsidian, .ds_store).",
"notice_syncing": "Запрошена синхронизация...",
"notice_success_conn": "Подключение прошло успешно! ID устройства: ",
"notice_fail_conn": "Не удалось установить соединение. Пожалуйста, проверьте IP, Порт, и убедитесь,что HTTPS отключен (особенно на Android).",
"notice_error_auth": "Не удалось выполнить авторизацию. Пожалуйста, проверьте Ваш API Ключ.",
"notice_offline": "Syncthing недоступен. Запущен ли он?",
"notice_folders_found": "папки(ок) найдено.",
"notice_config_first": "Пожалуйста, сначала настройте API Ключ, URL и папку.",
"notice_searching": "Подключение к Syncthing...",
"notice_invalid_host": "Неверный формат хоста. Используйте IPv4, IPv6, localhost или действительный домен без http/https.",
"notice_invalid_port": "Неверный порт. Строго укажите число от 1 до 65535.",
"modal_conflict_title": "Разрешить конфликты синхронизации",
"modal_conflict_empty": "Отличные новости! Конфликтующих файлов в Вашем хранилище не найдено.",
"modal_conflict_desc": "Данные файлы имеют конфликтующие версии. Сравните содержимое и выберите какой оставить.",
"btn_compare": "Сравнить содержимое",
"btn_keep_original": "Оставить оригинал",
"tooltip_keep_original": "Удалит конфликтные файлы (правая сторона) и оставит Ваши локальные.",
"btn_keep_conflict": "Использовать конфликтную",
"tooltip_keep_conflict": "Заменяет Ваши локальные файлы на конфликтные (правая сторона).",
"btn_use_this_version": "Использовать эту версию",
"diff_instructions": "Используйте стрелки посередине для переноса изменений в исходный файл. Чтобы полностью сохранить одну из версий, нажмите 'Использовать эту версию' над ней.",
"btn_save_merge": "Сохранить слияние",
"diff_legend": "Оригинал (A) ↔ конфликт (B)",
"diff_original_header": "Текущий файл (Оригинал)",
"diff_conflict_header": "Конфликтующая версия",
"diff_loading": "Загружаю содержимое файла...",
"diff_original_missing": "(Оригинальный файл удален или не был найден)",
"diff_read_error": "Ошибка при чтении содержимого файла.",
"setting_ignore_name": "Шаблон игнорирования (.stignore)",
"setting_ignore_desc": "Редактируйте .stignore файл, чтобы предотвратить синхронизацию конкретных файлов (например настройки пространств) между устройствами.",
"btn_edit_ignore": "Редактировать .stignore",
"modal_ignore_title": "Редактирование .stignore",
"modal_ignore_desc": "Файлы или шаблоны вписанные ниже будут полностью проигнорированы Syncthing.",
"header_ignore_templates": "Встроенные Шаблоны:",
"ignore_help_text": "Нажмите \"Добавить\", чтобы включить общие правила, предотвращающие проблемы синхронизации между ПК и мобильным устройством.",
"ignore_pattern_workspace_label": "Настройки рабочей среды",
"ignore_pattern_workspace_desc": "Важно! Игнорирует позиции открытых окон и вкладок (избегает визуальных конфликтов между ПК и мобильным устройством).",
"ignore_pattern_installer_label": "Кэш установщика",
"ignore_pattern_installer_desc": "Игнорирует временные файлы обновлений Obsidian.",
"ignore_pattern_hidden_label": "Скрытые файлы",
"ignore_pattern_hidden_desc": "Игнорирует системные файлы (например, .ds_store на mac или thumbs.db на Windows).",
"btn_add_ignore": "Добавить",
"btn_save_ignore": "Сохранить изменения",
"notice_ignore_saved": ".stignore успешно сохранен.",
"notice_ignore_exists": "Это правило уже в есть в списке.",
"notice_ignore_added": "Добавлено: ",
"notice_ignore_error": "Ошибка сохранения .stignore",
"alert_conflict_detected": "Обнаружен конфликт(ы)!",
"alert_click_to_resolve": "Нажмите здесь, чтобы решить",
"explorer_sync_tooltip": "Синхронизировать этот файл",
"setting_header_about": "О плагине",
"setting_version_name": "Версия",
"setting_version_tooltip": "Просмотреть заметки к выпуску",
"setting_github_desc": "Исходный код или сообщение об ошибке.",
"btn_github_repo": "Репозиторий GitHub",
"btn_report_bug": "Сообщить об ошибке",
"modal_versions_title": "Версии файла",
"modal_versions_empty": "Предыдущие версии не найдены.",
"btn_restore": "Восстановить",
"notice_version_restored": "Версия успешно восстановлена.",
"notice_restore_fail": "Не удалось восстановить версию.",
"confirm_restore": "Вы уверены, что хотите восстановить версию от {date}? Текущее содержимое будет перезаписано.",
"cmd_view_versions": "Версии файла",
"btn_cancel": "Отмена",
"modal_confirm_title": "Подтверждение",
"modal_context_menu_title": "Контекстное меню",
"btn_manage_context_menu": "Управление контекстным меню",
"setting_group_context_menu_name": "Группировка элементов",
"setting_group_context_menu_desc": "Группировать все элементы syncthing в одно подменю.",
"header_context_menu_items": "Элементы",
"btn_view_version": "Просмотр содержимого",
"cmd_sync_file": "Синхронизировать файл",
"cmd_ignore_file": "Не синхронизировать это",
"notice_ignored_success": "Добавлено в .stignore",
"notice_ignored_error": "Не удалось добавить в .stignore",
"setting_debug_mode_name": "Режим отладки",
"setting_debug_mode_desc": "Включить подробное логирование в консоли (dev).",
"tooltip_configure_modules": "Настроить модули",
"modal_debug_title": "Конфигурация отладки",
"modal_debug_desc": "Выберите модули, которые будут выводить логи в консоль.",
"debug_report_title": "Отчёт об отладке",
"debug_report_desc": "Скопируйте информацию ниже и вставьте в отчёт об ошибке.",
"debug_report_copy": "Копировать в буфер обмена",
"debug_report_copied": "Информация скопирована!",
"debug_report_open_issue": "Открыть Issue на GitHub",
"debug_report_no_errors": "Нет недавних ошибок или предупреждений.",
"btn_debug_report": "Отчёт об отладке",
"setting_log_level_name": "Уровень логов",
"setting_log_level_desc": "Установите минимальную серьёзность логов для захвата.",
"log_level_off": "Выключено",
"log_level_error": "Только ошибки",
"log_level_warn": "Предупреждения + ошибки",
"log_level_debug": "Все (отладка)",
"debug_console_title": "Консоль отладки",
"debug_console_empty": "Логи пока не захвачены.",
"debug_console_clear": "Очистить",
"btn_open_console": "Открыть консоль",
"debug_console_filter_level": "Минимальный уровень",
"debug_console_filter_modules": "Модули",
"modal_versioning_title": "Версионирование файлов",
"versioning_type": "Стратегия версионирования",
"versioning_type_desc": "Выберите метод для сохранения предыдущих версий файлов.",
"versioning_none": "Без версионирования",
"versioning_trashcan": "Корзина (Trash can)",
"versioning_simple": "Простое (Simple)",
"versioning_staggered": "Поэтапное (Staggered)",
"versioning_external": "Внешнее (External)",
"versioning_cleanout_days": "Очищать через (дней)",
"versioning_cleanout_days_desc": "Дней хранить файлы в корзине. 0 означает вечно.",
"versioning_keep": "Хранить версий",
"versioning_keep_desc": "Количество версий для хранения.",
"versioning_max_age": "Максимальный возраст (дней)",
"versioning_max_age_desc": "Максимальный возраст версий для хранения.",
"versioning_clean_interval": "Интервал очистки (секунды)",
"versioning_clean_interval_desc": "Интервал между очисткой старых версий.",
"versioning_command": "Команда",
"versioning_command_desc": "Внешняя команда для выполнения версионирования.",
"btn_save": "Сохранить",
"notice_versioning_saved": "Конфигурация версионирования сохранена.",
"notice_versioning_error": "Не удалось сохранить конфигурацию версионирования.",
"setting_file_versioning_name": "Версионирование файлов",
"setting_file_versioning_desc": "Настройте, как Syncthing сохраняет предыдущие версии ваших файлов.",
"btn_configure": "Настроить",
"notice_folder_missing": "Папка Syncthing не найдена. Пожалуйста, выберите её заново в настройках.",
"notice_folder_migration": "Конфигурация папки устарела. Пожалуйста, выберите папку хранилища заново в настройках Syncthing.",
"notice_resuming": "Возобновление синхронизации...",
"notice_pausing": "Приостановка синхронизации...",
"notice_is_paused": "Синхронизация приостановлена.",
"loading_versions": "Загрузка версий...",
"loading_config": "Загрузка конфигурации...",
"error_folder_not_found": "Папка не найдена в конфигурации.",
"saving": "Сохранение...",
"error_loading_versions": "Ошибка загрузки версий. Проверьте консоль.",
"tab_syncing": "Синхронизация...",
"tab_synced": "Синхронизировано!",
"conflict_delete_error": "Ошибка удаления файла.",
"conflict_restore_error": "Ошибка восстановления конфликта."
}

View file

@ -1,300 +0,0 @@
export default {
// Commands
cmd_open_panel: "Открыть Боковую Панель",
cmd_force_sync: "Принудительно синхронизировать сейчас",
cmd_debug_connect: "Отладка: Тест подключения",
cmd_copy_debug: "Скопировать отладочную информацию",
// Ribbon Icon
ribbon_tooltip: "Открыть контроллер Syncthing",
// Status / View
status_synced: "Синхронизировано",
status_syncing: "Синхронизация...",
status_offline: "Не в сети",
status_error: "Ошибка",
status_unknown: "Неизвестно",
status_paused: "Пауза",
info_last_sync: "Последняя синхронизация",
info_devices: "Устройств в сети",
info_folder: "Папка хранилища",
info_history: "Недавняя активность",
history_empty: "Нет недавней активности",
// History Directions (Tooltips for arrows)
history_incoming: "Входящие (удаленно)",
history_outgoing: "Исходящие (локально)",
btn_sync_now: "Синхронизировать сейчас",
btn_requesting: "Запрашивается...",
tooltip_pause: "Приостановить синхронизацию",
tooltip_resume: "Возобновить синхронизацию",
// Settings - Headers
setting_header_conn: "Настройки соединения",
setting_header_folder: "Папки и файлы",
setting_header_interface: "Параметры интерфейса",
setting_header_general: "Основные",
// Settings - General
setting_lang_name: "Язык интерфейса",
setting_lang_desc:
"Выберите предпочитаемый язык или используйте выставленный в Obsidian.",
// Settings - Connection
setting_https_name: "Использовать HTTPS",
setting_https_desc:
"ВАЖНО: Для корректной работы c Android/Mobile ОТКЛЮЧИТЕ эту функцию, она также должна быть ОТКЛЮЧЕНА в Syncthing. Включайте только в том случае, если вы настроили действующий сертификат TLS на своем Устройстве.",
setting_host_name: "IP Адрес / Хост",
setting_host_desc:
'Адрес, по которому открывается доступ к интерфейсу Syncthing. Используйте "127.0.0.1" для локальной сети.',
setting_host_placeholder: "localhost",
setting_port_name: "Порт",
setting_port_desc:
"Стандартный 8384. Проверьте настройки Syncthing через интерфейс, если вы его изменили.",
setting_api_name: "API Ключ",
setting_api_desc:
"Найдите его по пути Syncthing > Действия > Настройки > Общие.",
btn_test_conn: "Проверить соединение",
setting_api_stored_securely:
"API ключ надёжно хранится в связке ключей системы.",
setting_api_stored_legacy:
"API ключ хранится локально (обновите Obsidian для поддержки связки ключей).",
setting_api_configured: "Настроен",
setting_api_not_configured: "Не настроен",
btn_modify_secret: "Изменить секрет",
// Settings - Folder
setting_folder_name: "ID папки хранилища",
setting_folder_desc:
"Выберите ID папки в Syncthing, соответствующий этому хранилищу Obsidian, чтобы отслеживать ее конкретный статус.",
dropdown_default: "Выберите папку...",
dropdown_none: "Папка не выбрана",
btn_search_folders: "Найти папки из Syncthing",
// Settings - Conflict
setting_modal_conflict_name: "Обнаружение конфликтов",
setting_modal_conflict_desc:
'Включить автоматический поиск ".sync-conflict" файлов. При обнаружении конфликтов на Боковой Панели появится красное предупреждение.',
// Settings - Interface
setting_status_bar_name: "Показывать значок в Строке Состояния",
setting_status_bar_desc:
"Отображает значок подключения и быстрые действия в нижней правой строке состояния (Только для ПК). Перезапустите Obsidian, чтобы применить.",
setting_ribbon_name: "Показывать иконку на Вертикальной Панели",
setting_ribbon_desc:
"Отображает значок на левой вертикальной панели, чтобы быстро открыть панель управления. Перезапустите Obsidian, чтобы применить.",
setting_tab_icon_name: "Показывать статус синхронизации во вкладках",
setting_tab_icon_desc:
"Отображает иконку во вкладке файла во время его синхронизации.",
setting_explorer_icon_name: "Иконка в проводнике файлов",
setting_explorer_icon_desc:
"Показывать кнопку синхронизации при наведении на файлы в боковой панели.",
// --- History Filter ---
setting_history_filter_name: "Фильтр истории",
setting_history_filter_desc:
"Файлы или папки, которые нужно скрыть из панели истории (через запятую, например .Obsidian, .ds_store).",
// Notices / Errors
notice_syncing: "Запрошена синхронизация...",
notice_success_conn: "Подключение прошло успешно! ID устройства: ",
notice_fail_conn:
"Не удалось установить соединение. Пожалуйста, проверьте IP, Порт, и убедитесь,что HTTPS отключен (особенно на Android).",
notice_error_auth:
"Не удалось выполнить авторизацию. Пожалуйста, проверьте Ваш API Ключ.",
notice_offline: "Syncthing недоступен. Запущен ли он?",
notice_folders_found: "папки(ок) найдено.",
notice_config_first: "Пожалуйста, сначала настройте API Ключ, URL и папку.",
notice_searching: "Подключение к Syncthing...",
notice_invalid_host:
"Неверный формат хоста. Используйте IPv4, IPv6, localhost или действительный домен без http/https.",
notice_invalid_port: "Неверный порт. Строго укажите число от 1 до 65535.",
// Conflict Modal
modal_conflict_title: "Разрешить конфликты синхронизации",
modal_conflict_empty:
"Отличные новости! Конфликтующих файлов в Вашем хранилище не найдено.",
modal_conflict_desc:
"Данные файлы имеют конфликтующие версии. Сравните содержимое и выберите какой оставить.",
btn_compare: "Сравнить содержимое",
btn_keep_original: "Оставить оригинал",
tooltip_keep_original:
"Удалит конфликтные файлы (правая сторона) и оставит Ваши локальные.",
btn_keep_conflict: "Использовать конфликтную",
tooltip_keep_conflict:
"Заменяет Ваши локальные файлы на конфликтные (правая сторона).",
btn_use_this_version: "Использовать эту версию",
diff_instructions:
"Используйте стрелки посередине для переноса изменений в исходный файл. Чтобы полностью сохранить одну из версий, нажмите 'Использовать эту версию' над ней.",
btn_save_merge: "Сохранить слияние",
diff_legend: "Оригинал (A) ↔ конфликт (B)",
// Diff View
diff_original_header: "Текущий файл (Оригинал)",
diff_conflict_header: "Конфликтующая версия",
diff_loading: "Загружаю содержимое файла...",
diff_original_missing: "(Оригинальный файл удален или не был найден)",
diff_read_error: "Ошибка при чтении содержимого файла.",
// Ignore (.stignore)
setting_ignore_name: "Шаблон игнорирования (.stignore)",
setting_ignore_desc:
"Редактируйте .stignore файл, чтобы предотвратить синхронизацию конкретных файлов (например настройки пространств) между устройствами.",
btn_edit_ignore: "Редактировать .stignore",
// Ignore Modal
modal_ignore_title: "Редактирование .stignore",
modal_ignore_desc:
"Файлы или шаблоны вписанные ниже будут полностью проигнорированы Syncthing.",
header_ignore_templates: "Встроенные Шаблоны:",
ignore_help_text:
'Нажмите "Добавить", чтобы включить общие правила, предотвращающие проблемы синхронизации между ПК и мобильным устройством.',
ignore_pattern_workspace_label: "Настройки рабочей среды",
ignore_pattern_workspace_desc:
"Важно! Игнорирует позиции открытых окон и вкладок (избегает визуальных конфликтов между ПК и мобильным устройством).",
ignore_pattern_installer_label: "Кэш установщика",
ignore_pattern_installer_desc:
"Игнорирует временные файлы обновлений Obsidian.",
ignore_pattern_hidden_label: "Скрытые файлы",
ignore_pattern_hidden_desc:
"Игнорирует системные файлы (например, .ds_store на mac или thumbs.db на Windows).",
btn_add_ignore: "Добавить",
btn_save_ignore: "Сохранить изменения",
notice_ignore_saved: ".stignore успешно сохранен.",
notice_ignore_exists: "Это правило уже в есть в списке.",
notice_ignore_added: "Добавлено: ",
notice_ignore_error: "Ошибка сохранения .stignore",
// Conflict Alert (View)
alert_conflict_detected: "Обнаружен конфликт(ы)!",
alert_click_to_resolve: "Нажмите здесь, чтобы решить",
// Placeholders
explorer_sync_tooltip: "Синхронизировать этот файл",
// About
setting_header_about: "О плагине",
setting_version_name: "Версия",
setting_version_tooltip: "Просмотреть заметки к выпуску",
setting_github_desc: "Исходный код или сообщение об ошибке.",
btn_github_repo: "Репозиторий GitHub",
btn_report_bug: "Сообщить об ошибке",
// Versions
modal_versions_title: "Версии файла",
modal_versions_empty: "Предыдущие версии не найдены.",
btn_restore: "Восстановить",
notice_version_restored: "Версия успешно восстановлена.",
notice_restore_fail: "Не удалось восстановить версию.",
confirm_restore:
"Вы уверены, что хотите восстановить версию от {date}? Текущее содержимое будет перезаписано.",
cmd_view_versions: "Версии файла",
btn_cancel: "Отмена",
modal_confirm_title: "Подтверждение",
// Context Menu
modal_context_menu_title: "Контекстное меню",
btn_manage_context_menu: "Управление контекстным меню",
setting_group_context_menu_name: "Группировка элементов",
setting_group_context_menu_desc:
"Группировать все элементы syncthing в одно подменю.",
header_context_menu_items: "Элементы",
btn_view_version: "Просмотр содержимого",
cmd_sync_file: "Синхронизировать файл",
cmd_ignore_file: "Не синхронизировать это",
notice_ignored_success: "Добавлено в .stignore",
notice_ignored_error: "Не удалось добавить в .stignore",
// Debug
setting_debug_mode_name: "Режим отладки",
setting_debug_mode_desc: "Включить подробное логирование в консоли (dev).",
tooltip_configure_modules: "Настроить модули",
modal_debug_title: "Конфигурация отладки",
modal_debug_desc: "Выберите модули, которые будут выводить логи в консоль.",
// Отчёт об отладке
debug_report_title: "Отчёт об отладке",
debug_report_desc:
"Скопируйте информацию ниже и вставьте в отчёт об ошибке.",
debug_report_copy: "Копировать в буфер обмена",
debug_report_copied: "Информация скопирована!",
debug_report_open_issue: "Открыть Issue на GitHub",
debug_report_no_errors: "Нет недавних ошибок или предупреждений.",
btn_debug_report: "Отчёт об отладке",
// Уровни логов
setting_log_level_name: "Уровень логов",
setting_log_level_desc:
"Установите минимальную серьёзность логов для захвата.",
log_level_off: "Выключено",
log_level_error: "Только ошибки",
log_level_warn: "Предупреждения + ошибки",
log_level_debug: "Все (отладка)",
// Консоль отладки
debug_console_title: "Консоль отладки",
debug_console_empty: "Логи пока не захвачены.",
debug_console_clear: "Очистить",
btn_open_console: "Открыть консоль",
debug_console_filter_level: "Минимальный уровень",
debug_console_filter_modules: "Модули",
// Versioning
modal_versioning_title: "Версионирование файлов",
versioning_type: "Стратегия версионирования",
versioning_type_desc:
"Выберите метод для сохранения предыдущих версий файлов.",
versioning_none: "Без версионирования",
versioning_trashcan: "Корзина (Trash can)",
versioning_simple: "Простое (Simple)",
versioning_staggered: "Поэтапное (Staggered)",
versioning_external: "Внешнее (External)",
versioning_cleanout_days: "Очищать через (дней)",
versioning_cleanout_days_desc:
"Дней хранить файлы в корзине. 0 означает вечно.",
versioning_keep: "Хранить версий",
versioning_keep_desc: "Количество версий для хранения.",
versioning_max_age: "Максимальный возраст (дней)",
versioning_max_age_desc: "Максимальный возраст версий для хранения.",
versioning_clean_interval: "Интервал очистки (секунды)",
versioning_clean_interval_desc: "Интервал между очисткой старых версий.",
versioning_command: "Команда",
versioning_command_desc: "Внешняя команда для выполнения версионирования.",
btn_save: "Сохранить",
notice_versioning_saved: "Конфигурация версионирования сохранена.",
notice_versioning_error:
"Не удалось сохранить конфигурацию версионирования.",
setting_file_versioning_name: "Версионирование файлов",
setting_file_versioning_desc:
"Настройте, как Syncthing сохраняет предыдущие версии ваших файлов.",
btn_configure: "Настроить",
// Connection Check
notice_folder_missing:
"Папка Syncthing не найдена. Пожалуйста, выберите её заново в настройках.",
notice_folder_migration:
"Конфигурация папки устарела. Пожалуйста, выберите папку хранилища заново в настройках Syncthing.",
// Dynamic UI Strings
notice_resuming: "Возобновление синхронизации...",
notice_pausing: "Приостановка синхронизации...",
notice_is_paused: "Синхронизация приостановлена.",
loading_versions: "Загрузка версий...",
loading_config: "Загрузка конфигурации...",
error_folder_not_found: "Папка не найдена в конфигурации.",
saving: "Сохранение...",
error_loading_versions: "Ошибка загрузки версий. Проверьте консоль.",
tab_syncing: "Синхронизация...",
tab_synced: "Синхронизировано!",
conflict_delete_error: "Ошибка удаления файла.",
conflict_restore_error: "Ошибка восстановления конфликта.",
};

View file

@ -896,7 +896,7 @@ export default class SyncthingController extends Plugin {
}
});
} catch (error) {
Logger.error(LOG_MODULES.MAIN, "Failed to fetch history", error);
Logger.error(LOG_MODULES.MAIN, "Failed to Fetch History", error);
}
}
}

View file

@ -39,28 +39,41 @@ export class SyncthingSettingTab extends PluginSettingTab {
.setName(t("setting_header_general"))
.setHeading();
new Setting(containerEl)
const langSetting = new Setting(containerEl)
.setName(t("setting_lang_name"))
.setDesc(t("setting_lang_desc"))
.addDropdown((dropDown) => {
LANGUAGE_LIST.forEach((lang) => {
dropDown.addOption(lang.code, lang.display);
});
.setDesc(t("setting_lang_desc"));
dropDown.setValue(this.plugin.settings.language);
dropDown.onChange((value) => {
void (async () => {
this.plugin.settings.language = value;
await this.plugin.saveSettings();
setLanguage(value);
this.plugin.app.workspace.trigger(
"syncthing:status-changed",
);
this.display();
})();
});
langSetting.addDropdown((dropDown) => {
LANGUAGE_LIST.forEach((lang) => {
dropDown.addOption(lang.code, lang.display);
});
dropDown.setValue(this.plugin.settings.language);
dropDown.onChange((value) => {
void (async () => {
this.plugin.settings.language = value;
await this.plugin.saveSettings();
setLanguage(value);
this.plugin.app.workspace.trigger(
"syncthing:status-changed",
);
this.display();
})();
});
});
langSetting.addExtraButton((btn) => {
btn.setIcon("languages")
.setTooltip(
t("tooltip_help_translate") || "Help translate via Crowdin",
)
.onClick(() => {
window.open(
"https://crowdin.com/project/obsidian-syncthing-manager",
);
});
});
// CONEXÃO
new Setting(containerEl).setName(t("setting_header_conn")).setHeading();

26
tests/i18n.test.ts Normal file
View file

@ -0,0 +1,26 @@
import { describe, it, expect } from "vitest";
import en from "../src/lang/locales/en.json";
import pt from "../src/lang/locales/pt.json";
import ru from "../src/lang/locales/ru.json";
describe("Translations", () => {
it("todos os idiomas devem ter as mesmas chaves que o inglês", () => {
const baseKeys = Object.keys(en);
const locales = [
{ name: "PT", data: pt },
{ name: "RU", data: ru },
];
locales.forEach((locale) => {
const localeKeys = Object.keys(locale.data);
const missingKeys = baseKeys.filter(
(key) => !localeKeys.includes(key),
);
expect(
missingKeys,
`Faltam chaves no idioma ${locale.name}`,
).toEqual([]);
});
});
});

View file

@ -0,0 +1,55 @@
import { describe, it, expect } from "vitest";
import en from "../src/lang/locales/en.json";
// Importa o utilitário do ESLint do Obsidian para verificar Sentence Case
import { evaluateSentenceCase } from "eslint-plugin-obsidianmd/dist/lib/rules/ui/sentenceCaseUtil.js";
describe("Sentence Case Validation", () => {
it("en.json deve seguir o padrão Sentence case do Obsidian", () => {
const errors: string[] = [];
const options = {
brands: [
"Syncthing",
"Obsidian",
"GitHub",
"Android",
"Mac",
"Windows",
"macOS",
"Crowdin",
],
acronyms: [
"OK",
"API",
"URL",
"HTTPS",
"HTTP",
"TLS",
"IP",
"ID",
"GUI",
],
enforceCamelCaseLower: true,
};
for (const [key, value] of Object.entries(
en as Record<string, string>,
)) {
if (typeof value === "string") {
const result = evaluateSentenceCase(value, options);
if (!result.ok) {
errors.push(
`Chave '${key}': esperado "${result.suggestion}", mas recebeu "${value}"`,
);
}
}
}
if (errors.length > 0) {
console.error(
"Erros de Sentence Case encontrados:\n",
errors.join("\n"),
);
}
expect(errors.length).toBe(0);
});
});

View file

@ -11,6 +11,8 @@
"importHelpers": true,
"isolatedModules": true,
"strictNullChecks": true,
"resolveJsonModule": true,
"allowSyntheticDefaultImports": true,
"lib": ["DOM", "ES5", "ES6", "ES7"]
},
"include": ["**/*.ts"],