Skip to content

Conversation

@yiliang114
Copy link
Contributor

@yiliang114 yiliang114 commented Nov 28, 2023

After modification:
image

Fixes #192808

const nlsConfig: any = {};
nlsConfig['vs/nls'] = {
availableLanguages: {
'*': navigator.language.toLowerCase()
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think we want to use a similar change as here:

// Normalize locale to lowercase because translationServiceUrl is case-sensitive.
// ref: https://github.com/microsoft/vscode/issues/187795
const locale = localStorage.getItem('vscode.nls.locale') || navigator.language.toLowerCase();
if (!locale.startsWith('en')) {
nlsConfig['vs/nls'] = {
availableLanguages: {
'*': locale
},
translationServiceUrl: '{{WORKBENCH_NLS_BASE_URL}}'
};
}

where we look at local storage as well so that if the user has configured a display language different than their browser that still works.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

One thing I'm curious about is if this works in Desktop. I would guess that electron does all the hard work of plumbing the language to navigator.language but it would be good to confirm.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, I have also observed the need to read the localstorge before. However, there is a problem. Similar to vscode.dev, the domain name is inconsistent with the domain where the iframe is located. Or we need to let the main process tell the iframe after it gets the localstorge, and then tell the worker.

At the same time, I will try to see the electron treatment.

const worker = new Worker(workerUrl, { name });
if (locale) {
// send before `vs/workbench/api/worker/extensionHostWorker`load event.
worker.postMessage(`worker:init-locale:${locale}`);
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Because the worker cannot read the localstorge directly and the iframe may not be in the same domain name as the main application, the method used is to obtain the language in the host, pass it to the iframe, and then pass it to the worker.

I don't know if this will be strange

let suffix = `?${suffixSearchParams.toString()}`;

const iframeModulePath = 'vs/workbench/services/extensions/worker/webWorkerExtensionHostIframe.html';
const locale = localStorage.getItem('vscode.nls.locale') || navigator.language.toLowerCase();
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Since this is running on the main side, I think you can just use language or Language.value():

export const language = _language;
export namespace Language {
export function value(): string {
return language;
}

the implementation of this will grab the local storage value or navigator value.

const res = new URL(`${baseUrl}/out/${iframeModulePath}${suffix}`);
res.searchParams.set('parentOrigin', mainWindow.origin);
res.searchParams.set('salt', stableOriginUUID);
if (locale !== 'en') {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sorry, also in platform there is a LANGUAGE_DEFAULT which you can use instead of hardcoding 'en'

console.warn(`The web worker extension host is started in a same-origin iframe!`);
}

if (locale !== 'en') {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Here too

@TylerLeonhardt
Copy link
Member

I added @alexdima to this PR since he has a better understanding of our AMD & webworker code. I'd like a review from him before this goes in

@yiliang114
Copy link
Contributor Author

I added @alexdima to this PR since he has a better understanding of our AMD & webworker code. I'd like a review from him before this goes in

okey!

COI.addSearchParam(suffixSearchParams, true, true);

const suffix = `?${suffixSearchParams.toString()}`;
let suffix = `?${suffixSearchParams.toString()}`;
Copy link
Member

@TylerLeonhardt TylerLeonhardt Dec 6, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I feel like you could just do this:

Suggested change
let suffix = `?${suffixSearchParams.toString()}`;
if (!platform.Language.isDefaultVariant()) {
suffixSearchParams.set('locale', platform.language);
}
const suffix = `?${suffixSearchParams.toString()}`;

and get rid of the other changes in this file.

@alexdima alexdima self-assigned this Mar 22, 2024
@vivodi
Copy link

vivodi commented Dec 29, 2024

Is this still relevant?

@alexdima
Copy link
Member

This works in the meantime thanks to the ESM work:

CleanShot 2025-07-15 at 10 16 45

@alexdima alexdima closed this Jul 15, 2025
@vs-code-engineering vs-code-engineering bot locked and limited conversation to collaborators Aug 30, 2025
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Extension Host (Worker) isn't localized

5 participants