Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/src/vs/workbench/contrib/localization/common/localizationsActions.ts
3296 views
1
/*---------------------------------------------------------------------------------------------
2
* Copyright (c) Microsoft Corporation. All rights reserved.
3
* Licensed under the MIT License. See License.txt in the project root for license information.
4
*--------------------------------------------------------------------------------------------*/
5
6
import { localize, localize2 } from '../../../../nls.js';
7
import { IQuickInputService, IQuickPickSeparator } from '../../../../platform/quickinput/common/quickInput.js';
8
import { DisposableStore } from '../../../../base/common/lifecycle.js';
9
import { Action2, MenuId } from '../../../../platform/actions/common/actions.js';
10
import { ServicesAccessor } from '../../../../platform/instantiation/common/instantiation.js';
11
import { ILanguagePackItem, ILanguagePackService } from '../../../../platform/languagePacks/common/languagePacks.js';
12
import { ILocaleService } from '../../../services/localization/common/locale.js';
13
import { IExtensionsWorkbenchService } from '../../extensions/common/extensions.js';
14
15
export class ConfigureDisplayLanguageAction extends Action2 {
16
public static readonly ID = 'workbench.action.configureLocale';
17
18
constructor() {
19
super({
20
id: ConfigureDisplayLanguageAction.ID,
21
title: localize2('configureLocale', "Configure Display Language"),
22
menu: {
23
id: MenuId.CommandPalette
24
},
25
metadata: {
26
description: localize2('configureLocaleDescription', "Changes the locale of VS Code based on installed language packs. Common languages include French, Chinese, Spanish, Japanese, German, Korean, and more.")
27
}
28
});
29
}
30
31
public async run(accessor: ServicesAccessor): Promise<void> {
32
const languagePackService: ILanguagePackService = accessor.get(ILanguagePackService);
33
const quickInputService: IQuickInputService = accessor.get(IQuickInputService);
34
const localeService: ILocaleService = accessor.get(ILocaleService);
35
const extensionWorkbenchService: IExtensionsWorkbenchService = accessor.get(IExtensionsWorkbenchService);
36
37
const installedLanguages = await languagePackService.getInstalledLanguages();
38
39
const disposables = new DisposableStore();
40
const qp = disposables.add(quickInputService.createQuickPick<ILanguagePackItem>({ useSeparators: true }));
41
qp.matchOnDescription = true;
42
qp.placeholder = localize('chooseLocale', "Select Display Language");
43
44
if (installedLanguages?.length) {
45
const items: Array<ILanguagePackItem | IQuickPickSeparator> = [{ type: 'separator', label: localize('installed', "Installed") }];
46
qp.items = items.concat(this.withMoreInfoButton(installedLanguages));
47
}
48
49
disposables.add(qp.onDidHide(() => {
50
disposables.dispose();
51
}));
52
53
const installedSet = new Set<string>(installedLanguages?.map(language => language.id!) ?? []);
54
languagePackService.getAvailableLanguages().then(availableLanguages => {
55
const newLanguages = availableLanguages.filter(l => l.id && !installedSet.has(l.id));
56
if (newLanguages.length) {
57
qp.items = [
58
...qp.items,
59
{ type: 'separator', label: localize('available', "Available") },
60
...this.withMoreInfoButton(newLanguages)
61
];
62
}
63
qp.busy = false;
64
});
65
66
disposables.add(qp.onDidAccept(async () => {
67
const selectedLanguage = qp.activeItems[0] as ILanguagePackItem | undefined;
68
if (selectedLanguage) {
69
qp.hide();
70
await localeService.setLocale(selectedLanguage);
71
}
72
}));
73
74
disposables.add(qp.onDidTriggerItemButton(async e => {
75
qp.hide();
76
if (e.item.extensionId) {
77
await extensionWorkbenchService.open(e.item.extensionId);
78
}
79
}));
80
81
qp.show();
82
qp.busy = true;
83
}
84
85
private withMoreInfoButton(items: ILanguagePackItem[]): ILanguagePackItem[] {
86
for (const item of items) {
87
if (item.extensionId) {
88
item.buttons = [{
89
tooltip: localize('moreInfo', "More Info"),
90
iconClass: 'codicon-info'
91
}];
92
}
93
}
94
return items;
95
}
96
}
97
98
export class ClearDisplayLanguageAction extends Action2 {
99
public static readonly ID = 'workbench.action.clearLocalePreference';
100
public static readonly LABEL = localize2('clearDisplayLanguage', "Clear Display Language Preference");
101
102
constructor() {
103
super({
104
id: ClearDisplayLanguageAction.ID,
105
title: ClearDisplayLanguageAction.LABEL,
106
menu: {
107
id: MenuId.CommandPalette
108
}
109
});
110
}
111
112
public async run(accessor: ServicesAccessor): Promise<void> {
113
const localeService: ILocaleService = accessor.get(ILocaleService);
114
await localeService.clearLocalePreference();
115
}
116
}
117
118