提交 d2c42866 编写于 作者: S Sandeep Somavarapu

Ask user to install core language packe extension

上级 a2e0399b
......@@ -20,12 +20,17 @@ export interface ITranslation {
path: string;
}
export enum LanguageType {
Core = 1,
Contributed
}
export const ILocalizationsService = createDecorator<ILocalizationsService>('localizationsService');
export interface ILocalizationsService {
_serviceBrand: any;
readonly onDidLanguagesChange: Event<void>;
getLanguageIds(): TPromise<string[]>;
getLanguageIds(type?: LanguageType): TPromise<string[]>;
}
export function isValidLocalization(localization: ILocalization): boolean {
......
......@@ -8,7 +8,7 @@
import { TPromise } from 'vs/base/common/winjs.base';
import { IChannel, eventToCall, eventFromCall } from 'vs/base/parts/ipc/common/ipc';
import { Event, buffer } from 'vs/base/common/event';
import { ILocalizationsService } from 'vs/platform/localizations/common/localizations';
import { ILocalizationsService, LanguageType } from 'vs/platform/localizations/common/localizations';
export interface ILocalizationsChannel extends IChannel {
call(command: 'event:onDidLanguagesChange'): TPromise<void>;
......@@ -27,7 +27,7 @@ export class LocalizationsChannel implements ILocalizationsChannel {
call(command: string, arg?: any): TPromise<any> {
switch (command) {
case 'event:onDidLanguagesChange': return eventToCall(this.onDidLanguagesChange);
case 'getLanguageIds': return this.service.getLanguageIds();
case 'getLanguageIds': return this.service.getLanguageIds(arg);
}
return undefined;
}
......@@ -42,7 +42,7 @@ export class LocalizationsChannelClient implements ILocalizationsService {
private _onDidLanguagesChange = eventFromCall<void>(this.channel, 'event:onDidLanguagesChange');
get onDidLanguagesChange(): Event<void> { return this._onDidLanguagesChange; }
getLanguageIds(): TPromise<string[]> {
return this.channel.call('getLanguageIds');
getLanguageIds(type?: LanguageType): TPromise<string[]> {
return this.channel.call('getLanguageIds', type);
}
}
\ No newline at end of file
......@@ -13,7 +13,7 @@ import { TPromise } from 'vs/base/common/winjs.base';
import { Limiter } from 'vs/base/common/async';
import { areSameExtensions, getGalleryExtensionIdFromLocal, getIdFromLocalExtensionId } from 'vs/platform/extensionManagement/common/extensionManagementUtil';
import { ILogService } from 'vs/platform/log/common/log';
import { isValidLocalization, ILocalizationsService } from 'vs/platform/localizations/common/localizations';
import { isValidLocalization, ILocalizationsService, LanguageType } from 'vs/platform/localizations/common/localizations';
import product from 'vs/platform/node/product';
import { distinct, equals } from 'vs/base/common/arrays';
import { Event, Emitter } from 'vs/base/common/event';
......@@ -55,10 +55,13 @@ export class LocalizationsService extends Disposable implements ILocalizationsSe
this.extensionManagementService.getInstalled().then(installed => this.cache.update(installed));
}
getLanguageIds(): TPromise<string[]> {
getLanguageIds(type: LanguageType): TPromise<string[]> {
if (type === LanguageType.Core) {
return TPromise.as([...systemLanguages]);
}
return this.cache.getLanguagePacks()
.then(languagePacks => {
const languages = [...systemLanguages, ...Object.keys(languagePacks)];
const languages = type === LanguageType.Contributed ? Object.keys(languagePacks) : [...systemLanguages, ...Object.keys(languagePacks)];
return TPromise.as(distinct(languages));
});
}
......
......@@ -10,12 +10,12 @@ import { IJSONContributionRegistry, Extensions as JSONExtensions } from 'vs/plat
import { IWorkbenchActionRegistry, Extensions } from 'vs/workbench/common/actions';
import { SyncActionDescriptor } from 'vs/platform/actions/common/actions';
import { Disposable } from 'vs/base/common/lifecycle';
import { ConfigureLocaleAction } from 'vs/workbench/parts/localizations/browser/localizationsActions';
import { ConfigureLocaleAction } from 'vs/workbench/parts/localizations/electron-browser/localizationsActions';
import { ExtensionsRegistry } from 'vs/workbench/services/extensions/common/extensionsRegistry';
import { ILocalizationsService } from 'vs/platform/localizations/common/localizations';
import { ILocalizationsService, LanguageType } from 'vs/platform/localizations/common/localizations';
import { LifecyclePhase } from 'vs/platform/lifecycle/common/lifecycle';
import { language } from 'vs/base/common/platform';
import { IExtensionManagementService, DidInstallExtensionEvent } from 'vs/platform/extensionManagement/common/extensionManagement';
import * as platform from 'vs/base/common/platform';
import { IExtensionManagementService, DidInstallExtensionEvent, LocalExtensionType, IExtensionGalleryService, IGalleryExtension } from 'vs/platform/extensionManagement/common/extensionManagement';
import { INotificationService } from 'vs/platform/notification/common/notification';
import Severity from 'vs/base/common/severity';
import { IJSONEditingService } from 'vs/workbench/services/configuration/common/jsonEditing';
......@@ -24,6 +24,8 @@ import URI from 'vs/base/common/uri';
import { join } from 'vs/base/common/paths';
import { IWindowsService } from 'vs/platform/windows/common/windows';
import { IStorageService, } from 'vs/platform/storage/common/storage';
import { TPromise } from 'vs/base/common/winjs.base';
import product from 'vs/platform/node/product';
// Register action to configure locale and related settings
const registry = Registry.as<IWorkbenchActionRegistry>(Extensions.WorkbenchActions);
......@@ -37,10 +39,12 @@ export class LocalizationWorkbenchContribution extends Disposable implements IWo
@IEnvironmentService private environmentService: IEnvironmentService,
@IWindowsService private windowsService: IWindowsService,
@IStorageService private storageService: IStorageService,
@IExtensionManagementService private extensionManagementService: IExtensionManagementService
@IExtensionManagementService private extensionManagementService: IExtensionManagementService,
@IExtensionGalleryService private galleryService: IExtensionGalleryService,
) {
super();
this.updateLocaleDefintionSchema();
this.checkAndInstall();
this._register(this.localizationService.onDidLanguagesChange(() => this.updateLocaleDefintionSchema()));
this._register(this.extensionManagementService.onDidInstallExtension(e => this.onDidInstallExtension(e)));
}
......@@ -63,7 +67,7 @@ export class LocalizationWorkbenchContribution extends Disposable implements IWo
const donotAskUpdateKey = 'langugage.update.donotask';
if (!this.storageService.getBoolean(donotAskUpdateKey) && e.local && e.local.manifest.contributes && e.local.manifest.contributes.localizations && e.local.manifest.contributes.localizations.length) {
const locale = e.local.manifest.contributes.localizations[0].languageId;
if (language !== locale) {
if (platform.language !== locale) {
this.notificationService.prompt(
Severity.Info,
localize('updateLocale', "Would you like to change VS Code's UI language to {0} and restart?", e.local.manifest.contributes.localizations[0].languageName || e.local.manifest.contributes.localizations[0].languageId),
......@@ -86,6 +90,44 @@ export class LocalizationWorkbenchContribution extends Disposable implements IWo
}
}
}
private checkAndInstall(): void {
const language = platform.language;
if (language !== 'en' && language !== 'en_us') {
this.isLanguageInstalled(language)
.then(installed => {
if (!installed) {
this.getLanguagePackExtension(language)
.then(extension => {
if (extension) {
this.notificationService.prompt(Severity.Warning, localize('install language pack', "Please install '{0}' extension to continue to show VS Code's UI in '{1}' language. In the future, VS Code will only support language packs from the Marketplace.", extension.displayName || extension.displayName, language),
[
{ label: localize('install', "Install"), run: () => this.extensionManagementService.installFromGallery(extension) },
{ label: localize('more information', "More Information..."), run: () => window.open('https://go.microsoft.com/fwlink/?linkid=830387') }
]);
}
});
}
});
}
}
private getLanguagePackExtension(language: string): TPromise<IGalleryExtension> {
return this.localizationService.getLanguageIds(LanguageType.Core)
.then(coreLanguages => {
const extensionId = coreLanguages.some(c => c.toLowerCase() === language) ? product.quality !== 'insider' ? `MS-CEINTL.vscode-insiders-language-pack-${language}` : `MS-CEINTL.vscode-language-pack-${language}` : null;
if (extensionId) {
return this.galleryService.query({ names: [extensionId], pageSize: 1 })
.then(result => result.total === 1 ? result.firstPage[0] : null);
}
return null;
});
}
private isLanguageInstalled(language: string): TPromise<boolean> {
return this.extensionManagementService.getInstalled(LocalExtensionType.User)
.then(installed => installed.some(i => i.manifest && i.manifest.contributes && i.manifest.contributes.localizations && i.manifest.contributes.localizations.length && i.manifest.contributes.localizations.some(l => l.languageId.toLowerCase() === language)));
}
}
function registerLocaleDefinitionSchema(languages: string[]): void {
......@@ -111,7 +153,7 @@ function registerLocaleDefinitionSchema(languages: string[]): void {
});
}
registerLocaleDefinitionSchema([language]);
registerLocaleDefinitionSchema([platform.language]);
const workbenchRegistry = Registry.as<IWorkbenchContributionsRegistry>(WorkbenchExtensions.Workbench);
workbenchRegistry.registerWorkbenchContribution(LocalizationWorkbenchContribution, LifecyclePhase.Eventually);
......
......@@ -23,7 +23,7 @@ import 'vs/workbench/api/browser/viewsContainersExtensionPoint';
import 'vs/workbench/api/browser/viewsExtensionPoint';
// Localizations
import 'vs/workbench/parts/localizations/browser/localizations.contribution';
import 'vs/workbench/parts/localizations/electron-browser/localizations.contribution';
// Workbench
import 'vs/workbench/browser/actions/toggleActivityBarVisibility';
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册