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

时间:2016-06-28 17:26:27

标签: javascript c++ firefox icu

我修改了firefox,我正在寻找一种方法来修改FireFox上的date.toLocaleString JavaScript方法行为。

它是变色龙"变色龙" mod来欺骗返回值。如果没有传递,我想添加一个额外的参数:

例如

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

我希望从第一次调用获得第二个结果(通常在指纹识别时由网站使用),给定区域设置而不更改整个浏览器的区域设置,只需JS

我已经尝试过JavaScript方法(覆盖函数,代理模式,你可以命名......)但是无法获得一个干净的实现(可以从DOM中删除而没有问题)并修补底层的C ++代码没有成功(没有真正地挖掘太多)。

您能指出一个合适的方法和/或特定的补丁位置吗?

1 个答案:

答案 0 :(得分:0)

可能有点晚了,但我自己解决了这个问题,有一天它可能会帮到某个人。 (以最无聊的方式解释,任何人都得到它,这些土地有点黑暗......)

没有简单的方法来覆盖JavaScript中的区域设置,因为ECMA Specification中没有此类功能。

此处的目标是日期数字。这些是self hosted objects。并且很难找到在自托管js中实现此目标的方法,因为可用选项非常有限(请参阅here以获取列表)
因此,解决方案是在 C ++ 方面进行。

在最简单的形式中,问题是覆盖JavaScript使用的默认语言环境,而不会影响浏览器UI。最新版本的Firefox依靠ICU进行国际化,这是一个 C ++ 库。跟XPConnect问好。 JavaScript的本地化是通过bool xpc_LocalizeContext(JSContext* cx)方法(可用here)完成的,覆盖默认语言环境就像在函数开头插入此代码一样简单:

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

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