Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: add nlsConfig to webWorker #192808 #199258

Open
wants to merge 18 commits into
base: main
Choose a base branch
from

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.

@@ -73,6 +74,10 @@
}

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


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.

@@ -109,12 +110,19 @@ export class WebWorkerExtensionHost extends Disposable implements IExtensionHost
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'

return res.toString();
}

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!

@@ -83,9 +83,10 @@ export class WebWorkerExtensionHost extends Disposable implements IExtensionHost
}
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?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Extension Host (Worker) isn't localized
5 participants