Skip to content

Commit cd29f75

Browse files
authored
Adopt l10n for markdown extension (microsoft#165448)
For microsoft#164438 Also makes our eslint rules understand `vscode.l10n.t(`
1 parent e764c5b commit cd29f75

File tree

12 files changed

+62
-78
lines changed

12 files changed

+62
-78
lines changed

.eslintplugin/code-no-unexternalized-strings.ts

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,27 @@ export = new class NoUnexternalizedStrings implements eslint.Rule.RuleModule {
8585
}
8686
}
8787

88+
function visitL10NCall(node: TSESTree.CallExpression) {
89+
90+
// localize(key, message)
91+
const [messageNode] = (<TSESTree.CallExpression>node).arguments;
92+
93+
// remove message-argument from doubleQuoted list and make
94+
// sure it is a string-literal
95+
if (isStringLiteral(messageNode)) {
96+
doubleQuotedStringLiterals.delete(messageNode);
97+
} else if (messageNode.type === AST_NODE_TYPES.ObjectExpression) {
98+
for (const prop of messageNode.properties) {
99+
if (prop.type === AST_NODE_TYPES.Property) {
100+
if (prop.key.type === AST_NODE_TYPES.Identifier && prop.key.name === 'message') {
101+
doubleQuotedStringLiterals.delete(prop.value);
102+
break;
103+
}
104+
}
105+
}
106+
}
107+
}
108+
88109
function reportBadStringsAndBadKeys() {
89110
// (1)
90111
// report all strings that are in double quotes
@@ -118,6 +139,7 @@ export = new class NoUnexternalizedStrings implements eslint.Rule.RuleModule {
118139
['Literal']: (node: any) => collectDoubleQuotedStrings(node),
119140
['ExpressionStatement[directive] Literal:exit']: (node: any) => doubleQuotedStringLiterals.delete(node),
120141
['CallExpression[callee.type="MemberExpression"][callee.object.name="nls"][callee.property.name="localize"]:exit']: (node: any) => visitLocalizeCall(node),
142+
['CallExpression[callee.type="MemberExpression"][callee.object.property.name="l10n"][callee.property.name="t"]:exit']: (node: any) => visitL10NCall(node),
121143
['CallExpression[callee.name="localize"][arguments.length>=2]:exit']: (node: any) => visitLocalizeCall(node),
122144
['Program:exit']: reportBadStringsAndBadKeys,
123145
};

extensions/markdown-language-features/package.json

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -628,7 +628,6 @@
628628
"morphdom": "^2.6.1",
629629
"picomatch": "^2.3.1",
630630
"vscode-languageclient": "^8.0.2",
631-
"vscode-nls": "^5.2.0",
632631
"vscode-uri": "^3.0.3"
633632
},
634633
"devDependencies": {

extensions/markdown-language-features/src/client/client.ts

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,13 @@
55

66
import * as vscode from 'vscode';
77
import { BaseLanguageClient, LanguageClientOptions, NotebookDocumentSyncRegistrationType } from 'vscode-languageclient';
8-
import * as nls from 'vscode-nls';
98
import { IMdParser } from '../markdownEngine';
109
import * as proto from './protocol';
1110
import { looksLikeMarkdownPath, markdownFileExtensions } from '../util/file';
1211
import { VsCodeMdWorkspace } from './workspace';
1312
import { FileWatcherManager } from './fileWatchingManager';
1413
import { IDisposable } from '../util/dispose';
1514

16-
const localize = nls.loadMessageBundle();
1715

1816
export type LanguageClientConstructor = (name: string, description: string, clientOptions: LanguageClientOptions) => BaseLanguageClient;
1917

@@ -64,7 +62,7 @@ export async function startClient(factory: LanguageClientConstructor, parser: IM
6462
},
6563
};
6664

67-
const client = factory('markdown', localize('markdownServer.name', 'Markdown Language Server'), clientOptions);
65+
const client = factory('markdown', vscode.l10n.t("Markdown Language Server"), clientOptions);
6866

6967
client.registerProposedFeatures();
7068

extensions/markdown-language-features/src/commands/insertResource.ts

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,12 @@
44
*--------------------------------------------------------------------------------------------*/
55

66
import * as vscode from 'vscode';
7-
import * as nls from 'vscode-nls';
87
import { Utils } from 'vscode-uri';
98
import { Command } from '../commandManager';
109
import { createUriListSnippet, getParentDocumentUri, imageFileExtensions } from '../languageFeatures/dropIntoEditor';
1110
import { coalesce } from '../util/arrays';
1211
import { Schemes } from '../util/schemes';
1312

