Path: blob/main/src/vs/platform/languagePacks/browser/languagePacks.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 { CancellationTokenSource } from '../../../base/common/cancellation.js';6import { URI } from '../../../base/common/uri.js';7import { IExtensionGalleryService } from '../../extensionManagement/common/extensionManagement.js';8import { IExtensionResourceLoaderService } from '../../extensionResourceLoader/common/extensionResourceLoader.js';9import { ILanguagePackItem, LanguagePackBaseService } from '../common/languagePacks.js';10import { ILogService } from '../../log/common/log.js';1112export class WebLanguagePacksService extends LanguagePackBaseService {13constructor(14@IExtensionResourceLoaderService private readonly extensionResourceLoaderService: IExtensionResourceLoaderService,15@IExtensionGalleryService extensionGalleryService: IExtensionGalleryService,16@ILogService private readonly logService: ILogService17) {18super(extensionGalleryService);19}2021async getBuiltInExtensionTranslationsUri(id: string, language: string): Promise<URI | undefined> {2223const queryTimeout = new CancellationTokenSource();24setTimeout(() => queryTimeout.cancel(), 1000);2526// First get the extensions that supports the language (there should only be one but just in case let's include more results)27let result;28try {29result = await this.extensionGalleryService.query({30text: `tag:"lp-${language}"`,31pageSize: 532}, queryTimeout.token);33} catch (err) {34this.logService.error(err);35return undefined;36}3738const languagePackExtensions = result.firstPage.find(e => e.properties.localizedLanguages?.length);39if (!languagePackExtensions) {40this.logService.trace(`No language pack found for language ${language}`);41return undefined;42}4344// Then get the manifest for that extension45const manifestTimeout = new CancellationTokenSource();46setTimeout(() => queryTimeout.cancel(), 1000);47const manifest = await this.extensionGalleryService.getManifest(languagePackExtensions, manifestTimeout.token);4849// Find the translation from the language pack50const localization = manifest?.contributes?.localizations?.find(l => l.languageId === language);51const translation = localization?.translations.find(t => t.id === id);52if (!translation) {53this.logService.trace(`No translation found for id '${id}, in ${manifest?.name}`);54return undefined;55}5657// get the resource uri and return it58const uri = await this.extensionResourceLoaderService.getExtensionGalleryResourceURL({59// If translation is defined then manifest should have been defined.60name: manifest!.name,61publisher: manifest!.publisher,62version: manifest!.version63});64if (!uri) {65this.logService.trace('Gallery does not provide extension resources.');66return undefined;67}6869return URI.joinPath(uri, translation.path);70}7172// Web doesn't have a concept of language packs, so we just return an empty array73getInstalledLanguages(): Promise<ILanguagePackItem[]> {74return Promise.resolve([]);75}76}777879