using System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.Globalization; namespace RobvanderWoude { public class TranslateCulture { public static int Main( string[] args ) { try { List cultures = new List( ); //IComparer myComparer = new CultureNameComparer( ); #region Command Line Parsing string format = "list"; string output = "all"; bool sort = false; if ( args.Length > 0 ) { foreach ( string arg in args ) { switch ( arg.ToLower( ) ) { case "/?": return WriteError( string.Empty ); case "/c": if ( format != "list" ) { return WriteError( "Duplicate or conflicting command line switches." ); } format = "csv"; break; case "/m": if ( output != "all" ) { return WriteError( "Duplicate or conflicting command line switches." ); } output = "monthnames"; break; case "/s": if ( sort ) { return WriteError( "Duplicate command line switches." ); } sort = true; break; case "/w": if ( output != "all" ) { return WriteError( "Duplicate or conflicting command line switches." ); } output = "weekdays"; break; default: CultureInfo cult = CultureInfo.GetCultureInfo( arg ); if ( cultures.Contains( cult ) ) { return WriteError( "Duplicate cultures specified." ); } cultures.Add( cult ); break; } } } #endregion Command Line Parsing if ( cultures.Count == 0 ) { cultures.AddRange( CultureInfo.GetCultures( CultureTypes.AllCultures ) ); } if ( sort ) { CultureNameComparer comp = new CultureNameComparer( ); cultures.Sort( comp ); } foreach ( CultureInfo culture in cultures ) { Console.WriteLine( ShowCultureInfo( culture, output, format ) ); } return 0; } catch ( Exception e ) { return WriteError( e.Message ); } } // Custom CultureInfo.Name comparer, by Bas van der Woude public class CultureNameComparer : Comparer { public override int Compare( CultureInfo x, CultureInfo y ) { if ( x == null ) { throw new ArgumentNullException( "x" ); } if ( y == null ) { throw new ArgumentNullException( "y" ); } return string.Compare( x.Name, y.Name, StringComparison.InvariantCultureIgnoreCase ); } } // Format the requested info for the specified culture public static string ShowCultureInfo( CultureInfo culture, string display, string format ) { string output = string.Empty; CultureInfo local = CultureInfo.CurrentCulture; switch ( format ) { case "csv": output = String.Format( culture, "\"{0}\",", culture.Name ); break; case "list": output = String.Format( culture, "\n{0,-12} {1}\n{2,-12} {3}", local.Name, culture.Name, "====================".Substring( 0, local.Name.Length ), "====================".Substring( 0, culture.Name.Length ) ); break; } string[] days = culture.DateTimeFormat.DayNames; string[] localdays = local.DateTimeFormat.DayNames; string[] months = culture.DateTimeFormat.MonthNames; string[] localmonths = local.DateTimeFormat.MonthNames; if ( display != "monthnames" ) { for ( int i = 0; i < 7; i++ ) { if ( !string.IsNullOrEmpty( days[i] ) ) { switch ( format ) { case "csv": output += days[i] + "\",\""; break; case "list": output += String.Format( "\n{0,-12} -> {1}", localdays[i], days[i] ); break; } } } } if ( display != "weekdays" ) { for ( int i = 0; i < 12; i++ ) { if ( !string.IsNullOrEmpty( months[i] ) ) { switch ( format ) { case "csv": output += months[i] + "\",\""; break; case "list": output += String.Format( "\n{0,-12} -> {1}", localmonths[i], months[i] ); break; } } } } if ( display == "csv" ) { output = output.Substring( 0, output.Length - 2 ); } return output; } #region Error Handling // Code to display help and optional error message, by Bas van der Woude public static int WriteError( Exception e ) { return WriteError( e == null ? null : e.Message ); } public static int WriteError( string errorMessage ) { string exeName = Process.GetCurrentProcess( ).ProcessName; /* TranslateCulture, Version 1.00 List translations for weekdays and/or month names for the specified culture(s) Usage: TRANSLATECULTURE [culture [culture [...]]] [/M|/W] [/S] [/C] Where: culture is a culture name, e.g. 'pt-BR' for Portugese (Brasil); multiple cultures allowed on a single command line; if no culture is specified, ALL known cultures are listed. /C formats output as CSV (default: list) /M lists month names only (default: month names and weekdays) /S sorts by culture name (default: list in command line order) /W lists weekdays only (default: month names and weekdays) Notes: List format looks like 'Sunday -> domingo' (Sunday in local language). The /M and /W switches are mutually exclusive. Sort function optimized by Bas van der Woude. Written by Rob van der Woude http://www.robvanderwoude.com */ if ( string.IsNullOrEmpty( errorMessage ) == false ) { Console.Error.WriteLine( ); Console.ForegroundColor = ConsoleColor.Red; Console.Error.Write( "ERROR: " ); Console.ForegroundColor = ConsoleColor.White; Console.Error.WriteLine( errorMessage ); Console.ResetColor( ); } Console.Error.WriteLine( ); Console.Error.WriteLine( "{0}, Version 1.00", exeName ); Console.Error.WriteLine( "List translations for weekdays and/or month names for the specified culture(s)" ); Console.Error.WriteLine( ); Console.Error.Write( "Usage: " ); Console.ForegroundColor = ConsoleColor.White; Console.Error.WriteLine( "{0} [culture [culture [...]]] [/M|/W] [/S] [/C]", exeName.ToUpper( ) ); Console.ResetColor( ); Console.Error.WriteLine( ); Console.Error.Write( "Where: " ); Console.ForegroundColor = ConsoleColor.White; Console.Error.Write( "culture" ); Console.ResetColor( ); Console.Error.WriteLine( " is a culture name, e.g. 'pt-BR' for Portugese (Brasil);" ); Console.Error.WriteLine( " multiple cultures allowed on a single command line; if" ); Console.Error.Write( " no culture is specified, " ); Console.ForegroundColor = ConsoleColor.White; Console.Error.Write( "all" ); Console.ResetColor( ); Console.Error.WriteLine( " known cultures are listed." ); Console.ForegroundColor = ConsoleColor.White; Console.Error.Write( " /C " ); Console.ResetColor( ); Console.Error.WriteLine( "formats output as CSV (default: list)" ); Console.ForegroundColor = ConsoleColor.White; Console.Error.Write( " /M " ); Console.ResetColor( ); Console.Error.WriteLine( "lists month names only (default: month names and weekdays)" ); Console.ForegroundColor = ConsoleColor.White; Console.Error.Write( " /S " ); Console.ResetColor( ); Console.Error.WriteLine( "sorts by culture name (default: list in command line order)" ); Console.ForegroundColor = ConsoleColor.White; Console.Error.Write( " /W " ); Console.ResetColor( ); Console.Error.WriteLine( "lists weekdays only (default: month names and weekdays)" ); Console.Error.WriteLine( ); Console.Error.Write( "Notes: List format looks like '" ); Console.ForegroundColor = ConsoleColor.White; Console.Error.Write( "Sunday -> domingo" ); Console.ResetColor( ); Console.Error.WriteLine( "' (Sunday in local language)." ); Console.Error.Write( " The " ); Console.ForegroundColor = ConsoleColor.White; Console.Error.Write( "/M" ); Console.ResetColor( ); Console.Error.Write( " and " ); Console.ForegroundColor = ConsoleColor.White; Console.Error.Write( "/W" ); Console.ResetColor( ); Console.Error.WriteLine( " switches are mutually exclusive." ); Console.Error.WriteLine( " Sort function optimized by Bas van der Woude." ); Console.Error.WriteLine( ); Console.Error.WriteLine( "Written by Rob van der Woude" ); Console.Error.WriteLine( "http://www.robvanderwoude.com" ); return 1; } #endregion Error Handling } }