Web 应用程序翻译不适用于所有浏览器
Web application translation not working in all browsers
我有一个支持英语和丹麦语的网络应用程序。用户可以从应用程序的设置中更改语言。语言设置存储在数据库中,分别为英语和丹麦语的“1”或“2”。包含所有必要翻译的文本文件充当字典,如果选择丹麦语,所有单词和短语都会根据该字典进行翻译。
在 IE 中这很完美,但在 Chrome 和 Firefox 等其他浏览器中,只有部分文本被正确翻译,而其余部分则根据浏览器中的语言设置进行翻译。
这是我的控制器函数 (vb.net),它从数据库中获取用户的语言:
Public Function GetCurrentUserLanguageContent() As ActionResult
Dim language As Integer = sInt(GetSingleValue("SELECT language_id FROM Users WHERE user_id =" & CurrentUser.Userid))
Dim langCode As String
If language = 2 Then
langCode = "da-DK"
Else
langCode = "en-GB"
End If
Dim languageSet = New With {.LangCode = langCode, .Translations = My.Resources.daDKLang}
Return languageSet
End Function
我的脚本(JavaScript(技术上打字稿)和jQuery)看起来像这样:
interface langDefinition {
LangCode: string;
Translations: string;
}
class translatedLang {
dictionary = new Array<string>();
defaultLangauge = "en-GB";
currentLanguage: string;
isDefaultLanguage: boolean;
constructor() {
try {
var self = this;
$.ajax({
url: "...",
dataType: 'json',
async: false,
cache: false,
success: function (langDef: langDefinition) {
self.currentLanguage = langDef.LangCode;
self.isDefaultLanguage = self.currentLanguage == self.defaultLangauge;
self.setupDictionary(langDef.Translations);
var rnotwhite = /\S/;
$('body *').contents().filter(function () {
return this.nodeType === 3 && rnotwhite.test($(this).text());
}).text(function (i, text) {
this.replaceWholeText(self.translate(text));
//this.nodeValue = text + ' replaced'; // this works, in that it adds 'replaced' to the missing translations
});
}
});
}
catch (ex) {
this.isDefaultLanguage = true;
}
}
private setupDictionary(translations: string): void {
translations.split(/\r\n/g).forEach((value: string) => {
var keyValuePair: string[] = value.split(",");
this.dictionary[keyValuePair[0]] = keyValuePair[1];
});
}
public translateNewlineString(translationString: string): string {
return translationString
.split(/\r\n/g)
.map((l) => {
return this.translate(l);
})
.join(" ");
}
public translate(translationString: string): string {
if (this.isDefaultLanguage) {
return translationString;
}
else {
if (this.dictionary.hasOwnProperty(translationString)) {
return this.dictionary[translationString];
}
else {
return translationString;
}
}
}
}
从 setupDictionary 函数可以看出,字典文件的格式如下:
something in english,something in danish
something else in english, something else in danish
请注意,如果我在 AJAX 调用中将 this.replaceWholeText(self.translate(text));
更改为 this.nodeValue = text + ' replaced';
,应翻译的文本将更改为包含 'replaced' - 这意味着它实际上已更改正确的文字...
又一次;这在 IE 中一切正常,但某些浏览器,例如 Chrome,在某些情况下似乎会覆盖我的翻译。
有什么办法可以解决这个问题,还是我需要做一些完全不同的事情?
我自己找到了解决方案;我只需要将 this.replaceWholeText(self.translate(text));
更改为 this.nodeValue = self.translate(text);
,因此 AJAX 调用如下所示:
$.ajax({
url: "...",
dataType: 'json',
async: false,
cache: false,
success: function (langDef: langDefinition) {
self.currentLanguage = langDef.LangCode;
self.isDefaultLanguage = self.currentLanguage == self.defaultLangauge;
self.setupDictionary(langDef.Translations);
var rnotwhite = /\S/;
$('body *').contents().filter(function () {
return this.nodeType === 3 && rnotwhite.test($(this).text());
}).text(function (i, text) {
this.nodeValue = self.translate(text);
});
}
});
我有一个支持英语和丹麦语的网络应用程序。用户可以从应用程序的设置中更改语言。语言设置存储在数据库中,分别为英语和丹麦语的“1”或“2”。包含所有必要翻译的文本文件充当字典,如果选择丹麦语,所有单词和短语都会根据该字典进行翻译。
在 IE 中这很完美,但在 Chrome 和 Firefox 等其他浏览器中,只有部分文本被正确翻译,而其余部分则根据浏览器中的语言设置进行翻译。
这是我的控制器函数 (vb.net),它从数据库中获取用户的语言:
Public Function GetCurrentUserLanguageContent() As ActionResult
Dim language As Integer = sInt(GetSingleValue("SELECT language_id FROM Users WHERE user_id =" & CurrentUser.Userid))
Dim langCode As String
If language = 2 Then
langCode = "da-DK"
Else
langCode = "en-GB"
End If
Dim languageSet = New With {.LangCode = langCode, .Translations = My.Resources.daDKLang}
Return languageSet
End Function
我的脚本(JavaScript(技术上打字稿)和jQuery)看起来像这样:
interface langDefinition {
LangCode: string;
Translations: string;
}
class translatedLang {
dictionary = new Array<string>();
defaultLangauge = "en-GB";
currentLanguage: string;
isDefaultLanguage: boolean;
constructor() {
try {
var self = this;
$.ajax({
url: "...",
dataType: 'json',
async: false,
cache: false,
success: function (langDef: langDefinition) {
self.currentLanguage = langDef.LangCode;
self.isDefaultLanguage = self.currentLanguage == self.defaultLangauge;
self.setupDictionary(langDef.Translations);
var rnotwhite = /\S/;
$('body *').contents().filter(function () {
return this.nodeType === 3 && rnotwhite.test($(this).text());
}).text(function (i, text) {
this.replaceWholeText(self.translate(text));
//this.nodeValue = text + ' replaced'; // this works, in that it adds 'replaced' to the missing translations
});
}
});
}
catch (ex) {
this.isDefaultLanguage = true;
}
}
private setupDictionary(translations: string): void {
translations.split(/\r\n/g).forEach((value: string) => {
var keyValuePair: string[] = value.split(",");
this.dictionary[keyValuePair[0]] = keyValuePair[1];
});
}
public translateNewlineString(translationString: string): string {
return translationString
.split(/\r\n/g)
.map((l) => {
return this.translate(l);
})
.join(" ");
}
public translate(translationString: string): string {
if (this.isDefaultLanguage) {
return translationString;
}
else {
if (this.dictionary.hasOwnProperty(translationString)) {
return this.dictionary[translationString];
}
else {
return translationString;
}
}
}
}
从 setupDictionary 函数可以看出,字典文件的格式如下:
something in english,something in danish
something else in english, something else in danish
请注意,如果我在 AJAX 调用中将 this.replaceWholeText(self.translate(text));
更改为 this.nodeValue = text + ' replaced';
,应翻译的文本将更改为包含 'replaced' - 这意味着它实际上已更改正确的文字...
又一次;这在 IE 中一切正常,但某些浏览器,例如 Chrome,在某些情况下似乎会覆盖我的翻译。
有什么办法可以解决这个问题,还是我需要做一些完全不同的事情?
我自己找到了解决方案;我只需要将 this.replaceWholeText(self.translate(text));
更改为 this.nodeValue = self.translate(text);
,因此 AJAX 调用如下所示:
$.ajax({
url: "...",
dataType: 'json',
async: false,
cache: false,
success: function (langDef: langDefinition) {
self.currentLanguage = langDef.LangCode;
self.isDefaultLanguage = self.currentLanguage == self.defaultLangauge;
self.setupDictionary(langDef.Translations);
var rnotwhite = /\S/;
$('body *').contents().filter(function () {
return this.nodeType === 3 && rnotwhite.test($(this).text());
}).text(function (i, text) {
this.nodeValue = self.translate(text);
});
}
});