/// <summary> /// Compiles the locale provider classes for the given locale files. /// </summary> /// <param name="code"></param> /// <param name="files"></param> /// <param name="accessor"></param> /// <returns></returns> internal static LocaleProviderType[] CompileLocaleFiles(Class code, LocaleFile[] files, string accessor) { // init LocaleFile[] defaultFiles = null; // find a list of all cultures (ordered by invariant, language, dialect) var cultures = files .Select(x => (Culture)x.XmlLang) .Concat(LocaleProvider.Defaults.Select(x => x.Culture)) .Distinct() .OrderBy(x => x.ToString()) .ToArray(); // render code var results = new List <LocaleProviderType>(); foreach (var culture in cultures) { // base class var baseClass = results.SingleOrDefault(x => x.Culture == culture.Language) ?? results.FirstOrDefault(); // find file var file = files.SingleOrDefault(x => x.XmlLang == culture); // compile required? LocaleProviderType result = null; if (file == null && (baseClass == null || baseClass.IsPreCompiled)) { // use the precompiled version result = new LocaleProviderType(culture, null); } else { // compile required if (file == null) { // get default files if (defaultFiles == null) { defaultFiles = LocaleFile.Defaults; } // find default file file = defaultFiles.Single(x => x.XmlLang == culture); } // compile result = Compile(code, file, "{0}", baseClass, accessor, culture); } // add results.Add(result); } // done return(results.ToArray()); }
/// <summary> /// Compiles the given locale into a nested class inside the Processor class. /// </summary> /// <param name="code"></param> /// <param name="classNameTemplate"></param> /// <param name="baseClass"></param> /// <param name="accessor"></param> /// <param name="culture"></param> /// <returns></returns> private static LocaleProviderType Compile(Class code, ILocale locale, string classNameTemplate, LocaleProviderType baseClass, string accessor, Culture culture) { // init var className = "@" + string.Format(classNameTemplate, culture.GetMethodName()); // class using (var @class = code.AppendNestedClass("{0} class {1} : {2}", accessor, className, (baseClass == null ? "LocaleProvider" : baseClass.ClassName))) { // summary @class.Summary = (culture.IsInvariant ? "Invariant." : culture.ToString()); // ctor() using (var block = @class.AppendMethod("public {0}() : base({1})", className, Compiler.GetLiteral(culture.ToString()))) { } // ctor(string culture) using (var block = @class.AppendMethod("protected {0}(Culture culture) : base(culture)", className)) { } // style options CompileStyleOptions(@class, locale.StyleOptions); // date parts CompileDatePartParameters(@class, locale.Dates, DateFormat.Numeric); CompileDatePartParameters(@class, locale.Dates, DateFormat.Text); // ordinals CompileOrdinals(@class, locale.Terms); CompileLongOrdinals(@class, locale.Terms); // terms CompileTerms(@class, locale.Terms); CompileTermGender(@class, locale.Terms); } // done return(new LocaleProviderType(culture, className)); }