Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/ISSUE_TEMPLATE/bug-report.yml
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ body:
- type: textarea
id: logs
attributes:
label: Support Log
label: Logs
description: Please go to plugin settings - `Development` - `Export logs`, click `Export to note`, copy and paste the content of the full log. This will be automatically formatted into code, so no need for backticks.
render: shell
placeholder: If the support log contains information that you think is improper to disclose, only pasting lines with `ERROR` labels is OK.
Expand Down
2 changes: 1 addition & 1 deletion manifest.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"id": "sync-engine",
"name": "Sync Engine",
"version": "3.0.2",
"version": "3.0.3",
"minAppVersion": "1.12.3",
"authorUrl": "https://hesprs.github.io",
"description": "The next-generation syncing plugin: Fast · Free · Extend with Modules. Supports WebDAV and S3.",
Expand Down
20 changes: 10 additions & 10 deletions modules.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
{
"id": "webdav",
"name": "WebDAV",
"version": "0.1.7",
"version": "0.1.8",
"description": "WebDAV backend support.",
"icon": "server",
"main": "https://sync.consensia.cc/modules/webdav.js",
Expand All @@ -11,7 +11,7 @@
{
"id": "s3",
"name": "S3",
"version": "0.0.1",
"version": "0.0.2",
"description": "S3 and S3-compatible backend support.",
"icon": "server",
"main": "https://sync.consensia.cc/modules/s3.js",
Expand All @@ -20,7 +20,7 @@
{
"id": "encryption",
"name": "Encryption",
"version": "0.1.0",
"version": "0.1.1",
"description": "Client-side encrypt vault files before uploading to backend.",
"icon": "key-round",
"main": "https://sync.consensia.cc/modules/encryption.js",
Expand All @@ -29,34 +29,34 @@
{
"id": "i18n-zh",
"name": "I18n 简体中文",
"version": "0.0.9",
"version": "0.0.10",
"description": "Simplified Chinese UI language pack. / 简体中文介面语言包。",
"icon": "languages",
"main": "https://sync.consensia.cc/modules/i18n-zh.js",
"minPluginVersion": "3.0.0"
"minPluginVersion": "3.0.3"
},
{
"id": "i18n-zh-TW",
"name": "I18n 繁體中文",
"version": "0.0.1",
"version": "0.0.2",
"description": "Traditional Chinese UI language pack. / 繁體中文介面語言包。",
"icon": "languages",
"main": "https://sync.consensia.cc/modules/i18n-zh-TW.js",
"minPluginVersion": "3.0.0"
"minPluginVersion": "3.0.3"
},
{
"id": "i18n-ru",
"name": "I18n Русский",
"version": "0.0.1",
"version": "0.0.2",
"description": "Russian UI language pack. / Пакет русского интерфейса.",
"icon": "languages",
"main": "https://sync.consensia.cc/modules/i18n-ru.js",
"minPluginVersion": "3.0.0"
"minPluginVersion": "3.0.3"
},
{
"id": "smart-merge",
"name": "Smart Merge",
"version": "0.0.5",
"version": "0.0.6",
"description": "Smart merge conflict resolution strategy that applies recursive three-way merge.",
"icon": "combine",
"main": "https://sync.consensia.cc/modules/smart-merge.js",
Expand Down
90 changes: 90 additions & 0 deletions packages/encryption/src/i18n.ts
Original file line number Diff line number Diff line change
Expand Up @@ -75,3 +75,93 @@ export const zh: EncryptionTranslations = {
}
},
};

export const zhTW: EncryptionTranslations = {
encryption: '加密',
encryptionDescription:
'在上傳前加密檔案,並在下載時解密檔案。加密密碼儲存於 Obsidian 金鑰圈中。',
encryptionMigration: (frag, mode) => {
if (mode === 'enable') {
frag.createEl('p', {
text: '⚠️ 在啟用加密前,請務必留意以下幾點:',
});
const ol = frag.createEl('ol');
ol.createEl('li', { text: '後續的所有上傳都將進行加密。' });
ol.createEl('li', { text: '請確保所有裝置皆已啟用加密。' });
ol.createEl('li', {
text: '若您先前曾於未加密的狀態下進行同步,則必須執行遷移。',
});
const li = ol.createEl('li', {
text: '您應確保所有裝置上的以下項目完全一致:',
});
const ul = li.createEl('ul');
const subItems = ['加密密碼', '伺服器 URL', '帳號名稱'];
subItems.forEach((item) => ul.createEl('li', { text: item }));
ol.createEl('li', {
text: '加密演算法會將解密金鑰與檔案位置及伺服器識別資訊綁定,這能提供極佳的安全性與資料完整性。但也意味著若您使用不同的伺服器,或在未透過相同演算法的情況下將檔案移動至不同位置,您將無法解密該檔案。',
});
ol.createEl('li', {
text: '請避免在伺服器端手動管理加密檔案。',
});
} else {
frag.createEl('p', {
text: '⚠️ 在停用加密前,請務必留意以下幾點:',
});
const ol = frag.createEl('ol');
ol.createEl('li', {
text: '後續的所有上傳都將以未加密的明文形式進行。',
});
ol.createEl('li', { text: '請確保所有裝置皆已停用加密。' });
ol.createEl('li', {
text: '若此儲存庫先前是在啟用加密的狀態下上傳,則必須執行遷移。',
});
}
},
};

export const ru: EncryptionTranslations = {
encryption: 'Шифрование',
encryptionDescription:
'Шифровать файлы перед загрузкой на сервер и расшифровывать их при скачивании. Пароль шифрования хранится в связке ключей Obsidian keychain.',
encryptionMigration: (frag, mode) => {
if (mode === 'enable') {
frag.createEl('p', {
text: '⚠️ Пожалуйста, будьте внимательны к следующим моментам перед включением шифрования:',
});
const ol = frag.createEl('ol');
ol.createEl('li', { text: 'Все последующие загрузки будут зашифрованы.' });
ol.createEl('li', {
text: 'Пожалуйста, убедитесь, что шифрование включено на всех устройствах.',
});
ol.createEl('li', {
text: 'Миграция необходима, если ранее вы синхронизировали данные без шифрования.',
});
const li = ol.createEl('li', {
text: 'Убедитесь, что следующие параметры совпадают на всех ваших устройствах:',
});
const ul = li.createEl('ul');
const subItems = ['пароль шифрования', 'URL-адрес сервера', 'имя аккаунта'];
subItems.forEach((item) => ul.createEl('li', { text: item }));
ol.createEl('li', {
text: 'Алгоритм шифрования привязывает ключ расшифровки к расположению файла и идентификатору сервера, что обеспечивает гораздо более высокую безопасность и целостность данных. Но это также означает, что при использовании другого сервера или перемещении файла в другое место без использования того же алгоритма вы не сможете его расшифровать.',
});
ol.createEl('li', {
text: 'Пожалуйста, избегайте ручного управления зашифрованными файлами на сервере.',
});
} else {
frag.createEl('p', {
text: '⚠️ Пожалуйста, будьте внимательны к следующим моментам перед отключением шифрования:',
});
const ol = frag.createEl('ol');
ol.createEl('li', {
text: 'Все последующие загрузки будут выполняться в открытом виде без шифрования.',
});
ol.createEl('li', {
text: 'Пожалуйста, убедитесь, что шифрование отключено на всех устройствах.',
});
ol.createEl('li', {
text: 'Миграция необходима, если это хранилище (vault) ранее загружалось с включённым шифрованием.',
});
}
},
};
4 changes: 3 additions & 1 deletion packages/encryption/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import type {
import type { App } from 'obsidian';
import type { EncryptionDB } from '@/wrapper';
import encryptionWrapper from '@/wrapper';
import { en, zh } from './i18n';
import { en, zh, ru, zhTW } from './i18n';
import encryptionSetting from './setting';

export type EncryptionSettings = {
Expand All @@ -31,6 +31,8 @@ export default class Encryption {
) {
ctx.registerI18n('en', en);
ctx.registerI18n('zh', zh);
ctx.registerI18n('ru', ru);
ctx.registerI18n('zh-TW', zhTW);
}

moduleSettings: EncryptionSettings = {
Expand Down
6 changes: 3 additions & 3 deletions packages/encryption/src/setting.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import type { EncryptionSettings } from '@';
import type { Context, Fragment, Translate } from '@hesprs/sync-engine-sdk';
import type { Context, Fragment, MaybePromise, Translate } from '@hesprs/sync-engine-sdk';
import type { App } from 'obsidian';
import { setNeedMigration } from '@hesprs/sync-engine-sdk';
import { SecretComponent, Setting } from 'obsidian';
Expand All @@ -16,7 +16,7 @@ export default function encryptionSetting(
translate: Translate<EncryptionTranslations>;
app: App;
saveSettings: () => Promise<void>;
recordStoreExists: () => Promise<boolean>;
recordStoreExists: () => MaybePromise<boolean>;
},
settings: EncryptionSettings,
) {
Expand All @@ -38,7 +38,7 @@ export default function encryptionSetting(
void saveSettings();
},
content: (value) => translate('encryptionMigration', value ? 'enable' : 'disable'),
needMigration: () => recordStoreExists(),
needMigration: recordStoreExists,
toggle: toggle.setValue(settings.enabled),
}),
);
Expand Down
20 changes: 15 additions & 5 deletions packages/i18n/src/ru/translations.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ const ru: Translations = {
add: 'Добавить',
addRecord: 'Добавить запись',
addSecretHeader: 'Добавить секретный заголовок',
allRecordsCleared: 'Все записи очищены',
asymmetricStorage: 'Асимметричное хранилище',
asymmetricStorageDescription: (frag) => {
frag.appendText('Используйте ');
Expand Down Expand Up @@ -59,11 +58,10 @@ const ru: Translations = {
checkConnection: 'Проверить соединение',
checkConnectionFailed: 'Ошибка проверки соединения',
checkConnectionSuccess: 'Соединение успешно проверено',
clearAllRecords: 'Очистить все записи',
clear: 'Очистить',
clearRecords: 'Очистить записи',
clearRecordsDescription:
'Sync Engine записывает состояния синхронизации для разрешения операций между локальными и удалёнными файлами. Эта опция позволяет выборочно очищать записи. Внимание: это действие может привести к потере данных.',
clearVaultRecords: 'Очистить записи хранилища',
completed: 'Завершено',
completedNoop: 'Уже синхронизировано',
configurations: 'Конфигурации',
Expand All @@ -74,7 +72,19 @@ const ru: Translations = {
confirmDeleteInAutoSync: 'Подтверждать удаления при автосинхронизации',
confirmDeleteInAutoSyncDescription:
'Показывать подтверждение для локальных файлов, которые будут удалены во время автоматической синхронизации. Вы сможете выбрать: удалить их или загрузить повторно.',
confirmTasksDescription: 'Пожалуйста, подтвердите операции ниже.',
confirmTasksDescription: (frag) => {
frag.appendText('Пожалуйста, подтвердите операции ниже: ');
frag.createSpan({ cls: 'color-[--color-green] font-bold', text: 'зелёный' });
frag.appendText(' значок означает локальную операцию; ');
frag.createSpan({ cls: 'color-[--color-blue] font-bold', text: 'синий' });
frag.appendText(' — удалённую операцию; ');
frag.createSpan({ cls: 'color-[--color-red] font-bold', text: 'красный' });
frag.appendText(' — локальное удаление; ');
frag.createSpan({ cls: 'color-[--color-pink] font-bold', text: 'розовый' });
frag.appendText(' — удалённое удаление; а ');
frag.createSpan({ cls: 'color-[--color-yellow] font-bold', text: 'жёлтый' });
frag.appendText(' — разрешение конфликта.');
},
confirmTasksInSync: 'Подтверждать операции при ручной синхронизации',
confirmTasksInSyncDescription:
'Показывать ожидающие операции и выполнять их только после подтверждения (не влияет на автосинхронизацию).',
Expand Down Expand Up @@ -207,6 +217,7 @@ const ru: Translations = {
realtimeSyncFastModeDescription:
'Использовать кэшированные данные и избегать лишней проверки удалённых файлов во время синхронизации в реальном времени для ускорения процесса.',
realtimeSyncPlaceholder: 'Введите задержку (например, 500ms, 5s)',
recordsCleared: 'Записи очищены',
remoteMigration: 'Миграция удалённого хранилища',
remove: 'Удалить',
removeLocal: 'Удалить локальный файл',
Expand Down Expand Up @@ -285,7 +296,6 @@ const ru: Translations = {
'Укажите источник, из которого этот модуль будет получать обновления. Оставьте поле пустым, чтобы отключить обновления.',
updateSourcePlaceholder: 'https://example.com/modules.json',
upload: 'Загрузить',
vaultRecordsCleared: 'Записи хранилища очищены',
walkingRemote: 'Сканирование удалённых файлов',
};

Expand Down
20 changes: 15 additions & 5 deletions packages/i18n/src/zh-TW/translations.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ const zhTW: Translations = {
add: '新增',
addRecord: '新增紀錄',
addSecretHeader: '新增加密標頭',
allRecordsCleared: '已清除所有紀錄',
asymmetricStorage: '非對稱儲存',
asymmetricStorageDescription: (frag) => {
frag.appendText('使用');
Expand Down Expand Up @@ -59,11 +58,10 @@ const zhTW: Translations = {
checkConnection: '測試連線',
checkConnectionFailed: '連線測試失敗',
checkConnectionSuccess: '連線測試成功',
clearAllRecords: '清除所有紀錄',
clear: '清除',
clearRecords: '清除紀錄',
clearRecordsDescription:
'Sync Engine 會記錄同步狀態以處理本地與遠端檔案之間的變更。此選項允許您選擇性地清除紀錄。警告:此操作可能會導致資料遺失。',
clearVaultRecords: '清除儲存庫紀錄',
completed: '已完成',
completedNoop: '已是最新狀態',
configurations: '設定項目',
Expand All @@ -73,7 +71,19 @@ const zhTW: Translations = {
confirmDeleteInAutoSync: '自動同步時確認刪除',
confirmDeleteInAutoSyncDescription:
'在自動同步過程中刪除本地檔案前顯示確認視窗。您可以選擇刪除或重新上傳。',
confirmTasksDescription: '請確認以下操作。',
confirmTasksDescription: (frag) => {
frag.appendText('請確認以下操作:');
frag.createSpan({ cls: 'color-[--color-green] font-bold', text: '綠色' });
frag.appendText('圖示代表本地操作;');
frag.createSpan({ cls: 'color-[--color-blue] font-bold', text: '藍色' });
frag.appendText('代表遠端操作;');
frag.createSpan({ cls: 'color-[--color-red] font-bold', text: '紅色' });
frag.appendText('代表本地刪除;');
frag.createSpan({ cls: 'color-[--color-pink] font-bold', text: '粉紅色' });
frag.appendText('代表遠端刪除;而');
frag.createSpan({ cls: 'color-[--color-yellow] font-bold', text: '黃色' });
frag.appendText('則代表衝突解決。');
},
confirmTasksInSync: '手動同步時確認操作',
confirmTasksInSyncDescription: '顯示待處理的操作,並在您確認後執行(不影響自動同步)。',
conflictResolveStrategy: '衝突解決策略',
Expand Down Expand Up @@ -200,6 +210,7 @@ const zhTW: Translations = {
realtimeSyncFastModeDescription:
'在即時同步過程中重複使用快取資料並跳過不必要的遠端掃描,以加快同步速度。',
realtimeSyncPlaceholder: '輸入同步延遲(例如 500ms, 5s)',
recordsCleared: '紀錄已清除',
remoteMigration: '遠端遷移',
remove: '移除',
removeLocal: '移除本地',
Expand Down Expand Up @@ -272,7 +283,6 @@ const zhTW: Translations = {
updateSourceDescription: '設定此模組接收更新的模組來源。留空則停用更新。',
updateSourcePlaceholder: 'https://example.com/modules.json',
upload: '上傳',
vaultRecordsCleared: '已清除儲存庫紀錄',
walkingRemote: '正在掃描遠端檔案',
};

Expand Down
20 changes: 15 additions & 5 deletions packages/i18n/src/zh/translations.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ const zh: Translations = {
add: '添加',
addRecord: '添加记录',
addSecretHeader: '添加机密请求头',
allRecordsCleared: '所有记录已清除',
asymmetricStorage: '非对称存储',
asymmetricStorageDescription: (frag) => {
frag.appendText('使用 ');
Expand Down Expand Up @@ -47,11 +46,10 @@ const zh: Translations = {
checkConnection: '测试连接',
checkConnectionFailed: '测试连接失败',
checkConnectionSuccess: '测试连接成功',
clearAllRecords: '清除所有记录',
clear: '清除',
clearRecords: '清除记录',
clearRecordsDescription:
'Sync Engine 会记录同步状态,以便在本地和远程文件之间解析同步操作。此选项允许您选择性地清除记录。警告:此操作很可能会导致数据丢失。',
clearVaultRecords: '清除库记录',
completed: '已完成',
completedNoop: '已是最新状态',
configurations: '配置',
Expand All @@ -61,7 +59,19 @@ const zh: Translations = {
confirmDeleteInAutoSync: '自动同步时确认删除',
confirmDeleteInAutoSyncDescription:
'在自动触发的同步过程中,显示将被删除的本地文件的确认提示。您可以选择删除或重新上传它们。',
confirmTasksDescription: '请确认以下操作。',
confirmTasksDescription: (frag) => {
frag.appendText('请确认以下操作:');
frag.createSpan({ cls: 'color-[--color-green] font-bold', text: '绿色' });
frag.appendText(' 图标表示本地操作;');
frag.createSpan({ cls: 'color-[--color-blue] font-bold', text: '蓝色' });
frag.appendText(' 表示远程操作;');
frag.createSpan({ cls: 'color-[--color-red] font-bold', text: '红色' });
frag.appendText(' 表示本地删除;');
frag.createSpan({ cls: 'color-[--color-pink] font-bold', text: '粉色' });
frag.appendText(' 表示远程删除;');
frag.createSpan({ cls: 'color-[--color-yellow] font-bold', text: '黄色' });
frag.appendText(' 则表示冲突解决。');
},
confirmTasksInSync: '手动同步时确认操作',
confirmTasksInSyncDescription: '显示待处理的操作并在确认后执行(不影响自动同步)。',
conflictResolveStrategy: '冲突解决策略',
Expand Down Expand Up @@ -188,6 +198,7 @@ const zh: Translations = {
realtimeSyncFastModeDescription:
'在实时同步过程中复用缓存数据并避免不必要的远程探测,以加速同步。',
realtimeSyncPlaceholder: '输入同步延迟(例如 500ms, 5s)',
recordsCleared: '记录已清除',
remoteMigration: '远程迁移',
remove: '移除',
removeLocal: '移除本地',
Expand Down Expand Up @@ -259,7 +270,6 @@ const zh: Translations = {
updateSourceDescription: '设置此模块接收更新的模块源。留空以禁用更新。',
updateSourcePlaceholder: 'https://example.com/modules.json',
upload: '上传',
vaultRecordsCleared: '库记录已清除',
walkingRemote: '正在探测远程文件',
};

Expand Down
Loading
Loading