Skip to content

Instantly share code, notes, and snippets.

@mattclay
Created April 23, 2016 00:08
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mattclay/fe370d37781ffe884514409d65e25937 to your computer and use it in GitHub Desktop.
Save mattclay/fe370d37781ffe884514409d65e25937 to your computer and use it in GitHub Desktop.
T4 template to export .NET culture information for use with Script#
<#@ template debug="true" hostspecific="false" language="C#" #>
<#@ output extension=".js" #>
<#@ assembly name="System.Core.dll" #>
<#@ import namespace="System.Collections.Generic" #>
<#@ import namespace="System.Globalization" #>
<#@ import namespace="System.Linq" #>
<#
// Configuration: Begin
// List the cultures you want to export to JS.
var cultureNames = new List<string>
{
"en-US",
"zh-CN",
"es-MX",
};
// Override currency culture if your site only operates under a single currency, otherwise set to null.
CultureInfo currencyCulture = CultureInfo.GetCultureInfo("en-US");
// The object to store the culture database in.
string cultureTarget = "Iris.Culture.CultureDB";
// The object to store the metric database in.
string metricTarget = "Iris.Culture.MetricDB";
// Configuration: End
var cultures = cultureNames.Select(t => CultureInfo.GetCultureInfo(t)).ToList();
var percentPositivePattern = new string[] { "n %", "n%", "%n", "% n" };
var percentNegativePattern = new string[] { "-n %", "-n%", "-%n", "%-n", "%n-", "n-%", "n%-", "-% n", "n %-", "% n-", "% -n", "n- %" };
var currencyPositivePattern = new string[] { "$n", "n$", "$ n", "n $" };
var currencyNegativePattern = new string[] { "($n)", "-$n", "$-n", "$n-", "(n$)", "-n$", "n-$", "n$-", "-n $", "-$ n", "n $-", "$ n-", "$ -n", "n- $", "($ n)", "(n $)" };
#>
<# foreach(CultureInfo culture in cultures) { #>
<# CultureInfo currency = currencyCulture ?? culture; #>
<# RegionInfo region = new RegionInfo(culture.Name); #>
<#= metricTarget #>[<#= Quote(culture.Name) #>] = <#= Quote(region.IsMetric) #>;
<#= cultureTarget #>[<#= Quote(culture.Name) #>] = new ss.CultureInfo(<#= Quote(culture.Name) #>,
{
naNSymbol: <#= Quote(culture.NumberFormat.NaNSymbol) #>,
negativeSign: <#= Quote(culture.NumberFormat.NegativeSign) #>,
positiveSign: <#= Quote(culture.NumberFormat.PositiveSign) #>,
negativeInfinityText: <#= Quote(culture.NumberFormat.NegativeInfinitySymbol) #>,
positiveInfinityText: <#= Quote(culture.NumberFormat.PositiveInfinitySymbol) #>,
percentSymbol: <#= Quote(culture.NumberFormat.PercentSymbol) #>,
percentGroupSizes: <#= Quote(culture.NumberFormat.PercentGroupSizes) #>,
percentDecimalDigits: <#= culture.NumberFormat.PercentDecimalDigits #>,
percentDecimalSeparator: <#= Quote(culture.NumberFormat.PercentDecimalSeparator) #>,
percentGroupSeparator: <#= Quote(culture.NumberFormat.PercentGroupSeparator) #>,
percentPositivePattern: <#= QuoteNumericPattern(percentPositivePattern[culture.NumberFormat.PercentPositivePattern]) #>,
percentNegativePattern: <#= QuoteNumericPattern(percentNegativePattern[culture.NumberFormat.PercentNegativePattern]) #>,
currencySymbol: <#= Quote(currency.NumberFormat.CurrencySymbol) #>,
currencyGroupSizes: <#= Quote(currency.NumberFormat.CurrencyGroupSizes) #>,
currencyDecimalDigits: <#= currency.NumberFormat.CurrencyDecimalDigits #>,
currencyDecimalSeparator: <#= Quote(currency.NumberFormat.CurrencyDecimalSeparator) #>,
currencyGroupSeparator: <#= Quote(currency.NumberFormat.CurrencyGroupSeparator) #>,
currencyNegativePattern: <#= QuoteNumericPattern(currencyNegativePattern[currency.NumberFormat.CurrencyNegativePattern]) #>,
currencyPositivePattern: <#= QuoteNumericPattern(currencyPositivePattern[currency.NumberFormat.CurrencyPositivePattern]) #>,
numberGroupSizes: <#= Quote(culture.NumberFormat.NumberGroupSizes) #>,
numberDecimalDigits: <#= culture.NumberFormat.NumberDecimalDigits #>,
numberDecimalSeparator: <#= Quote(culture.NumberFormat.NumberDecimalSeparator) #>,
numberGroupSeparator: <#= Quote(culture.NumberFormat.NumberGroupSeparator) #>
},
{
amDesignator: <#= Quote(culture.DateTimeFormat.AMDesignator) #>,
pmDesignator: <#= Quote(culture.DateTimeFormat.PMDesignator) #>,
dateSeparator: <#= Quote(culture.DateTimeFormat.DateSeparator) #>,
timeSeparator: <#= Quote(culture.DateTimeFormat.TimeSeparator) #>,
gmtDateTimePattern: <#= QuoteDateTimePattern(culture.DateTimeFormat.RFC1123Pattern) #>,
universalDateTimePattern: <#= QuoteDateTimePattern(culture.DateTimeFormat.UniversalSortableDateTimePattern) #>,
sortableDateTimePattern: <#= QuoteDateTimePattern(culture.DateTimeFormat.SortableDateTimePattern) #>,
dateTimePattern: <#= QuoteDateTimePattern(culture.DateTimeFormat.FullDateTimePattern) #>,
longDatePattern: <#= QuoteDateTimePattern(culture.DateTimeFormat.LongDatePattern) #>,
shortDatePattern: <#= QuoteDateTimePattern(culture.DateTimeFormat.ShortDatePattern) #>,
longTimePattern: <#= QuoteDateTimePattern(culture.DateTimeFormat.LongTimePattern) #>,
shortTimePattern: <#= QuoteDateTimePattern(culture.DateTimeFormat.ShortTimePattern) #>,
firstDayOfWeek: <#= (int)culture.DateTimeFormat.FirstDayOfWeek #>,
dayNames: <#= Quote(culture.DateTimeFormat.DayNames) #>,
shortDayNames: <#= Quote(culture.DateTimeFormat.AbbreviatedDayNames) #>,
minimizedDayNames: <#= Quote(culture.DateTimeFormat.ShortestDayNames) #>,
monthNames: <#= Quote(culture.DateTimeFormat.MonthGenitiveNames) #>,
shortMonthNames: <#= Quote(culture.DateTimeFormat.AbbreviatedMonthGenitiveNames) #>
});
<# } #>
<#+
string Quote(string input)
{
return @"'" +
input
.Replace(@"\", @"\\")
.Replace(@"'", @"\'")
+ @"'";
}
string Quote(bool input)
{
return input.ToString().ToLower();
}
string Quote(int[] input)
{
return "[" + String.Join(", ", input) + "]";
}
string Quote<T>(T[] input)
{
return "[" + String.Join(", ", input.Select(t => Quote(t.ToString()))) + "]";
}
string QuoteNumericPattern(string input)
{
return Quote(input.Replace("n", "{0}"));
}
string QuoteDateTimePattern(string input)
{
return Quote(input);
}
#>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment