Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/src/vs/platform/languagePacks/common/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 { Disposable } from '../../../base/common/lifecycle.js';
8
import { language } from '../../../base/common/platform.js';
9
import { URI } from '../../../base/common/uri.js';
10
import { IQuickPickItem } from '../../quickinput/common/quickInput.js';
11
import { localize } from '../../../nls.js';
12
import { IExtensionGalleryService, IGalleryExtension } from '../../extensionManagement/common/extensionManagement.js';
13
import { createDecorator } from '../../instantiation/common/instantiation.js';
14
15
export function getLocale(extension: IGalleryExtension): string | undefined {
16
return extension.tags.find(t => t.startsWith('lp-'))?.split('lp-')[1];
17
}
18
19
export const ILanguagePackService = createDecorator<ILanguagePackService>('languagePackService');
20
21
export interface ILanguagePackItem extends IQuickPickItem {
22
readonly extensionId?: string;
23
readonly galleryExtension?: IGalleryExtension;
24
}
25
26
export interface ILanguagePackService {
27
readonly _serviceBrand: undefined;
28
getAvailableLanguages(): Promise<Array<ILanguagePackItem>>;
29
getInstalledLanguages(): Promise<Array<ILanguagePackItem>>;
30
getBuiltInExtensionTranslationsUri(id: string, language: string): Promise<URI | undefined>;
31
}
32
33
export abstract class LanguagePackBaseService extends Disposable implements ILanguagePackService {
34
declare readonly _serviceBrand: undefined;
35
36
constructor(@IExtensionGalleryService protected readonly extensionGalleryService: IExtensionGalleryService) {
37
super();
38
}
39
40
abstract getBuiltInExtensionTranslationsUri(id: string, language: string): Promise<URI | undefined>;
41
42
abstract getInstalledLanguages(): Promise<Array<ILanguagePackItem>>;
43
44
async getAvailableLanguages(): Promise<ILanguagePackItem[]> {
45
const timeout = new CancellationTokenSource();
46
setTimeout(() => timeout.cancel(), 1000);
47
48
let result;
49
try {
50
result = await this.extensionGalleryService.query({
51
text: 'category:"language packs"',
52
pageSize: 20
53
}, timeout.token);
54
} catch (_) {
55
// This method is best effort. So, we ignore any errors.
56
return [];
57
}
58
59
const languagePackExtensions = result.firstPage.filter(e => e.properties.localizedLanguages?.length && e.tags.some(t => t.startsWith('lp-')));
60
const allFromMarketplace: ILanguagePackItem[] = languagePackExtensions.map(lp => {
61
const languageName = lp.properties.localizedLanguages?.[0];
62
const locale = getLocale(lp)!;
63
const baseQuickPick = this.createQuickPickItem(locale, languageName, lp);
64
return {
65
...baseQuickPick,
66
extensionId: lp.identifier.id,
67
galleryExtension: lp
68
};
69
});
70
71
allFromMarketplace.push(this.createQuickPickItem('en', 'English'));
72
73
return allFromMarketplace;
74
}
75
76
protected createQuickPickItem(locale: string, languageName?: string, languagePack?: IGalleryExtension): IQuickPickItem {
77
const label = languageName ?? locale;
78
let description: string | undefined;
79
if (label !== locale) {
80
description = `(${locale})`;
81
}
82
83
if (locale.toLowerCase() === language.toLowerCase()) {
84
description ??= '';
85
description += localize('currentDisplayLanguage', " (Current)");
86
}
87
88
if (languagePack?.installCount) {
89
description ??= '';
90
91
const count = languagePack.installCount;
92
let countLabel: string;
93
if (count > 1000000) {
94
countLabel = `${Math.floor(count / 100000) / 10}M`;
95
} else if (count > 1000) {
96
countLabel = `${Math.floor(count / 1000)}K`;
97
} else {
98
countLabel = String(count);
99
}
100
description += ` $(cloud-download) ${countLabel}`;
101
}
102
103
return {
104
id: locale,
105
label,
106
description
107
};
108
}
109
}
110
111