// LocaleDemo.cpp

#include <iostream>
#include <locale>

class german_bool_names : public std::numpunct_byname<char> {
public:
  german_bool_names (const char *name)
    : std::numpunct_byname<char>(name)
  {}
protected:
  virtual std::string do_truename() const {
    return "wahr";
  }
  virtual std::string do_falsename() const {
    return "falsch";
  }
};

class portuguese_bool_names : public std::numpunct_byname
<char> {
public:
  portuguese_bool_names (const char *name)
    : std::numpunct_byname<char>(name) 
  {}
protected:
  virtual std::string do_truename() const {
    return "verdadeiro";
  }
  virtual std::string do_falsename() const {
    return "falso";
  }
};

int main()
{
  using namespace std;

  locale loc("");
  locale bra(locale("Portuguese_Brazil"), 
  new portuguese_bool_names(""));
  locale ger(locale("German_Germany"), 
  new german_bool_names(""));

  cout << use_facet<numpunct<char
  > >(bra).truename() << endl;
  cout << use_facet<numpunct<char
  > >(ger).truename() << endl;
  cout << use_facet<numpunct<char
  > >(loc).truename() << endl;

  cout.imbue(bra);
  cout << boolalpha << true << " " 
  << false << endl;

  cout.imbue(ger);
  cout << boolalpha << true << " " 
  << false << endl;

  cout.imbue(loc);
  cout << boolalpha << true << " " 
  << false << endl;

  return 0;
}