После большого количества поисков в Google и неудовлетворенности большинством представленных решений, я только что нашел удивительное / универсальное решение, которое использует T4 шаблонов . Полный пост Йохен ван Вайлик вы можете прочитать здесь:
Использование T4 для локализации ресурсов JavaScript на основе файлов .resx
Основные преимущества:
- Наличие только 1 места, где ресурсы управляются (а именно .resx
файлы)
- Поддержка нескольких культур
- Использование IntelliSense - допускать завершение кода
Недостатки:
Недостатки этого решения, конечно, в том, что размер
Файл .js может стать довольно большим. Тем не менее, так как он кэшируется
браузер, мы не считаем это проблемой для нашего приложения. тем не мение
- это кэширование также может привести к тому, что браузер не найдет ресурс, вызванный из кода.
Как это работает?
По сути, он определил шаблон T4, который указывает на ваши файлы .resx. С помощью некоторого кода на C # он обходит каждую строку ресурса и добавляет ее в свойства значения чистого ключа JavaScript, которые затем выводятся в один файл JavaScript с именем Resources.js
(вы можете настроить имена, если хотите).
Шаблон T4 [изменить соответствующим образом, чтобы указать местоположение ваших файлов .resx]
<#@ template language="C#" debug="false" hostspecific="true"#>
<#@ assembly name="System.Windows.Forms" #>
<#@ import namespace="System.Resources" #>
<#@ import namespace="System.Collections" #>
<#@ import namespace="System.IO" #>
<#@ output extension=".js"#>
<#
var path = Path.GetDirectoryName(Host.TemplateFile) + "/../App_GlobalResources/";
var resourceNames = new string[1]
{
"Common"
};
#>
/**
* Resources
* ---------
* This file is auto-generated by a tool
* 2012 Jochen van Wylick
**/
var Resources = {
<# foreach (var name in resourceNames) { #>
<#=name #>: {},
<# } #>
};
<# foreach (var name in resourceNames) {
var nlFile = Host.ResolvePath(path + name + ".nl.resx" );
var enFile = Host.ResolvePath(path + name + ".resx" );
ResXResourceSet nlResxSet = new ResXResourceSet(nlFile);
ResXResourceSet enResxSet = new ResXResourceSet(enFile);
#>
<# foreach (DictionaryEntry item in nlResxSet) { #>
Resources.<#=name#>.<#=item.Key.ToString()#> = {
'nl-NL': '<#= ("" + item.Value).Replace("\r\n", string.Empty).Replace("'","\\'")#>',
'en-GB': '<#= ("" + enResxSet.GetString(item.Key.ToString())).Replace("\r\n", string.Empty).Replace("'","\\'")#>'
};
<# } #>
<# } #>
В форме / виде сбоку
Чтобы правильно подобрать перевод, добавьте его в свой мастер, если вы используете WebForms:
<script type="text/javascript">
var locale = '<%= System.Threading.Thread.CurrentThread.CurrentCulture.Name %>';
</script>
<script type="text/javascript" src="/Scripts/Resources.js"></script>
Если вы используете ASP.NET MVC (как и я), вы можете сделать это:
<script type="text/javascript">
// Setting Locale that will be used by JavaScript translations
var locale = $("meta[name='accept-language']").attr("content");
</script>
<script type="text/javascript" src="/Scripts/Resources.js"></script>
Помощник MetaAcceptLanguage
, который я получил от этого удивительного поста Скотта Хансельмана:
Глобализация, интернационализация и локализация в ASP.NET MVC 3, JavaScript и jQuery - часть 1
public static IHtmlString MetaAcceptLanguage<T>(this HtmlHelper<T> html)
{
var acceptLanguage =
HttpUtility.HtmlAttributeEncode(
Thread.CurrentThread.CurrentUICulture.ToString());
return new HtmlString(
String.Format("<meta name=\"{0}\" content=\"{1}\">", "accept-language",
acceptLanguage));
}
Используйте это
var msg = Resources.Common.Greeting[locale];
alert(msg);