<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE library PUBLIC "-//Boost//DTD BoostBook XML V1.0//EN" 
"../../../tools/boostbook/dtd/boostbook.dtd">

<!-- Copyright (c) 2001-2005 CrystalClear Software, Inc.
     Subject to the Boost Software License, Version 1.0. 
     (See accompanying file LICENSE_1_0.txt or  http://www.boost.org/LICENSE_1_0.txt)
-->

<section id="date_time.examples.localization">
  <title>Localization Demonstration</title>

  <para>
    The boost::date_time library provides the ability to create customized locale facets. Date ordering, language, seperators, and abbreviations can be customized.
  </para>
  <!-- <para>
    This example uses the new (as of 1.33) date_time IO code. An example using the old code is also provided to demonstrate how much easier customized output is (see <link linkend="date_time.examples.legacy_localization">legacy_localization example</link>). 
  </para> -->
  <programlisting>
    <![CDATA[
  /* The following shows the creation of a facet for the output of 
   * dates in German (please forgive me for any errors in my German --
   * I'm not a native speaker).
   */

  #include "boost/date_time/gregorian/gregorian.hpp"
  #include <iostream>
  #include <algorithm>

  /* Define a series of char arrays for short and long name strings 
   * to be associated with German date output (US names will be 
   * retrieved from the locale). */
  const char* const de_short_month_names[] = 
  {
    "Jan", "Feb", "Mar", "Apr", "Mai", "Jun",
    "Jul", "Aug", "Sep", "Okt", "Nov", "Dez", "NAM" 
  };
  const char* const de_long_month_names[] =
  {
    "Januar", "Februar", "Marz", "April", "Mai",
    "Juni", "Juli", "August", "September", "Oktober",
    "November", "Dezember", "NichtDerMonat"
  };
  const char* const de_long_weekday_names[] = 
  {
    "Sonntag", "Montag", "Dienstag", "Mittwoch",
    "Donnerstag", "Freitag", "Samstag"
  };
  const char* const de_short_weekday_names[] =
  {
    "Son", "Mon", "Die","Mit", "Don", "Fre", "Sam"
  };


  int main() 
  {
    using namespace boost::gregorian;
   
    // create some gregorian objects to output
    date d1(2002, Oct, 1);
    greg_month m = d1.month();
    greg_weekday wd = d1.day_of_week();
    
    // create a facet and a locale for German dates
    date_facet* german_facet = new date_facet();
    std::cout.imbue(std::locale(std::locale::classic(), german_facet));

    // create the German name collections
    date_facet::input_collection_type short_months, long_months, 
                                      short_weekdays, long_weekdays;
    std::copy(&de_short_month_names[0], &de_short_month_names[11],
              std::back_inserter(short_months));
    std::copy(&de_long_month_names[0], &de_long_month_names[11],
              std::back_inserter(long_months));
    std::copy(&de_short_weekday_names[0], &de_short_weekday_names[6],
              std::back_inserter(short_weekdays));
    std::copy(&de_long_weekday_names[0], &de_long_weekday_names[6],
              std::back_inserter(long_weekdays));

    // replace the default names with ours
    // NOTE: date_generators and special_values were not replaced as 
    // they are not used in this example
    german_facet->short_month_names(short_months);
    german_facet->long_month_names(long_months);
    german_facet->short_weekday_names(short_weekdays);
    german_facet->long_weekday_names(long_weekdays);
    
    // output the date in German using short month names
    german_facet->format("%d.%m.%Y");
    std::cout << d1 << std::endl; //01.10.2002
    
    german_facet->month_format("%B");
    std::cout << m << std::endl; //Oktober
    
    german_facet->weekday_format("%A");
    std::cout << wd << std::endl; //Dienstag


    // Output the same gregorian objects using US names
    date_facet* us_facet = new date_facet();
    std::cout.imbue(std::locale(std::locale::classic(), us_facet)); 

    us_facet->format("%m/%d/%Y");
    std::cout << d1 << std::endl; //  10/01/2002
    
    // English names, iso order (year-month-day), '-' separator
    us_facet->format("%Y-%b-%d");
    std::cout << d1 << std::endl; //  2002-Oct-01
    
    return 0;

  }
    ]]>
  </programlisting>
</section>
