Add sessions support to translation resources and update related logic (#300889)

* Add sessions support to translation resources and update related logic

Fixes https://github.com/microsoft/vscode/issues/300278

* update to track new format of import

* fix failures
This commit is contained in:
Tyler James Leonhardt
2026-03-11 13:38:06 -07:00
committed by GitHub
parent 8f44b60dac
commit 2f42f2e800
4 changed files with 140 additions and 8 deletions

View File

@@ -26,18 +26,19 @@ export default new class TranslationRemind implements eslint.Rule.RuleModule {
private _checkImport(context: eslint.Rule.RuleContext, node: TSESTree.Node, path: string) {
if (path !== TranslationRemind.NLS_MODULE) {
if (path !== TranslationRemind.NLS_MODULE && !path.endsWith('/nls.js')) {
return;
}
const currentFile = context.getFilename();
const matchService = currentFile.match(/vs\/workbench\/services\/\w+/);
const matchPart = currentFile.match(/vs\/workbench\/contrib\/\w+/);
if (!matchService && !matchPart) {
const matchSessionsPart = currentFile.match(/vs\/sessions\/contrib\/\w+/);
if (!matchService && !matchPart && !matchSessionsPart) {
return;
}
const resource = matchService ? matchService[0] : matchPart![0];
const resource = matchService ? matchService[0] : matchPart ? matchPart[0] : matchSessionsPart![0];
let resourceDefined = false;
let json;
@@ -47,9 +48,10 @@ export default new class TranslationRemind implements eslint.Rule.RuleModule {
console.error('[translation-remind rule]: File with resources to pull from Transifex was not found. Aborting translation resource check for newly defined workbench part/service.');
return;
}
const workbenchResources = JSON.parse(json).workbench;
const parsed = JSON.parse(json);
const resources = [...parsed.workbench, ...parsed.sessions];
workbenchResources.forEach((existingResource: any) => {
resources.forEach((existingResource: any) => {
if (existingResource.name === resource) {
resourceDefined = true;
return;

View File

@@ -561,6 +561,120 @@
{
"name": "vs/workbench/contrib/list",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/contrib/browserView",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/contrib/dropOrPasteInto",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/contrib/editTelemetry",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/contrib/inlineCompletions",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/contrib/mcp",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/contrib/meteredConnection",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/contrib/processExplorer",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/contrib/remoteCodingAgents",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/contrib/telemetry",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/contrib/welcomeAgentSessions",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/services/accounts",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/services/chat",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/services/request",
"project": "vscode-workbench"
}
],
"sessions": [
{
"name": "vs/sessions",
"project": "vscode-sessions"
},
{
"name": "vs/sessions/contrib/accountMenu",
"project": "vscode-sessions"
},
{
"name": "vs/sessions/contrib/agentFeedback",
"project": "vscode-sessions"
},
{
"name": "vs/sessions/contrib/aiCustomizationTreeView",
"project": "vscode-sessions"
},
{
"name": "vs/sessions/contrib/applyCommitsToParentRepo",
"project": "vscode-sessions"
},
{
"name": "vs/sessions/contrib/changes",
"project": "vscode-sessions"
},
{
"name": "vs/sessions/contrib/chat",
"project": "vscode-sessions"
},
{
"name": "vs/sessions/contrib/codeReview",
"project": "vscode-sessions"
},
{
"name": "vs/sessions/contrib/fileTreeView",
"project": "vscode-sessions"
},
{
"name": "vs/sessions/contrib/files",
"project": "vscode-sessions"
},
{
"name": "vs/sessions/contrib/git",
"project": "vscode-sessions"
},
{
"name": "vs/sessions/contrib/logs",
"project": "vscode-sessions"
},
{
"name": "vs/sessions/contrib/sessions",
"project": "vscode-sessions"
},
{
"name": "vs/sessions/contrib/terminal",
"project": "vscode-sessions"
},
{
"name": "vs/sessions/contrib/welcome",
"project": "vscode-sessions"
}
]
}

View File

@@ -391,7 +391,8 @@ const editorProject: string = 'vscode-editor',
workbenchProject: string = 'vscode-workbench',
extensionsProject: string = 'vscode-extensions',
setupProject: string = 'vscode-setup',
serverProject: string = 'vscode-server';
serverProject: string = 'vscode-server',
sessionsProject: string = 'vscode-sessions';
export function getResource(sourceFile: string): Resource {
let resource: string;
@@ -416,6 +417,11 @@ export function getResource(sourceFile: string): Resource {
return { name: resource, project: workbenchProject };
} else if (/^vs\/workbench/.test(sourceFile)) {
return { name: 'vs/workbench', project: workbenchProject };
} else if (/^vs\/sessions\/contrib/.test(sourceFile)) {
resource = sourceFile.split('/', 4).join('/');
return { name: resource, project: sessionsProject };
} else if (/^vs\/sessions/.test(sourceFile)) {
return { name: 'vs/sessions', project: sessionsProject };
}
throw new Error(`Could not identify the XLF bundle for ${sourceFile}`);
@@ -737,6 +743,11 @@ export function prepareI18nPackFiles(resultingTranslationPaths: TranslationPath[
if (EXTERNAL_EXTENSIONS.find(e => e === resource)) {
project = extensionsProject;
}
// TODO(tyleonha): Support localization for the Sessions app (https://github.com/microsoft/vscode-internalbacklog/issues/7045)
// vscode-setup has its own import path via prepareIslFiles
if (project === sessionsProject || project === setupProject) {
return;
}
const contents = xlf.contents!.toString();
log(`Found ${project}: ${resource}`);
const parsePromise = getL10nFilesFromXlf(contents);

View File

@@ -31,7 +31,8 @@ suite('XLF Parser Tests', () => {
test('JSON file source path to Transifex resource match', () => {
const editorProject: string = 'vscode-editor',
workbenchProject: string = 'vscode-workbench';
workbenchProject: string = 'vscode-workbench',
sessionsProject: string = 'vscode-sessions';
const platform: i18n.Resource = { name: 'vs/platform', project: editorProject },
editorContrib = { name: 'vs/editor/contrib', project: editorProject },
@@ -40,7 +41,9 @@ suite('XLF Parser Tests', () => {
code = { name: 'vs/code', project: workbenchProject },
workbenchParts = { name: 'vs/workbench/contrib/html', project: workbenchProject },
workbenchServices = { name: 'vs/workbench/services/textfile', project: workbenchProject },
workbench = { name: 'vs/workbench', project: workbenchProject };
workbench = { name: 'vs/workbench', project: workbenchProject },
sessionsContrib = { name: 'vs/sessions/contrib/chat', project: sessionsProject },
sessions = { name: 'vs/sessions', project: sessionsProject };
assert.deepStrictEqual(i18n.getResource('vs/platform/actions/browser/menusExtensionPoint'), platform);
assert.deepStrictEqual(i18n.getResource('vs/editor/contrib/clipboard/browser/clipboard'), editorContrib);
@@ -50,5 +53,7 @@ suite('XLF Parser Tests', () => {
assert.deepStrictEqual(i18n.getResource('vs/workbench/contrib/html/browser/webview'), workbenchParts);
assert.deepStrictEqual(i18n.getResource('vs/workbench/services/textfile/node/testFileService'), workbenchServices);
assert.deepStrictEqual(i18n.getResource('vs/workbench/browser/parts/panel/panelActions'), workbench);
assert.deepStrictEqual(i18n.getResource('vs/sessions/contrib/chat/browser/chatWidget'), sessionsContrib);
assert.deepStrictEqual(i18n.getResource('vs/sessions/browser/layoutActions'), sessions);
});
});