Локализация Korzh EasyQuery в asp.net mvc
Я пытаюсь локализовать компонент Korzh EasyQuery. Я на самом деле на полпути, как мне удалось локализовать сообщения пользовательского интерфейса. Но имена сущностей, атрибуты и операторы отчаянно остаются на английском языке.
Вот что я сделал (см. Шаг, описанный на korzh.com.
$(document).ready(function() {
var culture = $('#hidCulture').val();
if (culture.contains('nl')) {
EQ.core.texts = getDutchText();
} else if (culture.contains('fr')) {
EQ.core.texts = getFrenchText();
} else {
EQ.core.texts = getEnglishText();
}
});
Текстовый ресурс происходит из другого файла и выглядит так:
getFrenchText = function() {
return {
Local: "fr",
AltMenuAttribute: "Attribute",
AltMenuAttribute: "Attribut",
...
StrAddColumns: "Ajouter des colonnes",
Entities: {
"Company": "Entreprise",
"Office": "Site",
...
},
Attribute: {
"Company.Name": "Nom",
...
},
Operators: {
"Equal": {
"caption": "Egal à",
"displayFormat": "{expr1} [[est égal à]] {expr2}"
}
};
}
Существуют и другие решения, использующие файлы ресурсов или свойств, но они не соответствуют моим потребностям. Как я понял, это не локализует имена сущностей.
Здесь заканчивается последняя попытка. Кто-нибудь встречал такую же проблему?
1 ответ
Я не мог решить проблему с помощью JavaScript.
Сначала я решил жестко запрограммировать заголовки сущностей и атрибутов на одном языке, используя редактор моделей данных, поставляемый с EasyQuery. Это решение позволяет мне только один язык или один язык в XML-файле. На мой взгляд, создавать разные xml для каждого языка - очень плохая идея.
В контроллере построителя запросов есть метод, который загружает модель. Я просто добавил метод для рекурсивного поиска заголовков в наборе ресурсов.
[HttpPost]
public ActionResult GetModel(string modelName)
{
var dbModel = _eqService.GetModel(modelName);
var resources = EasyQueryModule.ResourceManager.GetResourceSet(
CultureInfo.CurrentUICulture, false, true
);
Translate(dbModel.EntityRoot.SubEntities, resources);
return Json(dbModel.SaveToDictionary());
}
private static void Translate(IEnumerable<Entity> entities, ResourceSet resources)
{
entities.ForEach(entity =>
{
entity.Name = resources.GetString(entity.Name) ?? entity.Name;
entity.Attributes.ForEach(attribute =>
attribute.Caption = resources.GetString(attribute.Caption) ?? attribute.Caption
);
Translate(entity.SubEntities, resources);
});
}
Это может быть не самый эффективный способ локализации виджета. Я не нашел ничего лучше. Обратите внимание, что я предотвратил ошибку в случае отсутствия элемента ресурса
На мой взгляд, локализованные операторы были бы хорошими, но не обязательными. Они остаются на английском языке до дальнейшего расследования.