Skip to content

Commit 00eb9c4

Browse files
Polish up restart dialogs and switch to using Language instead of language (microsoft#154382)
1 parent eb2e5d8 commit 00eb9c4

File tree

4 files changed

+83
-63
lines changed

4 files changed

+83
-63
lines changed

src/vs/workbench/contrib/localization/browser/localeService.ts

Lines changed: 41 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,31 +3,62 @@
33
* Licensed under the MIT License. See License.txt in the project root for license information.
44
*--------------------------------------------------------------------------------------------*/
55

6-
import { language } from 'vs/base/common/platform';
6+
import { localize } from 'vs/nls';
7+
import { Language } from 'vs/base/common/platform';
8+
import { IDialogService } from 'vs/platform/dialogs/common/dialogs';
79
import { ILanguagePackItem } from 'vs/platform/languagePacks/common/languagePacks';
810
import { ILocaleService } from 'vs/workbench/contrib/localization/common/locale';
11+
import { IHostService } from 'vs/workbench/services/host/browser/host';
12+
import { IProductService } from 'vs/platform/product/common/productService';
913

1014
export class WebLocaleService implements ILocaleService {
1115
declare readonly _serviceBrand: undefined;
1216

13-
async setLocale(languagePackItem: ILanguagePackItem): Promise<boolean> {
17+
constructor(
18+
@IDialogService private readonly dialogService: IDialogService,
19+
@IHostService private readonly hostService: IHostService,
20+
@IProductService private readonly productService: IProductService
21+
) { }
22+
23+
async setLocale(languagePackItem: ILanguagePackItem): Promise<void> {
1424
const locale = languagePackItem.id;
15-
if (locale === language || (!locale && language === navigator.language)) {
16-
return false;
25+
if (locale === Language.value() || (!locale && Language.value() === navigator.language)) {
26+
return;
1727
}
1828
if (locale) {
1929
window.localStorage.setItem('vscode.nls.locale', locale);
2030
} else {
2131
window.localStorage.removeItem('vscode.nls.locale');
2232
}
23-
return true;
24-
}
2533

26-
async clearLocalePreference(): Promise<boolean> {
27-
if (language === navigator.language) {
28-
return false;
34+
const restartDialog = await this.dialogService.confirm({
35+
type: 'info',
36+
message: localize('relaunchDisplayLanguageMessage', "{0} needs to reload to change the display language", this.productService.nameLong),
37+
detail: localize('relaunchDisplayLanguageDetail', "Press the reload button to refresh the page and set the display language to {0}.", languagePackItem.label),
38+
primaryButton: localize({ key: 'reload', comment: ['&& denotes a mnemonic character'] }, "&&Reload"),
39+
});
40+
41+
if (restartDialog.confirmed) {
42+
this.hostService.restart();
2943
}
44+
}
45+
46+
async clearLocalePreference(): Promise<void> {
3047
window.localStorage.removeItem('vscode.nls.locale');
31-
return true;
48+
49+
if (Language.value() === navigator.language) {
50+
return;
51+
}
52+
53+
const restartDialog = await this.dialogService.confirm({
54+
type: 'info',
55+
message: localize('clearDisplayLanguageMessage', "{0} needs to reload to change the display language", this.productService.nameLong),
56+
detail: localize('clearDisplayLanguageDetail', "Press the reload button to refresh the page and use your browser's language."),
57+
primaryButton: localize({ key: 'reload', comment: ['&& denotes a mnemonic character'] }, "&&Reload"),
58+
});
59+
60+
if (restartDialog.confirmed) {
61+
this.hostService.restart();
62+
}
3263
}
3364
}

src/vs/workbench/contrib/localization/browser/localizationsActions.ts

Lines changed: 2 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -5,18 +5,13 @@
55

66
import { localize } from 'vs/nls';
77
import { IQuickInputService, IQuickPickSeparator } from 'vs/platform/quickinput/common/quickInput';
8-
import { IHostService } from 'vs/workbench/services/host/browser/host';
9-
import { IDialogService } from 'vs/platform/dialogs/common/dialogs';
10-
import { IProductService } from 'vs/platform/product/common/productService';
118
import { CancellationTokenSource } from 'vs/base/common/cancellation';
129
import { DisposableStore } from 'vs/base/common/lifecycle';
1310
import { Action2, MenuId } from 'vs/platform/actions/common/actions';
1411
import { ServicesAccessor } from 'vs/platform/instantiation/common/instantiation';
1512
import { ILanguagePackItem, ILanguagePackService } from 'vs/platform/languagePacks/common/languagePacks';
1613
import { ILocaleService } from 'vs/workbench/contrib/localization/common/locale';
1714

18-
const restart = localize('restart', "&&Restart");
19-
2015
export class ConfigureDisplayLanguageAction extends Action2 {
2116
public static readonly ID = 'workbench.action.configureLocale';
2217
public static readonly LABEL = localize('configureLocale', "Configure Display Language");
@@ -34,9 +29,6 @@ export class ConfigureDisplayLanguageAction extends Action2 {
3429
public async run(accessor: ServicesAccessor): Promise<void> {
3530
const languagePackService: ILanguagePackService = accessor.get(ILanguagePackService);
3631
const quickInputService: IQuickInputService = accessor.get(IQuickInputService);
37-
const hostService: IHostService = accessor.get(IHostService);
38-
const dialogService: IDialogService = accessor.get(IDialogService);
39-
const productService: IProductService = accessor.get(IProductService);
4032
const localeService: ILocaleService = accessor.get(ILocaleService);
4133

4234
const installedLanguages = await languagePackService.getInstalledLanguages();
@@ -72,19 +64,7 @@ export class ConfigureDisplayLanguageAction extends Action2 {
7264
disposables.add(qp.onDidAccept(async () => {
7365
const selectedLanguage = qp.activeItems[0];
7466
qp.hide();
75-
76-
if (await localeService.setLocale(selectedLanguage)) {
77-
const restartDialog = await dialogService.confirm({
78-
type: 'info',
79-
message: localize('relaunchDisplayLanguageMessage', "A restart is required for the change in display language to take effect."),
80-
detail: localize('relaunchDisplayLanguageDetail', "Press the restart button to restart {0} and change the display language.", productService.nameLong),
81-
primaryButton: restart
82-
});
83-
84-
if (restartDialog.confirmed) {
85-
hostService.restart();
86-
}
87-
}
67+
await localeService.setLocale(selectedLanguage);
8868
}));
8969

9070
qp.show();
@@ -108,21 +88,6 @@ export class ClearDisplayLanguageAction extends Action2 {
10888

10989
public async run(accessor: ServicesAccessor): Promise<void> {
11090
const localeService: ILocaleService = accessor.get(ILocaleService);
111-
const dialogService: IDialogService = accessor.get(IDialogService);
112-
const productService: IProductService = accessor.get(IProductService);
113-
const hostService: IHostService = accessor.get(IHostService);
114-
115-
if (await localeService.clearLocalePreference()) {
116-
const restartDialog = await dialogService.confirm({
117-
type: 'info',
118-
message: localize('relaunchAfterClearDisplayLanguageMessage', "A restart is required for the change in display language to take effect."),
119-
detail: localize('relaunchAfterClearDisplayLanguageDetail', "Press the restart button to restart {0} and change the display language.", productService.nameLong),
120-
primaryButton: restart
121-
});
122-
123-
if (restartDialog.confirmed) {
124-
hostService.restart();
125-
}
126-
}
91+
await localeService.clearLocalePreference();
12792
}
12893
}

src/vs/workbench/contrib/localization/common/locale.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,6 @@ export const ILocaleService = createDecorator<ILocaleService>('localizationServi
1010

1111
export interface ILocaleService {
1212
readonly _serviceBrand: undefined;
13-
setLocale(languagePackItem: ILanguagePackItem): Promise<boolean>;
14-
clearLocalePreference(): Promise<boolean>;
13+
setLocale(languagePackItem: ILanguagePackItem): Promise<void>;
14+
clearLocalePreference(): Promise<void>;
1515
}

src/vs/workbench/contrib/localization/electron-sandbox/localeService.ts

Lines changed: 38 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
* Licensed under the MIT License. See License.txt in the project root for license information.
44
*--------------------------------------------------------------------------------------------*/
55

6-
import { language } from 'vs/base/common/platform';
6+
import { Language } from 'vs/base/common/platform';
77
import { IEnvironmentService } from 'vs/platform/environment/common/environment';
88
import { INotificationService, Severity } from 'vs/platform/notification/common/notification';
99
import { IJSONEditingService } from 'vs/workbench/services/configuration/common/jsonEditing';
@@ -19,6 +19,9 @@ import { toAction } from 'vs/base/common/actions';
1919
import { ITextFileService } from 'vs/workbench/services/textfile/common/textfiles';
2020
import { stripComments } from 'vs/base/common/stripComments';
2121
import { IEditorService } from 'vs/workbench/services/editor/common/editorService';
22+
import { IHostService } from 'vs/workbench/services/host/browser/host';
23+
import { IDialogService } from 'vs/platform/dialogs/common/dialogs';
24+
import { IProductService } from 'vs/platform/product/common/productService';
2225

2326
export class NativeLocaleService implements ILocaleService {
2427
_serviceBrand: undefined;
@@ -32,7 +35,10 @@ export class NativeLocaleService implements ILocaleService {
3235
@IExtensionManagementService private readonly extensionManagementService: IExtensionManagementService,
3336
@IProgressService private readonly progressService: IProgressService,
3437
@ITextFileService private readonly textFileService: ITextFileService,
35-
@IEditorService private readonly editorService: IEditorService
38+
@IEditorService private readonly editorService: IEditorService,
39+
@IDialogService private readonly dialogService: IDialogService,
40+
@IHostService private readonly hostService: IHostService,
41+
@IProductService private readonly productService: IProductService
3642
) { }
3743

3844
private async validateLocaleFile(): Promise<boolean> {
@@ -69,10 +75,10 @@ export class NativeLocaleService implements ILocaleService {
6975
return true;
7076
}
7177

72-
async setLocale(languagePackItem: ILanguagePackItem): Promise<boolean> {
78+
async setLocale(languagePackItem: ILanguagePackItem): Promise<void> {
7379
const locale = languagePackItem.id;
74-
if (locale === language || (!locale && language === 'en')) {
75-
return false;
80+
if (locale === Language.value() || (!locale && Language.isDefaultVariant())) {
81+
return;
7682
}
7783
const installedLanguages = await this.languagePackService.getInstalledLanguages();
7884
try {
@@ -87,7 +93,7 @@ export class NativeLocaleService implements ILocaleService {
8793
// as of now, there are no 3rd party language packs available on the Marketplace.
8894
const viewlet = await this.paneCompositePartService.openPaneComposite(EXTENSIONS_VIEWLET_ID, ViewContainerLocation.Sidebar);
8995
(viewlet?.getViewPaneContainer() as IExtensionsViewPaneContainer).search(`@id:${languagePackItem.extensionId}`);
90-
return false;
96+
return;
9197
}
9298

9399
await this.progressService.withProgress(
@@ -102,22 +108,40 @@ export class NativeLocaleService implements ILocaleService {
102108
);
103109
}
104110

105-
return await this.writeLocaleValue(locale);
111+
if (await this.writeLocaleValue(locale)) {
112+
await this.showRestartDialog(languagePackItem.label);
113+
}
106114
} catch (err) {
107115
this.notificationService.error(err);
108-
return false;
109116
}
110117
}
111118

112-
async clearLocalePreference(): Promise<boolean> {
113-
if (language === 'en') {
114-
return false;
115-
}
119+
async clearLocalePreference(): Promise<void> {
116120
try {
117-
return await this.writeLocaleValue(undefined);
121+
await this.writeLocaleValue(undefined);
122+
if (!Language.isDefaultVariant()) {
123+
await this.showRestartDialog('English');
124+
}
118125
} catch (err) {
119126
this.notificationService.error(err);
120-
return false;
127+
}
128+
}
129+
130+
private async showRestartDialog(languageName: string) {
131+
const restartDialog = await this.dialogService.confirm({
132+
type: 'info',
133+
message: localize('restartDisplayLanguageMessage', "{0} needs to restart to change the display language", this.productService.nameLong),
134+
detail: localize(
135+
'restartDisplayLanguageDetail',
136+
"Press the restart button to restart {0} and set the display language to {1}.",
137+
this.productService.nameLong,
138+
languageName
139+
),
140+
primaryButton: localize({ key: 'restart', comment: ['&& denotes a mnemonic character'] }, "&&Restart"),
141+
});
142+
143+
if (restartDialog.confirmed) {
144+
this.hostService.restart();
121145
}
122146
}
123147
}

0 commit comments

Comments
 (0)