// Example for use of GNU gettext.
// This file is in the public domain.

// Source code of the C++ program.

#include <wx/wx.h>
#include <wx/intl.h>

/* Get getpid() declaration.  */
#if defined _WIN32 && !defined __CYGWIN__
/* native Windows API */
# include <process.h>
# define getpid _getpid
#else
/* POSIX API */
# include <unistd.h>
#endif

class MyApp: public wxApp
{
public:
  virtual bool OnInit();
private:
  // wxWidgets has the concept of a "current locale". It is the one returned
  // by wxGetLocale() and implicitly used by wxGetTranslation.
  // But there is no way to explicitly set this current locale! Rather, it is
  // always set to the last constructed locale(!), and is modified when a
  // locale is destroyed. In such a way that the current locale points to
  // invalid memory after you do
  //    wxLocale *a = new wxLocale;
  //    wxLocale *b = new wxLocale;
  //    delete a;
  //    delete b;
  // So, to avoid problems, we use exactly one instance of wxLocale, and keep
  // it alive for the entire application lifetime.
  wxLocale appLocale;
};

class MyFrame: public wxFrame
{
public:
  MyFrame();
};

// This defines the main() function.
IMPLEMENT_APP(MyApp)

bool MyApp::OnInit()
{
  // First, register the base directory where to look up .mo files.
  wxLocale::AddCatalogLookupPathPrefix(wxT(LOCALEDIR));
  // Second, initialize the locale and set the application-wide message domain.
  appLocale.Init();
  appLocale.AddCatalog(wxT("hello-c++-wxwidgets"));
  // Now wxGetLocale() is initialized appropriately.

  // Then only start building the GUI elements of the application.

  // Create the main frame window.
  MyFrame *frame = new MyFrame();

  // Show the frame.
  frame->Show(true);
  SetTopWindow(frame);

  return true;
}

MyFrame::MyFrame()
  : wxFrame(NULL, wxID_ANY, _T("Hello example"))
{
  wxStaticText *label1 =
    new wxStaticText(this, wxID_ANY, _("Hello, world!"));

  wxString label2text =
    wxString::Format(_("This program is running as process number %d."),
                     getpid());
  wxStaticText *label2 =
    new wxStaticText(this, wxID_ANY, label2text);

  wxBoxSizer *topSizer = new wxBoxSizer(wxVERTICAL);
  topSizer->Add(label1);
  topSizer->Add(label2);
  SetSizer(topSizer);
}
