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