14-
const localize = nls.loadMessageBundle();
1513

1614

1715
export class InsertLinkFromWorkspace implements Command {
@@ -27,8 +25,8 @@ export class InsertLinkFromWorkspace implements Command {
2725
canSelectFiles: true,
2826
canSelectFolders: false,
2927
canSelectMany: true,
30-
openLabel: localize('insertLink.openLabel', "Insert link"),
31-
title: localize('insertLink.title', "Insert link"),
28+
openLabel: vscode.l10n.t("Insert link"),
29+
title: vscode.l10n.t("Insert link"),
3230
defaultUri: getDefaultUri(activeEditor.document),
3331
});
3432

@@ -50,10 +48,10 @@ export class InsertImageFromWorkspace implements Command {
5048
canSelectFolders: false,
5149
canSelectMany: true,
5250
filters: {
53-
[localize('insertImage.imagesLabel', "Images")]: Array.from(imageFileExtensions)
51+
[vscode.l10n.t("Images")]: Array.from(imageFileExtensions)
5452
},
55-
openLabel: localize('insertImage.openLabel', "Insert image"),
56-
title: localize('insertImage.title', "Insert image"),
53+
openLabel: vscode.l10n.t("Insert image"),
54+
title: vscode.l10n.t("Insert image"),
5755
defaultUri: getDefaultUri(activeEditor.document),
5856
});
5957

extensions/markdown-language-features/src/languageFeatures/diagnostics.ts

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,8 @@
44
*--------------------------------------------------------------------------------------------*/
55

66
import * as vscode from 'vscode';
7-
import * as nls from 'vscode-nls';
87
import { CommandManager } from '../commandManager';
98

10-
const localize = nls.loadMessageBundle();
119

