覆盖 JavaScript 默认语言环境。 [蜘蛛猴]

Override JavaScript default locale. [SpiderMonkey]

我正在使用 Firefox,我正在寻找一种方法来 mod 验证 FireFox 上的 date.toLocaleString JavaScript 方法行为。

这是一个"Chameleon"mod来欺骗return值。如果传递了 none,我想添加一个额外的参数:

例如

var date = new Date();
date.toLocaleString(); // "6/28/2016, 6:16:18 PM"
date.toLocateString("ar-TN"); // "٢٨‏/٦‏/٢٠١٦ ٦:١٦:١٨ م"

我想从第一次调用中获得第二个结果(通常由网站在指纹识别时使用),给定语言环境而不改变整个浏览器的语言环境,只是 JS .

我已经尝试了 JavaScript 方法(重写函数、代理模式,随便你怎么说..)但无法得到一个干净的实现(可以从 DOM 中删除而不问题)并修补底层 C++ 代码但没有成功(老实说并没有深入挖掘)。

你能告诉我一个合适的方法,and/or一个特定的补丁位置吗?

可能有点晚了,但我已经自己解决了这个问题,总有一天它会帮助别人。 (以最无聊的方式解释,所以任何人都明白,这些土地有点黑暗......)

没有简单的方法来覆盖 JavaScript 中的语言环境,因为 ECMA Specification 中没有这样的功能。

这里的目标是日期数字。这些是 self hosted objects. and It's difficult to find a way to achieve this goal in self hosted js, as available options are quite restricted (See here 个列表)
因此,解决方案是在 C++ 方面进行。

在最简单的形式中,问题是关于覆盖 默认区域设置 ,由 JavaScript 使用而不影响浏览器 UI。最新版本的 Firefox 依赖 ICU 进行国际化,这是一个 C++ 库。向 XPConnect. The localization of JavaScript is done via the bool xpc_LocalizeContext(JSContext* cx) method (available here) 问好),覆盖默认语言环境就像在函数开头插入此代码一样简单:

char* overrideLocale = std::getenv("OVERRIDE_LOCALE");
if (overrideLocale != NULL) {
    return JS_SetDefaultLocale(rt, overrideLocale);
}

此代码通过环境变量覆盖默认语言环境,但它很容易更改。