feat: localize official plugins in Russian

This commit is contained in:
2026-07-11 12:42:37 +08:00
parent 077de94e61
commit 3dd0ec9f1f
57 changed files with 1478 additions and 330 deletions
+21 -10
View File
@@ -315,6 +315,11 @@
var statusEl = null;
var alertEl = null;
var resultsEl = null;
function tr(key, params, fallback) {
if (api && api.i18n && typeof api.i18n.t === 'function') return api.i18n.t(key, params, fallback);
return fallback || key;
}
state.status = tr('ui.minChars', null, 'Enter at least 2 characters.');
function ensureLayout() {
if (input) return;
@@ -325,7 +330,7 @@
input = el('input', {
className: 'search-input',
type: 'search',
placeholder: 'Search files, folders, text',
placeholder: tr('ui.placeholder', null, 'Search files, folders, text'),
value: state.query,
'data-search-input': 'query',
onInput: function (event) {
@@ -341,7 +346,7 @@
containerEl.appendChild(el('div', { className: 'search-toolbar' }, [
input,
button,
el('span', { className: 'search-scope', title: rootPath || 'Vault' }, [rootPath || 'Vault'])
el('span', { className: 'search-scope', title: rootPath || tr('ui.vault', null, 'Vault') }, [rootPath || tr('ui.vault', null, 'Vault')])
]));
statusEl = el('div', { className: 'search-status' });
@@ -357,7 +362,7 @@
if (document.activeElement !== input && input.value !== state.query) {
input.value = state.query;
}
button.textContent = state.searching ? 'Searching...' : 'Search';
button.textContent = state.searching ? tr('ui.searching', null, 'Searching...') : tr('ui.search', null, 'Search');
button.disabled = !!state.searching;
statusEl.className = 'search-status' + (state.error ? ' error' : '');
statusEl.textContent = state.error || state.status;
@@ -365,7 +370,7 @@
if (state.providerErrors && state.providerErrors.length) {
if (typeof alertEl.removeAttribute === 'function') alertEl.removeAttribute('hidden');
alertEl.appendChild(el('details', {}, [
el('summary', {}, ['Some plugin search providers did not respond']),
el('summary', {}, [tr('ui.providersFailed', null, 'Some plugin search providers did not respond')]),
el('div', {}, [state.providerErrors.join('; ')])
]));
} else if (typeof alertEl.setAttribute === 'function') {
@@ -373,7 +378,7 @@
}
resultsEl.innerHTML = '';
if (!state.results.length) {
resultsEl.appendChild(el('div', { className: 'search-empty' }, [state.searching ? 'Searching...' : 'No results']));
resultsEl.appendChild(el('div', { className: 'search-empty' }, [state.searching ? tr('ui.searching', null, 'Searching...') : tr('ui.noResults', null, 'No results')]));
return;
}
state.results.forEach(function (result) {
@@ -391,7 +396,7 @@
]),
result.openable ? el('button', {
className: 'search-btn search-open-btn',
textContent: 'Open',
textContent: tr('ui.open', null, 'Open'),
'data-search-open': result.path,
onClick: function () {
api.workbench.openResource({
@@ -415,7 +420,7 @@
if (query.length < 2) {
state.searching = false;
state.results = [];
state.status = 'Enter at least 2 characters.';
state.status = tr('ui.minChars', null, 'Enter at least 2 characters.');
state.error = '';
state.providerErrors = [];
render();
@@ -432,7 +437,7 @@
state.query = String(state.query || '').trim();
if (state.query.length < 2) {
state.results = [];
state.status = 'Enter at least 2 characters.';
state.status = tr('ui.minChars', null, 'Enter at least 2 characters.');
state.error = '';
state.providerErrors = [];
render();
@@ -441,7 +446,7 @@
state.searching = true;
state.error = '';
state.providerErrors = [];
state.status = 'Searching...';
state.status = tr('ui.searching', null, 'Searching...');
var seq = searchSeq + 1;
searchSeq = seq;
render();
@@ -451,7 +456,7 @@
var external = await runExternalProviders(api, rootPath, state.query, MAX_RESULTS - results.length);
if (seq !== searchSeq) return;
state.results = results.concat(external.results);
state.status = state.results.length + ' result' + (state.results.length === 1 ? '' : 's');
state.status = tr('ui.count', { count: state.results.length }, state.results.length + ' result' + (state.results.length === 1 ? '' : 's'));
state.providerErrors = external.errors;
} catch (err) {
if (seq !== searchSeq) return;
@@ -507,6 +512,12 @@
setupIntegrations();
render();
if (api.i18n && typeof api.i18n.onDidChangeLocale === 'function') {
cleanupFns.push(api.i18n.onDidChangeLocale(function () {
if (input) input.setAttribute('placeholder', tr('ui.placeholder', null, 'Search files, folders, text'));
render();
}));
}
containerEl.__verstakSearchCleanup = function () {
if (searchTimer) clearTimeout(searchTimer);
searchSeq += 1;