Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/src/vs/platform/languagePacks/browser/languagePacks.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 { CancellationTokenSource } from '../../../base/common/cancellation.js';
7
import { URI } from '../../../base/common/uri.js';
8
import { IExtensionGalleryService } from '../../extensionManagement/common/extensionManagement.js';
9
import { IExtensionResourceLoaderService } from '../../extensionResourceLoader/common/extensionResourceLoader.js';
10
import { ILanguagePackItem, LanguagePackBaseService } from '../common/languagePacks.js';
11
import { ILogService } from '../../log/common/log.js';
12
13
export class WebLanguagePacksService extends LanguagePackBaseService {
14
constructor(
15
@IExtensionResourceLoaderService private readonly extensionResourceLoaderService: IExtensionResourceLoaderService,
16
@IExtensionGalleryService extensionGalleryService: IExtensionGalleryService,
17
@ILogService private readonly logService: ILogService
18
) {
19
super(extensionGalleryService);
20
}
21
22
async getBuiltInExtensionTranslationsUri(id: string, language: string): Promise<URI | undefined> {
23
24
const queryTimeout = new CancellationTokenSource();
25
setTimeout(() => queryTimeout.cancel(), 1000);
26
27
// First get the extensions that supports the language (there should only be one but just in case let's include more results)
28
let result;
29
try {
30
result = await this.extensionGalleryService.query({
31
text: `tag:"lp-${language}"`,
32
pageSize: 5
33
}, queryTimeout.token);
34
} catch (err) {
35
this.logService.error(err);
36
return undefined;
37
}
38
39
const languagePackExtensions = result.firstPage.find(e => e.properties.localizedLanguages?.length);
40
if (!languagePackExtensions) {
41
this.logService.trace(`No language pack found for language ${language}`);
42
return undefined;
43
}
44
45
// Then get the manifest for that extension
46
const manifestTimeout = new CancellationTokenSource();
47
setTimeout(() => queryTimeout.cancel(), 1000);
48
const manifest = await this.extensionGalleryService.getManifest(languagePackExtensions, manifestTimeout.token);
49
50
// Find the translation from the language pack
51
const localization = manifest?.contributes?.localizations?.find(l => l.languageId === language);
52
const translation = localization?.translations.find(t => t.id === id);
53
if (!translation) {
54
this.logService.trace(`No translation found for id '${id}, in ${manifest?.name}`);
55
return undefined;
56
}
57
58
// get the resource uri and return it
59
const uri = await this.extensionResourceLoaderService.getExtensionGalleryResourceURL({
60
// If translation is defined then manifest should have been defined.
61
name: manifest!.name,
62
publisher: manifest!.publisher,
63
version: manifest!.version
64
});
65
if (!uri) {
66
this.logService.trace('Gallery does not provide extension resources.');
67
return undefined;
68
}
69
70
return URI.joinPath(uri, translation.path);
71
}
72
73
// Web doesn't have a concept of language packs, so we just return an empty array
74
getInstalledLanguages(): Promise<ILanguagePackItem[]> {
75
return Promise.resolve([]);
76
}
77
}
78
79