1210
// Copied from markdown language service
1311
export enum DiagnosticCode {
@@ -55,7 +53,7 @@ class AddToIgnoreLinksQuickFixProvider implements vscode.CodeActionProvider {
5553
const hrefText = (diagnostic as any).data?.hrefText;
5654
if (hrefText) {
5755
const fix = new vscode.CodeAction(
58-
localize('ignoreLinksQuickFix.title', "Exclude '{0}' from link validation.", hrefText),
56+
vscode.l10n.t("Exclude '{0}' from link validation.", hrefText),
5957
vscode.CodeActionKind.QuickFix);
6058

6159
fix.command = {

extensions/markdown-language-features/src/languageFeatures/fileReferences.ts

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,9 @@
55

66
import * as vscode from 'vscode';
77
import type * as lsp from 'vscode-languageserver-types';
8-
import * as nls from 'vscode-nls';
98
import { MdLanguageClient } from '../client/client';
109
import { Command, CommandManager } from '../commandManager';
1110

12-
const localize = nls.loadMessageBundle();
13-
1411

1512
export class FindFileReferencesCommand implements Command {
1613

@@ -23,13 +20,13 @@ export class FindFileReferencesCommand implements Command {
2320
public async execute(resource?: vscode.Uri) {
2421
resource ??= vscode.window.activeTextEditor?.document.uri;
2522
if (!resource) {
26-
vscode.window.showErrorMessage(localize('error.noResource', "Find file references failed. No resource provided."));
23+
vscode.window.showErrorMessage(vscode.l10n.t("Find file references failed. No resource provided."));
2724
return;
2825
}
2926

3027
await vscode.window.withProgress({
3128
location: vscode.ProgressLocation.Window,
32-
title: localize('progress.title', "Finding file references")
29+
title: vscode.l10n.t("Finding file references")
3330
}, async (_progress, token) => {
3431
const locations = (await this._client.getReferencesToFileInWorkspace(resource!, token)).map(loc => {
3532
return new vscode.Location(vscode.Uri.parse(loc.uri), convertRange(loc.range));

extensions/markdown-language-features/src/languageFeatures/linkUpdater.ts

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,12 @@ import * as path from 'path';
77
import * as picomatch from 'picomatch';
88
import * as vscode from 'vscode';
99
import { TextDocumentEdit } from 'vscode-languageclient';
10-
import * as nls from 'vscode-nls';
1110
import { MdLanguageClient } from '../client/client';
1211
import { Delayer } from '../util/async';
1312
import { noopToken } from '../util/cancellation';
1413
import { Disposable } from '../util/dispose';
1514
import { convertRange } from './fileReferences';
1615

17-
const localize = nls.loadMessageBundle();
1816

1917
const settingNames = Object.freeze({
2018
enabled: 'updateLinksOnFileMove.enabled',
@@ -54,7 +52,7 @@ class UpdateLinksOnFileRenameHandler extends Disposable {
5452
this._delayer.trigger(() => {
5553
vscode.window.withProgress({
5654
location: vscode.ProgressLocation.Window,
57-
title: localize('renameProgress.title', "Checking for Markdown links to update")
55+
title: vscode.l10n.t("Checking for Markdown links to update")
5856
}, () => this._flushRenames());
5957
});
6058
}
@@ -121,26 +119,26 @@ class UpdateLinksOnFileRenameHandler extends Disposable {
121119
}
122120

123121
const rejectItem: vscode.MessageItem = {
124-
title: localize('reject.title', "No"),
122+
title: vscode.l10n.t("No"),
125123
isCloseAffordance: true,
126124
};
127125

128126
const acceptItem: vscode.MessageItem = {
129-
title: localize('accept.title', "Yes"),
127+
title: vscode.l10n.t("Yes"),
130128
};
131129

132130
const alwaysItem: vscode.MessageItem = {
133-
title: localize('always.title', "Always"),
131+
title: vscode.l10n.t("Always"),
134132
};
135133

136134
const neverItem: vscode.MessageItem = {
137-
title: localize('never.title', "Never"),
135+
title: vscode.l10n.t("Never"),
138136
};
139137

140138
const choice = await vscode.window.showInformationMessage(
141139
newResources.length === 1
142-
? localize('prompt', "Update Markdown links for '{0}'?", path.basename(newResources[0].fsPath))
143-
: this._getConfirmMessage(localize('promptMoreThanOne', "Update Markdown links for the following {0} files?", newResources.length), newResources), {
140+
? vscode.l10n.t("Update Markdown links for '{0}'?", path.basename(newResources[0].fsPath))
141+
: this._getConfirmMessage(vscode.l10n.t("Update Markdown links for the following {0} files?", newResources.length), newResources), {
144142
modal: true,
145143
}, rejectItem, acceptItem, alwaysItem, neverItem);
146144

@@ -203,9 +201,9 @@ class UpdateLinksOnFileRenameHandler extends Disposable {
203201

204202
if (resourcesToConfirm.length > MAX_CONFIRM_FILES) {
205203
if (resourcesToConfirm.length - MAX_CONFIRM_FILES === 1) {
206-
paths.push(localize('moreFile', "...1 additional file not shown"));
204+
paths.push(vscode.l10n.t("...1 additional file not shown"));
207205
} else {
208-
paths.push(localize('moreFiles', "...{0} additional files not shown", resourcesToConfirm.length - MAX_CONFIRM_FILES));
206+
paths.push(vscode.l10n.t("...{0} additional files not shown", resourcesToConfirm.length - MAX_CONFIRM_FILES));
209207
}
210208
}
211209

extensions/markdown-language-features/src/preview/documentRenderer.ts

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
*--------------------------------------------------------------------------------------------*/
55

66
import * as vscode from 'vscode';
7-
import * as nls from 'vscode-nls';
87
import * as uri from 'vscode-uri';
98
import { ILogger } from '../logging';
109
import { MarkdownItEngine } from '../markdownEngine';
@@ -14,7 +13,6 @@ import { WebviewResourceProvider } from '../util/resources';
1413
import { MarkdownPreviewConfiguration, MarkdownPreviewConfigurationManager } from './previewConfig';
1514
import { ContentSecurityPolicyArbiter, MarkdownPreviewSecurityLevel } from './security';
1615

17-
const localize = nls.loadMessageBundle();
1816

1917
/**
2018
* Strings used inside the markdown preview.
@@ -23,17 +21,11 @@ const localize = nls.loadMessageBundle();
2321
* can be localized using our normal localization process.
2422
*/
2523
const previewStrings = {
26-
cspAlertMessageText: localize(
27-
'preview.securityMessage.text',
28-
'Some content has been disabled in this document'),
24+
cspAlertMessageText: vscode.l10n.t("Some content has been disabled in this document"),
2925

30-
cspAlertMessageTitle: localize(
31-
'preview.securityMessage.title',
32-
'Potentially unsafe or insecure content has been disabled in the Markdown preview. Change the Markdown preview security setting to allow insecure content or enable scripts'),
26+
cspAlertMessageTitle: vscode.l10n.t("Potentially unsafe or insecure content has been disabled in the Markdown preview. Change the Markdown preview security setting to allow insecure content or enable scripts"),
3327

34-
cspAlertMessageLabel: localize(
35-
'preview.securityMessage.label',
36-
'Content Disabled Security Warning')
28+
cspAlertMessageLabel: vscode.l10n.t("Content Disabled Security Warning")
3729
};
3830

3931
export interface MarkdownContentProviderOutput {
@@ -130,7 +122,7 @@ export class MdDocumentRenderer {
130122

131123
public renderFileNotFoundDocument(resource: vscode.Uri): string {
132124
const resourcePath = uri.Utils.basename(resource);
133-
const body = localize('preview.notFound', '{0} cannot be found', resourcePath);
125+
const body = vscode.l10n.t('{0} cannot be found', resourcePath);
134126
return `<!DOCTYPE html>
135127
<html>
136128
<body class="vscode-body">

extensions/markdown-language-features/src/preview/preview.ts

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
*--------------------------------------------------------------------------------------------*/
55

66
import * as vscode from 'vscode';
7-
import * as nls from 'vscode-nls';
87
import * as uri from 'vscode-uri';
98
import { ILogger } from '../logging';
109
import { MarkdownContributionProvider } from '../markdownExtensions';
@@ -18,7 +17,6 @@ import { MarkdownPreviewConfigurationManager } from './previewConfig';
1817
import { scrollEditorToLine, StartingScrollFragment, StartingScrollLine, StartingScrollLocation } from './scrolling';
1918
import { getVisibleLine, LastScrollLocation, TopmostLineMonitor } from './topmostLineMonitor';
2019

21-
const localize = nls.loadMessageBundle();
2220

2321
interface WebviewMessage {
2422
readonly source: string;
@@ -192,9 +190,7 @@ class MarkdownPreview extends Disposable implements WebviewResourceProvider {
192190

193191
case 'previewStyleLoadError':
194192
vscode.window.showWarningMessage(
195-
localize('onPreviewStyleLoadError',
196-
"Could not load 'markdown.styles': {0}",
197-
e.body.unloadedStyles.join(', ')));
193+
vscode.l10n.t("Could not load 'markdown.styles': {0}", e.body.unloadedStyles.join(', ')));
198194
break;
199195
}
200196
}));
@@ -372,7 +368,7 @@ class MarkdownPreview extends Disposable implements WebviewResourceProvider {
372368
.then((editor) => {
373369
revealLineInEditor(editor);
374370
}, () => {
375-
vscode.window.showErrorMessage(localize('preview.clickOpenFailed', 'Could not open {0}', this._resource.toString()));
371+
vscode.window.showErrorMessage(vscode.l10n.t('Could not open {0}', this._resource.toString()));
376372
});
377373
}
378374

@@ -773,8 +769,8 @@ export class DynamicMarkdownPreview extends Disposable implements IManagedMarkdo
773769
private static _getPreviewTitle(resource: vscode.Uri, locked: boolean): string {
774770
const resourceLabel = uri.Utils.basename(resource);
775771
return locked
776-
? localize('lockedPreviewTitle', '[Preview] {0}', resourceLabel)
777-
: localize('previewTitle', 'Preview {0}', resourceLabel);
772+
? vscode.l10n.t('[Preview] {0}', resourceLabel)
773+
: vscode.l10n.t('Preview {0}', resourceLabel);
778774
}
779775

780776
public get position(): vscode.ViewColumn | undefined {

extensions/markdown-language-features/src/preview/previewManager.ts

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
*--------------------------------------------------------------------------------------------*/
55

66
import * as vscode from 'vscode';
7-
import * as nls from 'vscode-nls';
87
import { ILogger } from '../logging';
98
import { MarkdownContributionProvider } from '../markdownExtensions';
109
import { Disposable, disposeAll } from '../util/dispose';
@@ -16,8 +15,6 @@ import { MarkdownPreviewConfigurationManager } from './previewConfig';
1615
import { scrollEditorToLine, StartingScrollFragment } from './scrolling';
1716
import { TopmostLineMonitor } from './topmostLineMonitor';
1817

19-
const localize = nls.loadMessageBundle();
20-
2118

2219
export interface DynamicPreviewSettings {
2320
readonly resourceColumn: vscode.ViewColumn;
@@ -216,7 +213,7 @@ export class MarkdownPreviewManager extends Disposable implements vscode.Webview
216213
<meta http-equiv="Content-Security-Policy" content="default-src 'none';">
217214
</head>
218215
<body class="error-container">
219-
<p>${localize('preview.restoreError', "An unexpected error occurred while restoring the Markdown preview.")}</p>
216+
<p>${vscode.l10n.t("An unexpected error occurred while restoring the Markdown preview.")}</p>
220217
</body>
221218
</html>`;
222219
}

0 commit comments

Comments
 (0)