initial commit

Signed-off-by: Peter Siegmund <mars3142@noreply.mars3142.dev>
This commit is contained in:
2025-10-31 23:37:30 +01:00
commit bf6b52fd94
9654 changed files with 4035664 additions and 0 deletions

View File

@@ -0,0 +1,154 @@
///////////////////////////////////////////////////////////////////////////////
// Name: wx/private/addremovectrl.h
// Purpose: wxAddRemoveImpl helper class declaration
// Author: Vadim Zeitlin
// Created: 2015-02-04
// Copyright: (c) 2015 Vadim Zeitlin <vadim@wxwidgets.org>
// Licence: wxWindows licence
///////////////////////////////////////////////////////////////////////////////
#ifndef _WX_PRIVATE_ADDREMOVECTRL_H_
#define _WX_PRIVATE_ADDREMOVECTRL_H_
#include "wx/button.h"
#include "wx/sizer.h"
// ----------------------------------------------------------------------------
// wxAddRemoveImplBase: implementation-only part of wxAddRemoveCtrl, base part
// ----------------------------------------------------------------------------
class wxAddRemoveImplBase
{
public:
// Base class ctor just initializes the associated adaptor, the derived
// class is supposed to create the buttons and layout everything.
//
// Takes ownership of the adaptor pointer.
explicit wxAddRemoveImplBase(wxAddRemoveAdaptor* adaptor,
wxAddRemoveCtrl* WXUNUSED(parent),
wxWindow* ctrlItems)
: m_adaptor(adaptor)
{
ctrlItems->Bind(wxEVT_CHAR, &wxAddRemoveImplBase::OnChar, this);
}
// wxOSX implementation needs to override this as it doesn't use sizers,
// for the others it is not necessary.
virtual wxSize GetBestClientSize() const { return wxDefaultSize; }
virtual void SetButtonsToolTips(const wxString& addtip,
const wxString& removetip) = 0;
virtual ~wxAddRemoveImplBase()
{
delete m_adaptor;
}
// Event handlers which must be connected to the appropriate sources by the
// derived classes.
void OnUpdateUIAdd(wxUpdateUIEvent& event)
{
event.Enable( m_adaptor->CanAdd() );
}
void OnUpdateUIRemove(wxUpdateUIEvent& event)
{
event.Enable( m_adaptor->CanRemove() );
}
void OnAdd(wxCommandEvent& WXUNUSED(event))
{
m_adaptor->OnAdd();
}
void OnRemove(wxCommandEvent& WXUNUSED(event))
{
m_adaptor->OnRemove();
}
private:
// This event handler is connected by this class itself and doesn't need to
// be accessible to the derived classes.
void OnChar(wxKeyEvent& event)
{
switch ( event.GetKeyCode() )
{
case '+':
case WXK_INSERT:
case WXK_NUMPAD_INSERT:
if ( m_adaptor->CanAdd() )
m_adaptor->OnAdd();
return;
case '-':
case WXK_DELETE:
case WXK_NUMPAD_DELETE:
if ( m_adaptor->CanRemove() )
m_adaptor->OnRemove();
return;
}
event.Skip();
}
wxAddRemoveAdaptor* const m_adaptor;
wxDECLARE_NO_COPY_CLASS(wxAddRemoveImplBase);
};
// GTK+ uses a wxToolBar-based implementation and so doesn't need this class.
#ifndef __WXGTK__
// Base class for the ports using actual wxButtons for the "+"/"-" buttons.
class wxAddRemoveImplWithButtons : public wxAddRemoveImplBase
{
public:
explicit wxAddRemoveImplWithButtons(wxAddRemoveAdaptor* adaptor,
wxAddRemoveCtrl* parent,
wxWindow* ctrlItems)
: wxAddRemoveImplBase(adaptor, parent, ctrlItems)
{
m_btnAdd =
m_btnRemove = nullptr;
}
virtual void SetButtonsToolTips(const wxString& addtip,
const wxString& removetip) override
{
m_btnAdd->SetToolTip(addtip);
m_btnRemove->SetToolTip(removetip);
}
protected:
// Must be called by the derived class ctor after creating the buttons to
// set up the event handlers.
void SetUpEvents()
{
m_btnAdd->Bind(wxEVT_UPDATE_UI,
&wxAddRemoveImplBase::OnUpdateUIAdd, this);
m_btnRemove->Bind(wxEVT_UPDATE_UI,
&wxAddRemoveImplBase::OnUpdateUIRemove, this);
m_btnAdd->Bind(wxEVT_BUTTON, &wxAddRemoveImplBase::OnAdd, this);
m_btnRemove->Bind(wxEVT_BUTTON, &wxAddRemoveImplBase::OnRemove, this);
}
wxButton *m_btnAdd,
*m_btnRemove;
wxDECLARE_NO_COPY_CLASS(wxAddRemoveImplWithButtons);
};
#endif // !wxGTK
#ifdef __WXOSX__
#include "wx/osx/private/addremovectrl.h"
#elif defined(__WXGTK__)
#include "wx/gtk/private/addremovectrl.h"
#else
#include "wx/generic/private/addremovectrl.h"
#endif
#endif // _WX_PRIVATE_ADDREMOVECTRL_H_

View File

@@ -0,0 +1,44 @@
/////////////////////////////////////////////////////////////////////////////
// Name: wx/private/animate.h
// Purpose: wxAnimationImpl declaration
// Author: Robin Dunn, Vadim Zeitlin
// Created: 2020-04-06
// Copyright: (c) 2020 wxWidgets development team
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
#ifndef _WX_PRIVATE_ANIMATEH__
#define _WX_PRIVATE_ANIMATEH__
// ----------------------------------------------------------------------------
// wxAnimationImpl
// ----------------------------------------------------------------------------
class WXDLLIMPEXP_CORE wxAnimationImpl : public wxRefCounter
{
public:
wxAnimationImpl() = default;
virtual ~wxAnimationImpl() = default;
virtual bool IsOk() const = 0;
virtual bool IsCompatibleWith(wxClassInfo* ci) const = 0;
// can be -1
virtual int GetDelay(unsigned int frame) const = 0;
virtual unsigned int GetFrameCount() const = 0;
virtual wxImage GetFrame(unsigned int frame) const = 0;
virtual wxSize GetSize() const = 0;
virtual bool LoadFile(const wxString& name,
wxAnimationType type = wxANIMATION_TYPE_ANY) = 0;
virtual bool Load(wxInputStream& stream,
wxAnimationType type = wxANIMATION_TYPE_ANY) = 0;
// This function creates the default implementation for this platform:
// currently it's wxAnimationGTKImpl under wxGTK and wxAnimationGenericImpl
// under all the other platforms.
static wxAnimationImpl *CreateDefault();
};
#endif // _WX_PRIVATE_ANIMATEH__

View File

@@ -0,0 +1,37 @@
///////////////////////////////////////////////////////////////////////////////
// Name: wx/private/aui.h
// Purpose: Private wxAUI declarations.
// Author: Vadim Zeitlin
// Created: 2025-03-13
// Copyright: (c) 2025 Vadim Zeitlin <vadim@wxwidgets.org>
// Licence: wxWindows licence
///////////////////////////////////////////////////////////////////////////////
#ifndef _WX_PRIVATE_AUI_H_
#define _WX_PRIVATE_AUI_H_
#include "wx/bmpbndl.h"
// wxAuiCreateBitmap() is a utility function that creates a bitmap using the
// given colour from monochrome image defined by either SVG (if supported in
// this build) or XBM data.
#ifdef wxHAS_SVG
// SVG data must start with a new line (this is convenient when embedding it as
// a raw string) and use "currentColor" for the colour to be mapped to the
// given colour.
wxBitmapBundle wxAuiCreateBitmap(const char* svgData, int w, int h,
const wxColour& color);
#else // !wxHAS_SVG
// When using XBM, the black bits of the given monochrome bitmap define the
// mask of the returned bitmap and white bits are mapped to the given colour.
wxBitmap wxAuiCreateBitmap(const unsigned char bits[], int w, int h,
const wxColour& color);
#endif // wxHAS_SVG/!wxHAS_SVG
// Define some specialized functions to create bitmaps used in both dockart.cpp
// and tabart.cpp.
wxBitmapBundle wxAuiCreateCloseButtonBitmap(const wxColour& color);
wxBitmapBundle wxAuiCreatePinButtonBitmap(const wxColour& color);
#endif // _WX_PRIVATE_AUI_H_

View File

@@ -0,0 +1,34 @@
///////////////////////////////////////////////////////////////////////////////
// Name: wx/private/bmpbndl.h
// Purpose: wxBitmapBundleImpl declaration.
// Author: Vadim Zeitlin
// Created: 2021-09-22
// Copyright: (c) 2021 Vadim Zeitlin <vadim@wxwidgets.org>
// Licence: wxWindows licence
///////////////////////////////////////////////////////////////////////////////
#ifndef _WX_PRIVATE_BMPBNDL_H_
#define _WX_PRIVATE_BMPBNDL_H_
#include "wx/bmpbndl.h"
#ifdef __WXOSX__
// this methods are wx-private, may change in the future
WXImage WXDLLIMPEXP_CORE wxOSXGetImageFromBundle(const wxBitmapBundle& bundle);
wxBitmapBundle WXDLLIMPEXP_CORE wxOSXMakeBundleFromImage(WXImage image);
WXImage WXDLLIMPEXP_CORE wxOSXImageFromBitmap(const wxBitmap& bmp);
#if wxOSX_USE_COCOA
void WXDLLIMPEXP_CORE wxOSXAddBitmapToImage(WXImage image, const wxBitmap& bmp);
#endif
// for hiding the storage of the NSImage with wxBitmapBundleImpls from public API
WXImage WXDLLIMPEXP_CORE wxOSXGetImageFromBundleImpl(const wxBitmapBundleImpl* impl);
void WXDLLIMPEXP_CORE wxOSXSetImageForBundleImpl(const wxBitmapBundleImpl* impl, WXImage image);
void WXDLLIMPEXP_CORE wxOSXBundleImplDestroyed(const wxBitmapBundleImpl* impl);
#endif
#endif // _WX_PRIVATE_BMPBNDL_H_

View File

@@ -0,0 +1,205 @@
/////////////////////////////////////////////////////////////////////////////
// Name: wx/private/display.h
// Purpose: wxDisplayImpl class declaration
// Author: Vadim Zeitlin
// Created: 2006-03-15
// Copyright: (c) 2002-2006 Vadim Zeitlin <vadim@wxwidgets.org>
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
#ifndef _WX_PRIVATE_DISPLAY_H_
#define _WX_PRIVATE_DISPLAY_H_
#include "wx/display.h"
#include "wx/gdicmn.h" // for wxRect
#include "wx/vector.h"
// ----------------------------------------------------------------------------
// wxDisplayFactory: allows to create wxDisplay objects
// ----------------------------------------------------------------------------
class wxDisplayFactory
{
public:
wxDisplayFactory() = default;
virtual ~wxDisplayFactory() { ClearImpls(); }
// Create the display if necessary using CreateDisplay(), otherwise just
// get it from cache.
wxObjectDataPtr<wxDisplayImpl> GetDisplay(unsigned n);
// Return the primary display object, creating it if necessary.
wxObjectDataPtr<wxDisplayImpl> GetPrimaryDisplay();
// get the total number of displays
virtual unsigned GetCount() = 0;
// return the display for the given point or wxNOT_FOUND
virtual int GetFromPoint(const wxPoint& pt) = 0;
// return the display with biggest intersection with the given rectangle or
// wxNOT_FOUND
virtual int GetFromRect(const wxRect& rect);
// return the display for the given window or wxNOT_FOUND
//
// the window pointer must not be null (i.e. caller should check it)
virtual int GetFromWindow(const wxWindow *window);
// Trigger recreation of wxDisplayImpl when they're needed the next time.
virtual void UpdateOnDisplayChange();
protected:
// create a new display object
//
// it can return a null pointer if the display creation failed
virtual wxDisplayImpl *CreateDisplay(unsigned n) = 0;
// check if the given display is still connected and update its properties
// if this is the case (notably its index)
//
// mark display as disconnected and return false otherwise
//
// default implementation considers all displays as being not connected any
// longer, port-specific implementations should override it to keep the
// objects corresponding to the still connected displays valid
virtual bool RefreshOnDisplayChange(wxDisplayImpl& impl) const;
private:
// Delete all the elements of m_impls vector and clear it.
void ClearImpls();
// On-demand populated vector of wxDisplayImpl objects.
wxVector<wxObjectDataPtr<wxDisplayImpl>> m_impls;
wxDECLARE_NO_COPY_CLASS(wxDisplayFactory);
};
// ----------------------------------------------------------------------------
// wxDisplayImpl: base class for all wxDisplay implementations
// ----------------------------------------------------------------------------
class wxDisplayImpl : public wxObjectRefData
{
public:
// virtual dtor for this base class
virtual ~wxDisplayImpl() = default;
// return the full area of this display
virtual wxRect GetGeometry() const = 0;
// return the area of the display available for normal windows
virtual wxRect GetClientArea() const { return GetGeometry(); }
// return the depth or 0 if unknown
virtual int GetDepth() const = 0;
// return the scale factor used to convert logical pixels to physical ones
virtual double GetScaleFactor() const { return 1.0; }
// return the resolution of the display, by default uses GetScaleFactor(),
// but can be also overridden directly, as is done in wxMSW
virtual wxSize GetPPI() const { return wxDisplay::GetStdPPI()*GetScaleFactor(); }
// return the name (may be empty)
virtual wxString GetName() const { return wxString(); }
// return the index of this display
unsigned GetIndex() const { return m_index; }
// return true if this is the primary monitor (usually one with index 0)
virtual bool IsPrimary() const { return GetIndex() == 0; }
#if wxUSE_DISPLAY
// implements wxDisplay::GetModes()
virtual wxArrayVideoModes GetModes(const wxVideoMode& mode) const = 0;
// get current video mode
virtual wxVideoMode GetCurrentMode() const = 0;
// change current mode, return true if succeeded, false otherwise
virtual bool ChangeMode(const wxVideoMode& mode) = 0;
#endif // wxUSE_DISPLAY
// return true, if this display is still connected physically to system
bool IsConnected() const { return m_isConnected; }
// indicate that this display is not connected to system anymore
void Disconnect() { m_isConnected = false; }
protected:
// create the object providing access to the display with the given index
wxDisplayImpl(unsigned n) : m_index(n) { }
// the index of this display (0 is always the primary one)
unsigned m_index;
// true, if this display is still connected physically to system
bool m_isConnected = true;
friend class wxDisplayFactory;
wxDECLARE_NO_COPY_CLASS(wxDisplayImpl);
};
// ----------------------------------------------------------------------------
// wxDisplayImplSingle: the simplest possible impl for the main display only
// ----------------------------------------------------------------------------
// Note that this is still an ABC and GetGeometry() and GetClientArea() methods
// must be implemented in the derived classes.
class WXDLLEXPORT wxDisplayImplSingle : public wxDisplayImpl
{
public:
wxDisplayImplSingle() : wxDisplayImpl(0) { }
#if wxUSE_DISPLAY
// no video modes support for us, provide just the stubs
virtual wxArrayVideoModes
GetModes(const wxVideoMode& WXUNUSED(mode)) const override
{
return wxArrayVideoModes();
}
virtual wxVideoMode GetCurrentMode() const override
{
return wxVideoMode();
}
virtual bool ChangeMode(const wxVideoMode& WXUNUSED(mode)) override
{
return false;
}
#endif // wxUSE_DISPLAY
wxDECLARE_NO_COPY_CLASS(wxDisplayImplSingle);
};
// ----------------------------------------------------------------------------
// wxDisplayFactorySingle
// ----------------------------------------------------------------------------
// This is the simplest implementation of wxDisplayFactory using single/main
// display only. It is used when wxUSE_DISPLAY == 0 because getting the size of
// the main display is always needed.
//
// Note that this is still an ABC and derived classes must implement
// CreateSingleDisplay().
class wxDisplayFactorySingle : public wxDisplayFactory
{
public:
virtual unsigned GetCount() override { return 1; }
virtual int GetFromPoint(const wxPoint& pt) override;
protected:
virtual wxDisplayImpl *CreateDisplay(unsigned n) override;
virtual wxDisplayImpl *CreateSingleDisplay() = 0;
};
#endif // _WX_PRIVATE_DISPLAY_H_

View File

@@ -0,0 +1,66 @@
///////////////////////////////////////////////////////////////////////////////
// Name: wx/private/elfversion.h
// Purpose: Helper macro for assigning ELF version to a symbol.
// Author: Vadim Zeitlin
// Created: 2025-04-14
// Copyright: (c) 2025 Vadim Zeitlin <vadim@wxwidgets.org>
// Licence: wxWindows licence
///////////////////////////////////////////////////////////////////////////////
#ifndef _WX_PRIVATE_ELFVERSION_H_
#define _WX_PRIVATE_ELFVERSION_H_
// This symbol is defined by configure if .symver directive is supported.
#ifdef wxHAVE_ELF_SYMVER
// Prefer to use the attribute if it is available, as it works with LTO,
// unlike the assembler directive.
#ifdef __has_attribute
#if __has_attribute(__symver__)
#define wxELF_SYMVER(sym, symver) __attribute__((__symver__(symver)))
#endif
#endif
#ifndef wxELF_SYMVER
#define wxELF_SYMVER(sym, symver) __asm__(".symver " sym "," symver);
#endif
// Using multiple versions for the same symbols may be not supported, in
// which case we omit it: this results in generating 2 default versions for
// the same symbol, which looks wrong, but doesn't seem to cause any
// problems.
#ifdef wxHAVE_ELF_SYMVER_MULTIPLE
#define wxELF_SYMVER_NON_DEFAULT(sym, ver) wxELF_SYMVER(sym, ver)
#else
#define wxELF_SYMVER_NON_DEFAULT(sym, ver)
#endif
// Our version tag depends on whether we're using Unicode or not.
#if wxUSE_UNICODE
#define wxMAKE_ELF_VERSION_TAG(ver) "WXU_" ver
#else
#define wxMAKE_ELF_VERSION_TAG(ver) "WX_" ver
#endif
// This macro is used to repair ABI compatibility problems with the symbols
// versions if any symbols are added with the wrong "3.4" version tag
// because their definitions in the version script were erroneous.
//
// It allows to define both the old, compatible version ("3.4") and the new
// ("3.4.N") one for the given symbol to restore ABI compatibility with the
// previous releases without breaking it with the release containing the
// corrected version.
//
// The parameters are the mangled symbol name (the simplest way to get is
// probably to use nm or readelf on the object file or library) and the
// part of the version after "WX[U]_", i.e. the version number itself.
//
// Note that this macro takes strings, not symbols, and that it includes
// the trailing semicolon for consistency with the empty version below.
#define wxELF_VERSION_COMPAT(sym, ver) \
wxELF_SYMVER_NON_DEFAULT(sym, sym "@" wxMAKE_ELF_VERSION_TAG("3.4")) \
wxELF_SYMVER(sym, sym "@@" wxMAKE_ELF_VERSION_TAG(ver))
#else
#define wxELF_VERSION_COMPAT(sym, ver)
#endif
#endif // _WX_PRIVATE_ELFVERSION_H_

View File

@@ -0,0 +1,29 @@
///////////////////////////////////////////////////////////////////////////////
// Name: wx/private/eventloopsourcesmanager.h
// Purpose: declares wxEventLoopSourcesManagerBase class
// Author: Rob Bresalier
// Created: 2013-06-19
// Copyright: (c) 2013 Rob Bresalier
// Licence: wxWindows licence
///////////////////////////////////////////////////////////////////////////////
#ifndef _WX_PRIVATE_EVENTLOOPSOURCESMANAGER_H_
#define _WX_PRIVATE_EVENTLOOPSOURCESMANAGER_H_
// For pulling in the value of wxUSE_EVENTLOOP_SOURCE
#include "wx/evtloop.h"
#if wxUSE_EVENTLOOP_SOURCE
class WXDLLIMPEXP_BASE wxEventLoopSourcesManagerBase
{
public:
virtual wxEventLoopSource*
AddSourceForFD(int fd, wxEventLoopSourceHandler *handler, int flags) = 0;
virtual ~wxEventLoopSourcesManagerBase() = default;
};
#endif // wxUSE_EVENTLOOP_SOURCE
#endif // _WX_PRIVATE_EVENTLOOPSOURCESMANAGER_H_

View File

@@ -0,0 +1,84 @@
///////////////////////////////////////////////////////////////////////////////
// Name: wx/private/extfield.h
// Purpose: Declare wxExternalField helper
// Author: Vadim Zeitlin
// Created: 2017-11-21
// Copyright: (c) 2017 Vadim Zeitlin <vadim@wxwidgets.org>
// Licence: wxWindows licence
///////////////////////////////////////////////////////////////////////////////
#ifndef _WX_PRIVATE_EXTFIELD_H_
#define _WX_PRIVATE_EXTFIELD_H_
// ----------------------------------------------------------------------------
// wxExternalField: store object data outside of it
// ----------------------------------------------------------------------------
// This class allows to store some data without consuming space for the objects
// that don't need it and can be useful for avoiding to add rarely used fields
// to the classes that are used by many objects, e.g. wxWindow.
//
// Note that using this class costs in speed and convenience of access to the
// field, which requires a hash lookup instead of accessing it directly. It
// also only currently works for heap-allocated fields as it's probably never
// worth using it for fields of simple types.
//
// Template parameter Object is the class that "contains" the field, Field is
// the type of the field itself and FieldMap is the hash map, defined
// separately using WX_DECLARE_HASH_MAP(), with Object* as the key and Field*
// as the value type.
template <typename Object, typename Field, typename FieldMap>
class wxExternalField
{
public:
typedef Object ObjectType;
typedef Field FieldType;
typedef FieldMap MapType;
// Store the field object to be used for the given object, replacing the
// existing one, if any.
//
// This method takes ownership of the field pointer which will be destroyed
// by EraseForObject().
static void StoreForObject(ObjectType* obj, FieldType* field)
{
const typename MapType::iterator it = ms_map.find(obj);
if ( it != ms_map.end() )
{
delete it->second;
it->second = field;
}
else
{
ms_map.insert(typename MapType::value_type(obj, field));
}
}
// Find the object for the corresponding window.
static FieldType* FromObject(ObjectType* obj)
{
const typename MapType::const_iterator it = ms_map.find(obj);
return it == ms_map.end() ? nullptr : it->second;
}
// Erase the object used for the corresponding window, return true if there
// was one or false otherwise.
static bool EraseForObject(ObjectType* obj)
{
const typename MapType::iterator it = ms_map.find(obj);
if ( it == ms_map.end() )
return false;
delete it->second;
ms_map.erase(it);
return true;
}
private:
static FieldMap ms_map;
};
template <typename O, typename F, typename M>
M wxExternalField<O, F, M>::ms_map;
#endif // _WX_PRIVATE_EXTFIELD_H_

View File

@@ -0,0 +1,53 @@
///////////////////////////////////////////////////////////////////////////////
// Name: wx/private/fd.h
// Purpose: private stuff for working with file descriptors
// Author: Vadim Zeitlin
// Created: 2008-11-23 (moved from wx/unix/private.h)
// Copyright: (c) 2008 Vadim Zeitlin <vadim@wxwidgets.org>
// Licence: wxWindows licence
///////////////////////////////////////////////////////////////////////////////
#ifndef _WX_PRIVATE_FD_H_
#define _WX_PRIVATE_FD_H_
// standard Linux headers produce many warnings when used with icc so define
// our own replacements for FD_XXX macros
#if defined(__INTELC__) && defined(__LINUX__)
inline void wxFD_ZERO(fd_set *fds)
{
#pragma warning(push)
#pragma warning(disable:593)
FD_ZERO(fds);
#pragma warning(pop)
}
inline void wxFD_SET(int fd, fd_set *fds)
{
#pragma warning(push, 1)
#pragma warning(disable:1469)
FD_SET(fd, fds);
#pragma warning(pop)
}
inline bool wxFD_ISSET(int fd, fd_set *fds)
{
#pragma warning(push, 1)
#pragma warning(disable:1469)
return FD_ISSET(fd, fds);
#pragma warning(pop)
}
inline void wxFD_CLR(int fd, fd_set *fds)
{
#pragma warning(push, 1)
#pragma warning(disable:1469)
FD_CLR(fd, fds);
#pragma warning(pop)
}
#else // !__INTELC__
#define wxFD_ZERO(fds) FD_ZERO(fds)
#define wxFD_SET(fd, fds) FD_SET(fd, fds)
#define wxFD_ISSET(fd, fds) FD_ISSET(fd, fds)
#define wxFD_CLR(fd, fds) FD_CLR(fd, fds)
#endif // __INTELC__/!__INTELC__
#endif // _WX_PRIVATE_FD_H_

View File

@@ -0,0 +1,115 @@
/////////////////////////////////////////////////////////////////////////////
// Name: wx/private/fdiodispatcher.h
// Purpose: classes for dispatching IO notifications for file descriptors
// Authors: Lukasz Michalski
// Created: December 2006
// Copyright: (c) Lukasz Michalski
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
#ifndef _WX_PRIVATE_FDIODISPATCHER_H_
#define _WX_PRIVATE_FDIODISPATCHER_H_
#include "wx/private/fdiohandler.h"
#include <unordered_map>
// those flags describes sets where descriptor should be added
enum wxFDIODispatcherEntryFlags
{
wxFDIO_INPUT = 1,
wxFDIO_OUTPUT = 2,
wxFDIO_EXCEPTION = 4,
wxFDIO_ALL = wxFDIO_INPUT | wxFDIO_OUTPUT | wxFDIO_EXCEPTION
};
// base class for wxSelectDispatcher and wxEpollDispatcher
class WXDLLIMPEXP_BASE wxFDIODispatcher
{
public:
enum { TIMEOUT_INFINITE = -1 };
// return the global dispatcher to be used for IO events, can be null only
// if wxSelectDispatcher wasn't compiled into the library at all as
// creating it never fails
//
// don't delete the returned pointer
static wxFDIODispatcher *Get();
// if we have any registered handlers, check for any pending events to them
// and dispatch them -- this is used from wxX11 and wxDFB event loops
// implementation
static void DispatchPending();
// register handler for the given descriptor with the dispatcher, return
// true on success or false on error
virtual bool RegisterFD(int fd, wxFDIOHandler *handler, int flags) = 0;
// modify descriptor flags or handler, return true on success
virtual bool ModifyFD(int fd, wxFDIOHandler *handler, int flags) = 0;
// unregister descriptor previously registered with RegisterFD()
virtual bool UnregisterFD(int fd) = 0;
// check if any events are currently available without dispatching them
virtual bool HasPending() const = 0;
// wait for an event for at most timeout milliseconds and process it;
// return the number of events processed (possibly 0 if timeout expired) or
// -1 if an error occurred
virtual int Dispatch(int timeout = TIMEOUT_INFINITE) = 0;
virtual ~wxFDIODispatcher() = default;
};
//entry for wxFDIOHandlerMap
struct wxFDIOHandlerEntry
{
wxFDIOHandlerEntry()
{
handler = nullptr;
flags = 0;
}
wxFDIOHandlerEntry(wxFDIOHandler *handler_, int flags_)
: handler(handler_),
flags(flags_)
{
}
wxFDIOHandler *handler;
int flags;
};
// this hash is used to map file descriptors to their handlers
using wxFDIOHandlerMap = std::unordered_map<int, wxFDIOHandlerEntry>;
// FDIODispatcher that holds map fd <-> FDIOHandler, this should be used if
// this map isn't maintained elsewhere already as it is usually needed anyhow
//
// notice that all functions for FD management have implementation
// in the base class and should be called from the derived classes
class WXDLLIMPEXP_BASE wxMappedFDIODispatcher : public wxFDIODispatcher
{
public:
// find the handler for the given fd, return nullptr if none
wxFDIOHandler *FindHandler(int fd) const;
// register handler for the given descriptor with the dispatcher, return
// true on success or false on error
virtual bool RegisterFD(int fd, wxFDIOHandler *handler, int flags) override;
// modify descriptor flags or handler, return true on success
virtual bool ModifyFD(int fd, wxFDIOHandler *handler, int flags) override;
// unregister descriptor previously registered with RegisterFD()
virtual bool UnregisterFD(int fd) override;
virtual ~wxMappedFDIODispatcher() = default;
protected:
// the fd -> handler map containing all the registered handlers
wxFDIOHandlerMap m_handlers;
};
#endif // _WX_PRIVATE_FDIODISPATCHER_H_

View File

@@ -0,0 +1,38 @@
///////////////////////////////////////////////////////////////////////////////
// Name: wx/private/fdioeventloopsourcehandler.h
// Purpose: declares wxFDIOEventLoopSourceHandler class
// Author: Rob Bresalier, Vadim Zeitlin
// Created: 2013-06-13 (extracted from src/unix/evtloopunix.cpp)
// Copyright: (c) 2009 Vadim Zeitlin <vadim@wxwidgets.org>
// (c) 2013 Rob Bresalier
// Licence: wxWindows licence
///////////////////////////////////////////////////////////////////////////////
#ifndef _WX_PRIVATE_FDIO_EVENT_LOOP_SOURCE_HANDLER_H
#define _WX_PRIVATE_FDIO_EVENT_LOOP_SOURCE_HANDLER_H
#include "wx/evtloopsrc.h"
// This class is a temporary bridge between event loop sources and
// FDIODispatcher. It is going to be removed soon, when all subject interfaces
// are modified
class wxFDIOEventLoopSourceHandler : public wxFDIOHandler
{
public:
explicit wxFDIOEventLoopSourceHandler(wxEventLoopSourceHandler* handler)
: m_handler(handler)
{
}
// Just forward to the real handler.
virtual void OnReadWaiting() override { m_handler->OnReadWaiting(); }
virtual void OnWriteWaiting() override { m_handler->OnWriteWaiting(); }
virtual void OnExceptionWaiting() override { m_handler->OnExceptionWaiting(); }
protected:
wxEventLoopSourceHandler* const m_handler;
wxDECLARE_NO_COPY_CLASS(wxFDIOEventLoopSourceHandler);
};
#endif // _WX_PRIVATE_FDIO_EVENT_LOOP_SOURCE_HANDLER_H

View File

@@ -0,0 +1,53 @@
///////////////////////////////////////////////////////////////////////////////
// Name: wx/private/fdiohandler.h
// Purpose: declares wxFDIOHandler class
// Author: Vadim Zeitlin
// Created: 2009-08-17
// Copyright: (c) 2009 Vadim Zeitlin <vadim@wxwidgets.org>
// Licence: wxWindows licence
///////////////////////////////////////////////////////////////////////////////
#ifndef _WX_PRIVATE_FDIOHANDLER_H_
#define _WX_PRIVATE_FDIOHANDLER_H_
// ----------------------------------------------------------------------------
// wxFDIOHandler: interface used to process events on file descriptors
// ----------------------------------------------------------------------------
class wxFDIOHandler
{
public:
wxFDIOHandler() { m_regmask = 0; }
// called when descriptor is available for non-blocking read
virtual void OnReadWaiting() = 0;
// called when descriptor is available for non-blocking write
virtual void OnWriteWaiting() = 0;
// called when there is exception on descriptor
virtual void OnExceptionWaiting() = 0;
// called to check if the handler is still valid, only used by
// wxSocketImplUnix currently
virtual bool IsOk() const { return true; }
// get/set the mask of events for which we're currently registered for:
// it's a combination of wxFDIO_{INPUT,OUTPUT,EXCEPTION}
int GetRegisteredEvents() const { return m_regmask; }
void SetRegisteredEvent(int flag) { m_regmask |= flag; }
void ClearRegisteredEvent(int flag) { m_regmask &= ~flag; }
// virtual dtor for the base class
virtual ~wxFDIOHandler() = default;
private:
int m_regmask;
wxDECLARE_NO_COPY_CLASS(wxFDIOHandler);
};
#endif // _WX_PRIVATE_FDIOHANDLER_H_

View File

@@ -0,0 +1,42 @@
///////////////////////////////////////////////////////////////////////////////
// Name: wx/private/fdiomanager.h
// Purpose: declaration of wxFDIOManager
// Author: Vadim Zeitlin
// Created: 2009-08-17
// Copyright: (c) 2009 Vadim Zeitlin <vadim@wxwidgets.org>
// Licence: wxWindows licence
///////////////////////////////////////////////////////////////////////////////
#ifndef _WX_PRIVATE_FDIOMANAGER_H_
#define _WX_PRIVATE_FDIOMANAGER_H_
#include "wx/private/fdiohandler.h"
// ----------------------------------------------------------------------------
// wxFDIOManager: register or unregister wxFDIOHandlers
// ----------------------------------------------------------------------------
// currently only used in wxGTK and wxQt, see wx/unix/apptrait.h
class wxFDIOManager
{
public:
// identifies either input or output direction
//
// NB: the values of this enum shouldn't change
enum Direction
{
INPUT,
OUTPUT
};
// start or stop monitoring the events on the given file descriptor
virtual int AddInput(wxFDIOHandler *handler, int fd, Direction d) = 0;
virtual void RemoveInput(wxFDIOHandler *handler, int fd, Direction d) = 0;
// empty but virtual dtor for the base class
virtual ~wxFDIOManager() = default;
};
#endif // _WX_PRIVATE_FDIOMANAGER_H_

View File

@@ -0,0 +1,82 @@
/////////////////////////////////////////////////////////////////////////////
// Name: wx/private/fileback.h
// Purpose: Back an input stream with memory or a file
// Author: Mike Wetherell
// Copyright: (c) 2006 Mike Wetherell
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
#ifndef _WX_FILEBACK_H__
#define _WX_FILEBACK_H__
#include "wx/defs.h"
#if wxUSE_FILESYSTEM
#include "wx/stream.h"
// ----------------------------------------------------------------------------
// Backs an input stream with memory or a file to make it seekable.
//
// One or more wxBackedInputStreams can be used to read it's data. The data is
// reference counted, so stays alive until the last wxBackingFile or
// wxBackedInputStream using it is destroyed.
// ----------------------------------------------------------------------------
class WXDLLIMPEXP_BASE wxBackingFile
{
public:
enum { DefaultBufSize = 16384 };
// Takes ownership of stream. If the stream is smaller than bufsize, the
// backing file is never created and the backing is done with memory.
wxBackingFile(wxInputStream *stream,
size_t bufsize = DefaultBufSize,
const wxString& prefix = wxT("wxbf"));
wxBackingFile() : m_impl(nullptr) { }
~wxBackingFile();
wxBackingFile(const wxBackingFile& backer);
wxBackingFile& operator=(const wxBackingFile& backer);
operator bool() const { return m_impl != nullptr; }
private:
class wxBackingFileImpl *m_impl;
friend class wxBackedInputStream;
};
// ----------------------------------------------------------------------------
// An input stream to read from a wxBackingFile.
// ----------------------------------------------------------------------------
class WXDLLIMPEXP_BASE wxBackedInputStream : public wxInputStream
{
public:
wxBackedInputStream(const wxBackingFile& backer);
// If the length of the backer's parent stream is unknown then GetLength()
// returns wxInvalidOffset until the parent has been read to the end.
wxFileOffset GetLength() const override;
// Returns the length, reading the parent stream to the end if necessary.
wxFileOffset FindLength() const;
bool IsSeekable() const override { return true; }
protected:
size_t OnSysRead(void *buffer, size_t size) override;
wxFileOffset OnSysSeek(wxFileOffset pos, wxSeekMode mode) override;
wxFileOffset OnSysTell() const override;
private:
wxBackingFile m_backer;
wxFileOffset m_pos;
wxDECLARE_NO_COPY_CLASS(wxBackedInputStream);
};
#endif // wxUSE_FILESYSTEM
#endif // _WX_FILEBACK_H__

View File

@@ -0,0 +1,89 @@
///////////////////////////////////////////////////////////////////////////////
// Name: wx/private/filedlgcustomize.h
// Purpose: Private helpers used for wxFileDialog customization
// Author: Vadim Zeitlin
// Created: 2022-05-26
// Copyright: (c) 2022 Vadim Zeitlin <vadim@wxwidgets.org>
// Licence: wxWindows licence
///////////////////////////////////////////////////////////////////////////////
#ifndef _WX_PRIVATE_FILEDLGCUSTOMIZE_H_
#define _WX_PRIVATE_FILEDLGCUSTOMIZE_H_
// ----------------------------------------------------------------------------
// wxFileDialogCustomControlImpl: interface for all custom controls
// ----------------------------------------------------------------------------
class wxFileDialogCustomControlImpl
{
public:
virtual void Show(bool show) = 0;
virtual void Enable(bool enable) = 0;
virtual bool DoBind(wxEvtHandler* handler);
virtual ~wxFileDialogCustomControlImpl();
};
// This class is defined for symmetry with the other ones, but there are no
// button-specific methods so far.
class wxFileDialogButtonImpl : public wxFileDialogCustomControlImpl
{
};
class wxFileDialogCheckBoxImpl : public wxFileDialogCustomControlImpl
{
public:
virtual bool GetValue() = 0;
virtual void SetValue(bool value) = 0;
};
#if wxUSE_RADIOBTN
class wxFileDialogRadioButtonImpl : public wxFileDialogCustomControlImpl
{
public:
virtual bool GetValue() = 0;
virtual void SetValue(bool value) = 0;
};
#endif // wxUSE_RADIOBTN
class wxFileDialogChoiceImpl : public wxFileDialogCustomControlImpl
{
public:
virtual int GetSelection() = 0;
virtual void SetSelection(int n) = 0;
};
class wxFileDialogTextCtrlImpl : public wxFileDialogCustomControlImpl
{
public:
virtual wxString GetValue() = 0;
virtual void SetValue(const wxString& value) = 0;
};
class wxFileDialogStaticTextImpl : public wxFileDialogCustomControlImpl
{
public:
virtual void SetLabelText(const wxString& text) = 0;
};
// ----------------------------------------------------------------------------
// wxFileDialogCustomizeImpl: interface for actual customizers
// ----------------------------------------------------------------------------
class wxFileDialogCustomizeImpl
{
public:
virtual wxFileDialogButtonImpl* AddButton(const wxString& label) = 0;
virtual wxFileDialogCheckBoxImpl* AddCheckBox(const wxString& label) = 0;
#if wxUSE_RADIOBTN
virtual wxFileDialogRadioButtonImpl* AddRadioButton(const wxString& label) = 0;
#endif
virtual wxFileDialogChoiceImpl* AddChoice(size_t n, const wxString* strings) = 0;
virtual wxFileDialogTextCtrlImpl* AddTextCtrl(const wxString& label) = 0;
virtual wxFileDialogStaticTextImpl* AddStaticText(const wxString& label) = 0;
virtual ~wxFileDialogCustomizeImpl();
};
#endif // _WX_PRIVATE_FILEDLGCUSTOMIZE_H_

View File

@@ -0,0 +1,54 @@
/////////////////////////////////////////////////////////////////////////////
// Name: wx/private/filename.h
// Purpose: Internal declarations for src/common/filename.cpp
// Author: Mike Wetherell
// Created: 2006-10-22
// Copyright: (c) 2006 Mike Wetherell
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
#ifndef _WX_PRIVATE_FILENAME_H_
#define _WX_PRIVATE_FILENAME_H_
#include "wx/file.h"
#include "wx/ffile.h"
// Self deleting temp files aren't supported on all platforms. Therefore
// rather than let these be in the API, they can be used internally to
// implement classes (e.g. wxTempFileStream), that will do the clean up when
// the OS doesn't support it.
// Same usage as wxFileName::CreateTempFileName() with the extra parameter
// deleteOnClose. *deleteOnClose true on entry requests a file created with a
// delete on close flag, on exit the value of *deleteOnClose indicates whether
// available.
#if wxUSE_FILE
wxString wxCreateTempFileName(const wxString& prefix,
wxFile *fileTemp,
bool *deleteOnClose = nullptr);
#endif
#if wxUSE_FFILE
wxString wxCreateTempFileName(const wxString& prefix,
wxFFile *fileTemp,
bool *deleteOnClose = nullptr);
#endif
// Returns an open temp file, if possible either an unlinked open file or one
// that will delete on close. Only returns the filename if neither was
// possible, so that the caller can delete the file when done.
#if wxUSE_FILE
bool wxCreateTempFile(const wxString& prefix,
wxFile *fileTemp,
wxString *name);
#endif
#if wxUSE_FFILE
bool wxCreateTempFile(const wxString& prefix,
wxFFile *fileTemp,
wxString *name);
#endif
#endif // _WX_PRIVATE_FILENAME_H_

View File

@@ -0,0 +1,116 @@
/////////////////////////////////////////////////////////////////////////////
// Name: wx/private/flagscheck.h
// Purpose: helpers for checking that (bit)flags don't overlap
// Author: Vaclav Slavik
// Created: 2008-02-21
// Copyright: (c) 2008 Vaclav Slavik
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
#ifndef _WX_PRIVATE_FLAGSCHECK_H_
#define _WX_PRIVATE_FLAGSCHECK_H_
#include "wx/debug.h"
// IBM xlC 8 can't parse the template syntax
#if !defined(__IBMCPP__)
#include "wx/meta/if.h"
namespace wxPrivate
{
// These templates are used to implement wxADD_FLAG macro below.
//
// The idea is that we want to trigger *compilation* error if the flags
// overlap, not just runtime assert failure. We can't implement the check
// using just a simple logical operation, we need checks equivalent to this
// code:
//
// mask = wxFLAG_1;
// assert( (mask & wxFLAG_2) == 0 ); // no overlap
// mask |= wxFLAG_3;
// assert( (mask & wxFLAG_3) == 0 ); // no overlap
// mask |= wxFLAG_3;
// ...
//
// This can be done at compilation time by using templates metaprogramming
// technique that makes the compiler carry on the computation.
//
// NB: If any of this doesn't compile with your compiler and would be too
// hard to make work, it's probably best to disable this code and replace
// the macros below with empty stubs, this isn't anything critical.
template<int val> struct FlagsHaveConflictingValues
{
// no value here - triggers compilation error
};
template<int val> struct FlagValue
{
enum { value = val };
};
// This template adds its template parameter integer 'add' to another integer
// 'all' and produces their OR-combination (all | add). The result is "stored"
// as constant SafelyAddToMask<>::value. Combination of many flags is achieved
// by chaining parameter lists: the 'add' parameter is value member of
// another (different) SafelyAddToMask<> instantiation.
template<int all, int add> struct SafelyAddToMask
{
// This typedefs ensures that no flags in the list conflict. If there's
// any overlap between the already constructed part of the mask ('all')
// and the value being added to it ('add'), the test that is wxIf<>'s
// first parameter will be non-zero and so Added value will be
// FlagsHaveConflictingValues<add>. The next statement will try to use
// AddedValue::value, but there's no such thing in
// FlagsHaveConflictingValues<> and so compilation will fail.
typedef typename wxIf<(all & add) == 0,
FlagValue<add>,
FlagsHaveConflictingValues<add> >::value
AddedValue;
enum { value = all | AddedValue::value };
};
} // wxPrivate namespace
// This macro is used to ensure that no two flags that can be combined in
// the same integer value have overlapping bits. This is sometimes not entirely
// trivial to ensure, for example in wxWindow styles or flags for wxSizerItem
// that span several enums, some of them used for multiple purposes.
//
// By constructing allowed flags mask using wxADD_FLAG macro and then using
// this mask to check flags passed as arguments, you can ensure that
//
// a) if any of the allowed flags overlap, you will get compilation error
// b) if invalid flag is used, there will be an assert at runtime
//
// Example usage:
//
// static const int SIZER_FLAGS_MASK =
// wxADD_FLAG(wxCENTRE,
// wxADD_FLAG(wxHORIZONTAL,
// wxADD_FLAG(wxVERTICAL,
// ...
// 0))...);
//
// And wherever flags are used:
//
// wxASSERT_VALID_FLAG( m_flag, SIZER_FLAGS_MASK );
#define wxADD_FLAG(f, others) \
::wxPrivate::SafelyAddToMask<f, others>::value
#else
#define wxADD_FLAG(f, others) (f | others)
#endif
// Checks if flags value 'f' is within the mask of allowed values
#define wxASSERT_VALID_FLAGS(f, mask) \
wxASSERT_MSG( (f & mask) == f, \
"invalid flag: not within " #mask )
#endif // _WX_PRIVATE_FLAGSCHECK_H_

View File

@@ -0,0 +1,247 @@
/////////////////////////////////////////////////////////////////////////////
// Name: wx/private/fontmgr.h
// Purpose: font management for ports that don't have their own
// Author: Vaclav Slavik
// Created: 2006-11-18
// Copyright: (c) 2001-2002 SciTech Software, Inc. (www.scitechsoft.com)
// (c) 2006 REA Elektronik GmbH
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
#ifndef _WX_PRIVATE_FONTMGR_H_
#define _WX_PRIVATE_FONTMGR_H_
#include "wx/list.h"
#include "wx/fontutil.h"
class wxFontsManager;
class wxFontInstance;
class wxFontInstanceList;
class wxFontFace;
class wxFontBundle;
class wxFontBundleHash;
class wxFontMgrFontRefData;
WX_DECLARE_LIST(wxFontBundle, wxFontBundleList);
/**
This class represents single font face with set parameters (point size,
antialiasing).
*/
class wxFontInstanceBase
{
protected:
wxFontInstanceBase(float ptSize, bool aa) : m_ptSize(ptSize), m_aa(aa) {}
virtual ~wxFontInstanceBase() = default;
public:
float GetPointSize() const { return m_ptSize; }
bool IsAntiAliased() const { return m_aa; }
protected:
float m_ptSize;
bool m_aa;
};
/// This class represents loaded font face (bundle+weight+italics).
class wxFontFaceBase
{
protected:
/// Ctor. Creates object with reference count = 0, Acquire() must be
/// called after the object is created.
wxFontFaceBase();
virtual ~wxFontFaceBase();
public:
/// Increases reference count of the face
virtual void Acquire();
/**
Decreases reference count of the face. Call this when you no longer
use the object returned by wxFontBundle. Note that this doesn't destroy
the object, but only optionally shuts it down, so it's possible to
call Acquire() and Release() more than once.
*/
virtual void Release();
/**
Returns instance of the font at given size.
@param ptSize point size of the font to create; note that this is
a float and not integer, it should be wxFont's point
size multiplied by wxDC's scale factor
@param aa should the font be antialiased?
*/
virtual wxFontInstance *GetFontInstance(float ptSize, bool aa);
protected:
/// Called to create a new instance of the font by GetFontInstance() if
/// it wasn't found it cache.
virtual wxFontInstance *CreateFontInstance(float ptSize, bool aa) = 0;
protected:
unsigned m_refCnt;
wxFontInstanceList *m_instances;
};
/**
This class represents font bundle. Font bundle is set of faces that have
the same name, but differ in weight and italics.
*/
class wxFontBundleBase
{
public:
wxFontBundleBase();
virtual ~wxFontBundleBase();
/// Returns name of the bundle
virtual wxString GetName() const = 0;
/// Returns true if the font is fixed-width
virtual bool IsFixed() const = 0;
/// Type of faces in the bundle
enum FaceType
{
// NB: values of these constants are set so that it's possible to
// make OR-combinations of them and still get valid enum element
FaceType_Regular = 0,
FaceType_Italic = 1,
FaceType_Bold = 2,
FaceType_BoldItalic = FaceType_Italic | FaceType_Bold,
FaceType_Max
};
/// Returns true if the given face is available
bool HasFace(FaceType type) const { return m_faces[type] != nullptr; }
/**
Returns font face object that can be used to render font of given type.
Note that this method can only be called if HasFace(type) returns true.
Acquire() was called on the returned object, you must call Release()
when you stop using it.
*/
wxFontFace *GetFace(FaceType type) const;
/**
Returns font face object that can be used to render given font.
Acquire() was called on the returned object, you must call Release()
when you stop using it.
*/
wxFontFace *GetFaceForFont(const wxFontMgrFontRefData& font) const;
protected:
wxFontFace *m_faces[FaceType_Max];
};
/**
Base class for wxFontsManager class, which manages the list of all
available fonts and their loaded instances.
*/
class wxFontsManagerBase
{
protected:
wxFontsManagerBase();
virtual ~wxFontsManagerBase();
public:
/// Returns the font manager singleton, creating it if it doesn't exist
static wxFontsManager *Get();
/// Called by wxApp to shut down the manager
static void CleanUp();
/// Returns list of all available font bundles
const wxFontBundleList& GetBundles() const { return *m_list; }
/**
Returns object representing font bundle with the given name.
The returned object is owned by wxFontsManager, you must not delete it.
*/
wxFontBundle *GetBundle(const wxString& name) const;
/**
Returns object representing font bundle that can be used to render
given font.
The returned object is owned by wxFontsManager, you must not delete it.
*/
wxFontBundle *GetBundleForFont(const wxFontMgrFontRefData& font) const;
/// This method must be called by derived
void AddBundle(wxFontBundle *bundle);
/// Returns default facename for given wxFont family
virtual wxString GetDefaultFacename(wxFontFamily family) const = 0;
private:
wxFontBundleHash *m_hash;
wxFontBundleList *m_list;
protected:
static wxFontsManager *ms_instance;
};
#if defined(__WXDFB__)
#include "wx/dfb/private/fontmgr.h"
#endif
/// wxFontMgrFontRefData implementation using wxFontsManager classes
class wxFontMgrFontRefData : public wxGDIRefData
{
public:
wxFontMgrFontRefData(int size = wxDEFAULT,
wxFontFamily family = wxFONTFAMILY_DEFAULT,
wxFontStyle style = wxFONTSTYLE_NORMAL,
int weight = wxFONTWEIGHT_NORMAL,
bool underlined = false,
const wxString& faceName = wxEmptyString,
wxFontEncoding encoding = wxFONTENCODING_DEFAULT);
wxFontMgrFontRefData(const wxFontMgrFontRefData& data);
~wxFontMgrFontRefData();
wxFontBundle *GetFontBundle() const;
wxFontInstance *GetFontInstance(float scale, bool antialiased) const;
bool IsFixedWidth() const { return GetFontBundle()->IsFixed(); }
const wxNativeFontInfo *GetNativeFontInfo() const { return &m_info; }
double GetFractionalPointSize() const { return m_info.pointSize; }
wxString GetFaceName() const { return m_info.faceName; }
wxFontFamily GetFamily() const { return m_info.family; }
wxFontStyle GetStyle() const { return m_info.style; }
int GetNumericWeight() const { return m_info.weight; }
bool GetUnderlined() const { return m_info.underlined; }
wxFontEncoding GetEncoding() const { return m_info.encoding; }
void SetFractionalPointSize(double pointSize);
void SetFamily(wxFontFamily family);
void SetStyle(wxFontStyle style);
void SetNumericWeight(int weight);
void SetFaceName(const wxString& faceName);
void SetUnderlined(bool underlined);
void SetEncoding(wxFontEncoding encoding);
private:
void EnsureValidFont();
wxNativeFontInfo m_info;
wxFontFace *m_fontFace;
wxFontBundle *m_fontBundle;
bool m_fontValid;
};
#endif // _WX_PRIVATE_FONTMGR_H_

View File

@@ -0,0 +1,117 @@
/////////////////////////////////////////////////////////////////////////////
// Name: wx/private/fswatcher.h
// Purpose: File system watcher impl classes
// Author: Bartosz Bekier
// Created: 2009-05-26
// Copyright: (c) 2009 Bartosz Bekier <bartosz.bekier@gmail.com>
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
#ifndef WX_PRIVATE_FSWATCHER_H_
#define WX_PRIVATE_FSWATCHER_H_
#include "wx/sharedptr.h"
#include <unordered_map>
#ifdef wxHAS_INOTIFY
class wxFSWatchEntryUnix;
#define wxFSWatchEntry wxFSWatchEntryUnix
using wxFSWatchEntries = std::unordered_map<wxString, wxSharedPtr<wxFSWatchEntry>>;
#include "wx/unix/private/fswatcher_inotify.h"
#elif defined(wxHAS_KQUEUE)
class wxFSWatchEntryKq;
#define wxFSWatchEntry wxFSWatchEntryKq
using wxFSWatchEntries = std::unordered_map<wxString, wxSharedPtr<wxFSWatchEntry>>;
#include "wx/unix/private/fswatcher_kqueue.h"
#elif defined(__WINDOWS__)
class wxFSWatchEntryMSW;
#define wxFSWatchEntry wxFSWatchEntryMSW
using wxFSWatchEntries = std::unordered_map<wxString, wxSharedPtr<wxFSWatchEntry>>;
#include "wx/msw/private/fswatcher.h"
#else
#define wxFSWatchEntry wxFSWatchEntryPolling
#endif
class wxFSWatcherImpl
{
public:
wxFSWatcherImpl(wxFileSystemWatcherBase* watcher) :
m_watcher(watcher)
{
}
virtual ~wxFSWatcherImpl()
{
(void) RemoveAll();
}
virtual bool Init() = 0;
virtual bool Add(const wxFSWatchInfo& winfo)
{
if ( m_watches.find(winfo.GetPath()) != m_watches.end() )
{
wxLogTrace(wxTRACE_FSWATCHER,
"Path '%s' is already watched", winfo.GetPath());
// This can happen if a dir is watched, then a parent tree added
return true;
}
// construct watch entry
wxSharedPtr<wxFSWatchEntry> watch(new wxFSWatchEntry(winfo));
if (!DoAdd(watch))
return false;
// add watch to our map (always succeeds, checked above)
wxFSWatchEntries::value_type val(watch->GetPath(), watch);
return m_watches.insert(val).second;
}
virtual bool Remove(const wxFSWatchInfo& winfo)
{
wxFSWatchEntries::iterator it = m_watches.find(winfo.GetPath());
if ( it == m_watches.end() )
{
wxLogTrace(wxTRACE_FSWATCHER,
"Path '%s' is not watched", winfo.GetPath());
// This can happen if a dir is watched, then a parent tree added
return true;
}
wxSharedPtr<wxFSWatchEntry> watch = it->second;
m_watches.erase(it);
return DoRemove(watch);
}
virtual bool RemoveAll()
{
bool ret = true;
for ( wxFSWatchEntries::iterator it = m_watches.begin();
it != m_watches.end();
++it )
{
if ( !DoRemove(it->second) )
ret = false;
}
m_watches.clear();
return ret;
}
// Check whether any filespec matches the file's ext (if present)
bool MatchesFilespec(const wxFileName& fn, const wxString& filespec) const
{
return filespec.empty() || wxMatchWild(filespec, fn.GetFullName());
}
protected:
virtual bool DoAdd(wxSharedPtr<wxFSWatchEntry> watch) = 0;
virtual bool DoRemove(wxSharedPtr<wxFSWatchEntry> watch) = 0;
wxFSWatchEntries m_watches;
wxFileSystemWatcherBase* m_watcher;
};
#endif /* WX_PRIVATE_FSWATCHER_H_ */

View File

@@ -0,0 +1,25 @@
///////////////////////////////////////////////////////////////////////////////
// Name: wx/private/glibc.h
// Purpose: glibc-specific private wx header
// Author: Vadim Zeitlin
// Created: 2022-06-23
// Copyright: (c) 2022 Vadim Zeitlin <vadim@wxwidgets.org>
// Licence: wxWindows licence
///////////////////////////////////////////////////////////////////////////////
#ifndef _WX_PRIVATE_GLIBC_H_
#define _WX_PRIVATE_GLIBC_H_
// Ensure that a header include __GLIBC__ is defined.
#include <string.h>
// Macro for testing glibc version similar to wxCHECK_GCC_VERSION().
#if defined(__GLIBC__) && defined(__GLIBC_MINOR__)
#define wxCHECK_GLIBC_VERSION( major, minor ) \
( ( __GLIBC__ > (major) ) \
|| ( __GLIBC__ == (major) && __GLIBC_MINOR__ >= (minor) ) )
#else
#define wxCHECK_GLIBC_VERSION( major, minor ) 0
#endif
#endif // _WX_PRIVATE_GLIBC_H_

View File

@@ -0,0 +1,167 @@
/////////////////////////////////////////////////////////////////////////////
// Name: wx/private/graphics.h
// Purpose: private graphics context header
// Author: Stefan Csomor
// Created:
// Copyright: (c) Stefan Csomor
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
#ifndef _WX_GRAPHICS_PRIVATE_H_
#define _WX_GRAPHICS_PRIVATE_H_
#if wxUSE_GRAPHICS_CONTEXT
#include "wx/graphics.h"
class WXDLLIMPEXP_CORE wxGraphicsObjectRefData : public wxObjectRefData
{
public :
wxGraphicsObjectRefData( wxGraphicsRenderer* renderer );
wxGraphicsObjectRefData( const wxGraphicsObjectRefData* data );
wxGraphicsRenderer* GetRenderer() const ;
wxNODISCARD virtual wxGraphicsObjectRefData* Clone() const ;
protected :
wxGraphicsRenderer* m_renderer;
} ;
class WXDLLIMPEXP_CORE wxGraphicsBitmapData : public wxGraphicsObjectRefData
{
public :
wxGraphicsBitmapData( wxGraphicsRenderer* renderer) :
wxGraphicsObjectRefData(renderer) {}
virtual ~wxGraphicsBitmapData() = default;
// returns the native representation
virtual void * GetNativeBitmap() const = 0;
} ;
class WXDLLIMPEXP_CORE wxGraphicsMatrixData : public wxGraphicsObjectRefData
{
public :
wxGraphicsMatrixData( wxGraphicsRenderer* renderer) :
wxGraphicsObjectRefData(renderer) {}
virtual ~wxGraphicsMatrixData() = default;
// concatenates the matrix
virtual void Concat( const wxGraphicsMatrixData *t ) = 0;
// sets the matrix to the respective values
virtual void Set(wxDouble a=1.0, wxDouble b=0.0, wxDouble c=0.0, wxDouble d=1.0,
wxDouble tx=0.0, wxDouble ty=0.0) = 0;
// gets the component values of the matrix
virtual void Get(wxDouble* a=nullptr, wxDouble* b=nullptr, wxDouble* c=nullptr,
wxDouble* d=nullptr, wxDouble* tx=nullptr, wxDouble* ty=nullptr) const = 0;
// makes this the inverse matrix
virtual void Invert() = 0;
// returns true if the elements of the transformation matrix are equal ?
virtual bool IsEqual( const wxGraphicsMatrixData* t) const = 0;
// return true if this is the identity matrix
virtual bool IsIdentity() const = 0;
//
// transformation
//
// add the translation to this matrix
virtual void Translate( wxDouble dx , wxDouble dy ) = 0;
// add the scale to this matrix
virtual void Scale( wxDouble xScale , wxDouble yScale ) = 0;
// add the rotation to this matrix (radians)
virtual void Rotate( wxDouble angle ) = 0;
//
// apply the transforms
//
// applies that matrix to the point
virtual void TransformPoint( wxDouble *x, wxDouble *y ) const = 0;
// applies the matrix except for translations
virtual void TransformDistance( wxDouble *dx, wxDouble *dy ) const =0;
// returns the native representation
virtual void * GetNativeMatrix() const = 0;
} ;
class WXDLLIMPEXP_CORE wxGraphicsPathData : public wxGraphicsObjectRefData
{
public :
wxGraphicsPathData(wxGraphicsRenderer* renderer) : wxGraphicsObjectRefData(renderer) {}
virtual ~wxGraphicsPathData() = default;
//
// These are the path primitives from which everything else can be constructed
//
// begins a new subpath at (x,y)
virtual void MoveToPoint( wxDouble x, wxDouble y ) = 0;
// adds a straight line from the current point to (x,y)
virtual void AddLineToPoint( wxDouble x, wxDouble y ) = 0;
// adds a cubic Bezier curve from the current point, using two control points and an end point
virtual void AddCurveToPoint( wxDouble cx1, wxDouble cy1, wxDouble cx2, wxDouble cy2, wxDouble x, wxDouble y ) = 0;
// adds another path
virtual void AddPath( const wxGraphicsPathData* path ) =0;
// closes the current sub-path
virtual void CloseSubpath() = 0;
// gets the last point of the current path, (0,0) if not yet set
virtual void GetCurrentPoint( wxDouble* x, wxDouble* y) const = 0;
// adds an arc of a circle centering at (x,y) with radius (r) from startAngle to endAngle
virtual void AddArc( wxDouble x, wxDouble y, wxDouble r, wxDouble startAngle, wxDouble endAngle, bool clockwise ) = 0;
//
// These are convenience functions which - if not available natively will be assembled
// using the primitives from above
//
// adds a quadratic Bezier curve from the current point, using a control point and an end point
virtual void AddQuadCurveToPoint( wxDouble cx, wxDouble cy, wxDouble x, wxDouble y );
// appends a rectangle as a new closed subpath
virtual void AddRectangle( wxDouble x, wxDouble y, wxDouble w, wxDouble h );
// appends an ellipsis as a new closed subpath fitting the passed rectangle
virtual void AddCircle( wxDouble x, wxDouble y, wxDouble r );
// appends a an arc to two tangents connecting (current) to (x1,y1) and (x1,y1) to (x2,y2), also a straight line from (current) to (x1,y1)
virtual void AddArcToPoint( wxDouble x1, wxDouble y1 , wxDouble x2, wxDouble y2, wxDouble r ) ;
// appends an ellipse
virtual void AddEllipse( wxDouble x, wxDouble y, wxDouble w, wxDouble h);
// appends a rounded rectangle
virtual void AddRoundedRectangle( wxDouble x, wxDouble y, wxDouble w, wxDouble h, wxDouble radius);
// returns the native path
virtual void * GetNativePath() const = 0;
// give the native path returned by GetNativePath() back (there might be some deallocations necessary)
virtual void UnGetNativePath(void *p) const= 0;
// transforms each point of this path by the matrix
virtual void Transform( const wxGraphicsMatrixData* matrix ) =0;
// gets the bounding box enclosing all points (possibly including control points)
virtual void GetBox(wxDouble *x, wxDouble *y, wxDouble *w, wxDouble *h) const=0;
virtual bool Contains( wxDouble x, wxDouble y, wxPolygonFillMode fillStyle = wxODDEVEN_RULE) const=0;
};
#endif
#endif // _WX_GRAPHICS_PRIVATE_H_

View File

@@ -0,0 +1,31 @@
///////////////////////////////////////////////////////////////////////////////
// Name: wx/private/link.h
// Purpose: Private functions related to hyperlinks.
// Author: Vadim Zeitlin
// Created: 2023-06-01
// Copyright: (c) 2023 Vadim Zeitlin <vadim@wxwidgets.org>
// Licence: wxWindows licence
///////////////////////////////////////////////////////////////////////////////
#ifndef _WX_PRIVATE_HYPERLINK_H_
#define _WX_PRIVATE_HYPERLINK_H_
#include "wx/settings.h"
namespace wxPrivate
{
inline wxColour GetLinkColour()
{
// There is a standard link colour appropriate for the default "light" mode,
// see https://html.spec.whatwg.org/multipage/rendering.html#phrasing-content-3
// it doesn't stand out enough in dark mode, so choose "light sky blue"
// colour for the links in dark mode instead (this is a rather arbitrary
// choice, but there doesn't seem to be any standard one).
return wxSystemSettings::SelectLightDark(wxColour(0x00, 0x00, 0xee),
wxColour(0x87, 0xce, 0xfa));
}
} // namespace wxPrivate
#endif // _WX_PRIVATE_HYPERLINK_H_

View File

@@ -0,0 +1,91 @@
///////////////////////////////////////////////////////////////////////////////
// Name: wx/private/icondir.h
// Purpose: Declarations of structs used for loading MS icons
// Author: wxWidgets team
// Created: 2017-05-19
// Copyright: (c) 2017 wxWidgets team
// Licence: wxWindows licence
///////////////////////////////////////////////////////////////////////////////
#ifndef _WX_PRIVATE_ICONDIR_H_
#define _WX_PRIVATE_ICONDIR_H_
#include "wx/defs.h" // wxUint* declarations
// Structs declared here are used for loading group icons from
// .ICO files or MS Windows resources.
// Icon entry and directory structs for .ICO files and
// MS Windows resources are very similar but not identical.
#if wxUSE_ICO_CUR
#if wxUSE_STREAMS
// icon entry in .ICO files
struct ICONDIRENTRY
{
wxUint8 bWidth; // Width of the image
wxUint8 bHeight; // Height of the image (times 2)
wxUint8 bColorCount; // Number of colors in image (0 if >=8bpp)
wxUint8 bReserved; // Reserved
// these two are different in icons and cursors:
// icon or cursor
wxUint16 wPlanes; // Color Planes or XHotSpot
wxUint16 wBitCount; // Bits per pixel or YHotSpot
wxUint32 dwBytesInRes; // how many bytes in this resource?
wxUint32 dwImageOffset; // where in the file is this image
};
// icon directory in .ICO files
struct ICONDIR
{
wxUint16 idReserved; // Reserved
wxUint16 idType; // resource type (1 for icons, 2 for cursors)
wxUint16 idCount; // how many images?
};
#endif // wxUSE_STREAMS
#ifdef __WINDOWS__
#pragma pack(push)
#pragma pack(2)
// icon entry in MS Windows resources
struct GRPICONDIRENTRY
{
wxUint8 bWidth; // Width of the image
wxUint8 bHeight; // Height of the image (times 2)
wxUint8 bColorCount; // Number of colors in image (0 if >=8bpp)
wxUint8 bReserved; // Reserved
// these two are different in icons and cursors:
// icon or cursor
wxUint16 wPlanes; // Color Planes or XHotSpot
wxUint16 wBitCount; // Bits per pixel or YHotSpot
wxUint32 dwBytesInRes; // how many bytes in this resource?
wxUint16 nID; // actual icon resource ID
};
// icon directory in MS Windows resources
struct GRPICONDIR
{
wxUint16 idReserved; // Reserved
wxUint16 idType; // resource type (1 for icons, 2 for cursors)
wxUint16 idCount; // how many images?
GRPICONDIRENTRY idEntries[1]; // The entries for each image
};
#pragma pack(pop)
#endif // __WINDOWS__
#endif // wxUSE_ICO_CUR
#endif // _WX_PRIVATE_ICONDIR_H_

View File

@@ -0,0 +1,93 @@
///////////////////////////////////////////////////////////////////////////////
// Name: wx/private/init.h
// Purpose: Private initialization-related data.
// Author: Vadim Zeitlin
// Created: 2023-09-02
// Copyright: (c) 2023 Vadim Zeitlin <vadim@wxwidgets.org>
// Licence: wxWindows licence
///////////////////////////////////////////////////////////////////////////////
#ifndef _WX_PRIVATE_INIT_H_
#define _WX_PRIVATE_INIT_H_
// ----------------------------------------------------------------------------
// Initialization data contains parameters we get from the OS entry function.
// ----------------------------------------------------------------------------
struct WXDLLIMPEXP_BASE wxInitData
{
private:
wxInitData() = default;
public:
// Get the single global object.
static wxInitData& Get();
// Initialize from ANSI command line arguments: argv contents should be
// static, i.e. remain valid until the end of the program.
void Initialize(int argc, char** argv);
// Initialize from wide command line arguments if we hadn't been
// initialized in some other way: this allows to call this function
// unconditionally, even when these wide arguments were themselves
// synthesized from ANSI ones by our own code.
//
// Note that here we currently make a copy of the arguments internally, so
// they don't need to be static.
void InitIfNecessary(int argc, wchar_t** argv);
// This function is used instead of the dtor because the global object can
// be initialized multiple times.
void Free();
// We always have argc and (Unicode) argv, they're filled by Initialize()
// and argv as well as its elements are owned by us, see Free().
int argc = 0;
wchar_t** argv = nullptr;
#ifdef __WINDOWS__
// Initialize from the implicitly available Unicode command line.
void MSWInitialize();
// This pointer is non-null only if MSWInitialize() was called. In this
// case, argv is also set to it and, because this pointer needs to be freed
// using MSW-specific function, argv must not be freed at all.
//
// It's also possible to use Initialize(), even under Windows, in which
// case this pointer remains null and argv must be freed as usual.
wchar_t** argvMSW = nullptr;
#endif // __WINDOWS__
// At least wxGTK needs narrow command line arguments too and even thought
// other ports under Windows typically don't need them (e.g. wxMSW itself
// doesn't), we have to have them, as this header is toolkit-independent,
// and so can't differ between wxMSW and wxGTK.
// Initializes argvA using argc and argv. This means that argc and argv
// MUST be initialized before calling this function.
void InitArgvA();
// This pointer may or not need to be freed, as indicated by ownsArgvA flag.
char** argvA = nullptr;
bool ownsArgvA = false;
wxDECLARE_NO_COPY_CLASS(wxInitData);
};
// Type of the hook function, see wxAddEntryHook(). If this function returns
// a value different from -1, the process exits using it as error code.
using wxEntryHook = int (*)();
// Set a special hook function which will be called before performing any
// normal initialization. Note that this hook can't use any wxWidgets
// functionality because nothing has been initialized yet, but can use
// wxInitData to examine the command line arguments and determine if it should
// be applied.
//
// This is currently used only by wxWebViewChromium to allow running Chromium
// helper applications without initializing GTK under Linux but could, in
// principle, be used for any other similar purpose.
WXDLLIMPEXP_BASE void wxAddEntryHook(wxEntryHook hook);
#endif // _WX_PRIVATE_INIT_H_

View File

@@ -0,0 +1,88 @@
///////////////////////////////////////////////////////////////////////////////
// Name: wx/private/json.h
// Purpose: Helper functions to handle JSON data
// Author: Tobias Taschner
// Created: 2020-01-17
// Copyright: (c) 2020 wxWidgets development team
// Licence: wxWindows licence
///////////////////////////////////////////////////////////////////////////////
#ifndef _WX_PRIVATE_JSON_H_
#define _WX_PRIVATE_JSON_H_
namespace wxJSON
{
// Decode a string literal including escape sequences
// Returns false if the input string is not a valid JSON string
bool DecodeString(const wxString& in, wxString* out)
{
const wxWCharBuffer buf = in.wc_str();
const wchar_t* ch = buf.data();
// String has to chart with a quote
if (*(ch++) != '"')
return false;
out->clear();
out->reserve(buf.length());
const wchar_t* end = buf.data() + buf.length() - 1;
for (; ch < end; ++ch)
{
if (*ch == '\\')
{
switch (*(++ch))
{
case 'b':
out->append('\b');
break;
case 'n':
out->append('\n');
break;
case 'r':
out->append('\r');
break;
case 't':
out->append('\t');
break;
case 'f':
out->append('\f');
break;
case '/':
out->append('/');
break;
case '"':
out->append('"');
break;
case '\\':
out->append('\\');
break;
case 'u':
#if SIZEOF_WCHAR_T == 2
// In this case, we handle surrogates without doing anything special was wchar_t strings use UTF-17 encoding.
if (wxIsxdigit(ch[1]) && wxIsxdigit(ch[2]) &&
wxIsxdigit(ch[3]) && wxIsxdigit(ch[4]))
{
wchar_t uchar = wxHexToDec(wxString(&ch[3], 2)) |
wxHexToDec(wxString(&ch[1], 2)) >> 8;
out->append(uchar);
ch += 4;
}
#else
#error Implement correct surrogate handling.
#endif
break;
default:
return false;
break;
}
}
else
out->append(*ch);
}
// String has to end with a quote
return (*ch) == '"';
}
} // namespace JSON
#endif // _WX_PRIVATE_JSON_H_

View File

@@ -0,0 +1,212 @@
///////////////////////////////////////////////////////////////////////////////
// Name: wx/private/jsscriptwrapper.h
// Purpose: JS Script Wrapper for wxWebView
// Author: Jose Lorenzo
// Created: 2017-08-12
// Copyright: (c) 2017 Jose Lorenzo <josee.loren@gmail.com>
// Licence: wxWindows licence
///////////////////////////////////////////////////////////////////////////////
#ifndef _WX_PRIVATE_JSSCRIPTWRAPPER_H_
#define _WX_PRIVATE_JSSCRIPTWRAPPER_H_
#include "wx/regex.h"
// ----------------------------------------------------------------------------
// Helper for wxWebView::RunScript()
// ----------------------------------------------------------------------------
// This class provides GetWrappedCode(), GetOutputCode() and GetCleanUpCode()
// functions that should be executed in the backend-appropriate way by each
// wxWebView implementation in order to actually execute the user-provided
// JavaScript code, retrieve its result (if it executed successfully) and
// perform the cleanup at the end.
class wxJSScriptWrapper
{
public:
enum OutputType
{
JS_OUTPUT_STRING, // All return types are converted to a string
JS_OUTPUT_WEBKIT, // Some return types will be processed
JS_OUTPUT_IE, // Most return types will be processed
JS_OUTPUT_RAW // The return types is returned as is
};
wxJSScriptWrapper(const wxString& js, OutputType outputType)
: m_outputType(outputType)
{
// Adds one escape level.
const char *charsNeededToBeEscaped = "\\\"\n\r\v\t\b\f";
m_escapedCode.reserve(js.size());
for (wxString::const_iterator it = js.begin(); it != js.end(); ++it)
{
if (wxStrchr(charsNeededToBeEscaped, *it))
{
m_escapedCode += '\\';
switch ((wxChar) *it)
{
case 0x0A: // '\n'
m_escapedCode += 'n';
break;
case 0x0D: // '\r'
m_escapedCode += 'r';
break;
case 0x0B: // '\v'
m_escapedCode += 'v';
break;
case 0x09: // '\t'
m_escapedCode += 't';
break;
case 0x08: // '\b'
m_escapedCode += 'b';
break;
case 0x0C: // '\f'
m_escapedCode += 'f';
break;
default:
m_escapedCode += *it;
}
}
else
m_escapedCode += *it;
}
}
// Get the code to execute, its returned value will be either the value,
// if it executed successfully, or the exception message prefixed with
// "__wxexc:" if an error occurred.
//
// Either use SetOutput() to specify the script result or access it directly
// Using GetOutputRef()
//
// Execute ExtractOutput() later to get the real output after successful
// execution of this code or the proper error message.
wxString GetWrappedCode() const
{
wxString code = wxString::Format(
wxASCII_STR("(function () { try { var res = eval(\"%s\"); "),
m_escapedCode);
switch (m_outputType)
{
case JS_OUTPUT_STRING:
code += wxASCII_STR(
"if (typeof res == 'object') return JSON.stringify(res);"
"else if (typeof res == 'undefined') return 'undefined';"
"else return String(res);"
);
break;
case JS_OUTPUT_WEBKIT:
code += wxASCII_STR(
"if (typeof res == 'object') return JSON.stringify(res);"
"else if (typeof res == 'undefined') return 'undefined';"
"else return res;"
);
break;
case JS_OUTPUT_IE:
code += wxASCII_STR(
"try {"
"return (res == null || typeof res != 'object') ? String(res)"
": JSON.stringify(res);"
"}"
"catch (e) {"
"try {"
"function __wx$stringifyJSON(obj) {"
"if (!(obj instanceof Object))"
"return typeof obj === \"string\""
"? \'\"\' + obj + \'\"\'"
": \'\' + obj;"
"else if (obj instanceof Array) {"
"if (obj[0] === undefined)"
"return \'[]\';"
"else {"
"var arr = [];"
"for (var i = 0; i < obj.length; i++)"
"arr.push(__wx$stringifyJSON(obj[i]));"
"return \'[\' + arr + \']\';"
"}"
"}"
"else if (typeof obj === \"object\") {"
"if (obj instanceof Date) {"
"if (!Date.prototype.toISOString) {"
"(function() {"
"function pad(number) {"
"return number < 10"
"? '0' + number"
": number;"
"}"
"Date.prototype.toISOString = function() {"
"return this.getUTCFullYear() +"
"'-' + pad(this.getUTCMonth() + 1) +"
"'-' + pad(this.getUTCDate()) +"
"'T' + pad(this.getUTCHours()) +"
"':' + pad(this.getUTCMinutes()) +"
"':' + pad(this.getUTCSeconds()) +"
"'.' + (this.getUTCMilliseconds() / 1000)"
".toFixed(3).slice(2, 5) + 'Z\"';"
"};"
"}());"
"}"
"return '\"' + obj.toISOString(); + '\"'"
"}"
"var objElements = [];"
"for (var key in obj)"
"{"
"if (typeof obj[key] === \"function\")"
"return \'{}\';"
"else {"
"objElements.push(\'\"\'"
"+ key + \'\":\' +"
"__wx$stringifyJSON(obj[key]));"
"}"
"}"
"return \'{\' + objElements + \'}\';"
"}"
"}"
"return __wx$stringifyJSON(res);"
"}"
"catch (e) { return \"__wxexc:\" + e.name + \": \" + e.message; }"
"}");
break;
case JS_OUTPUT_RAW:
code += wxASCII_STR("return res;");
break;
}
code +=
wxASCII_STR("} catch (e) { return \"__wxexc:\" + e.name + \": \" + e.message; }"
"})()");
return code;
}
// Extract the output value
//
// Returns true if executed successfully
// string of the result will be put into output
// Returns false when an exception occurred
// string will be the exception message
static bool ExtractOutput(const wxString& result, wxString* output)
{
if (output)
*output = result;
if (result.starts_with(wxASCII_STR("__wxexc:")))
{
if (output)
output->Remove(0, 8);
return false;
}
else
{
return true;
}
}
private:
wxString m_escapedCode;
OutputType m_outputType;
wxDECLARE_NO_COPY_CLASS(wxJSScriptWrapper);
};
#endif // _WX_PRIVATE_JSSCRIPTWRAPPER_H_

View File

@@ -0,0 +1,954 @@
/////////////////////////////////////////////////////////////////////////////
// Name: wx/private/lang_info.h
// Purpose: Language database data
// Author: misc/languages/genlang.py
// Created: 2024-10-04
// Copyright: (c) 2024 wxWidgets development team <vadim@wxwidgets.org>
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
// WARNING: Parts of this file are generated. See misc/languages/README for
// details.
#ifndef _WX_PRIVATE_LANG_INFO_H_
#define _WX_PRIVATE_LANG_INFO_H_
// ----------------------------------------------------------------------------
// Table of all supported languages
// ----------------------------------------------------------------------------
// --- --- --- generated code begins here --- --- ---
// The following data tables are generated by misc/languages/genlang.py
// When making changes, please put them into misc/languages/langtabl.txt
// Data table for known languages
static const struct langData_t
{
int wxlang;
const char* bcp47tag;
const char* canonical;
const char* canonicalref;
wxUint32 winlang;
wxUint32 winsublang;
wxLayoutDirection layout;
const char* desc;
const char* descnative;
}
tabLangData[] =
{
{ wxLANGUAGE_ABKHAZIAN, "ab" , "ab" , "" , 0 , 0 , wxLayout_LeftToRight, "Abkhazian","\320\260\322\247\321\201\321\203\320\260 \320\261\321\213\320\267\321\210\323\231\320\260" },
{ wxLANGUAGE_AFAR, "aa" , "aa" , "aa_ET" , 0x00, 0x04, wxLayout_LeftToRight, "Afar","Qafar" },
{ wxLANGUAGE_AFAR_DJIBOUTI, "aa-DJ" , "aa_DJ" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Afar (Djibouti)","Qafar (Yabuuti)" },
{ wxLANGUAGE_AFAR_ERITREA, "aa-ER" , "aa_ER" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Afar (Eritrea)","Qafar (Eretria)" },
{ wxLANGUAGE_AFAR_ETHIOPIA, "aa-ET" , "aa_ET" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Afar (Ethiopia)","Qafar (Otobbia)" },
{ wxLANGUAGE_AFRIKAANS, "af" , "af" , "af_ZA" , 0x36, 0x01, wxLayout_LeftToRight, "Afrikaans","Afrikaans" },
{ wxLANGUAGE_AFRIKAANS_NAMIBIA, "af-NA" , "af_NA" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Afrikaans (Namibia)","Afrikaans (Namibi\303\253)" },
{ wxLANGUAGE_AFRIKAANS_SOUTH_AFRICA, "af-ZA" , "af_ZA" , "" , 0x36, 0x01, wxLayout_LeftToRight, "Afrikaans (South Africa)","Afrikaans (Suid-Afrika)" },
{ wxLANGUAGE_AGHEM, "agq" , "agq" , "agq_CM" , 0x00, 0x04, wxLayout_LeftToRight, "Aghem","Aghem" },
{ wxLANGUAGE_AGHEM_CAMEROON, "agq-CM" , "agq_CM" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Aghem (Cameroon)","Aghem (K\303\240m\303\240l\303\273\305\213)" },
{ wxLANGUAGE_AKAN, "ak" , "ak" , "ak_GH" , 0x00, 0x04, wxLayout_LeftToRight, "Akan","Akan" },
{ wxLANGUAGE_AKAN_GHANA, "ak-GH" , "ak_GH" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Akan (Ghana)","Akan (Gaana)" },
{ wxLANGUAGE_ALBANIAN, "sq" , "sq" , "sq_AL" , 0x1c, 0x01, wxLayout_LeftToRight, "Albanian","shqip" },
{ wxLANGUAGE_ALBANIAN_ALBANIA, "sq-AL" , "sq_AL" , "" , 0x1c, 0x01, wxLayout_LeftToRight, "Albanian (Albania)","shqip (Shqip\303\253ri)" },
{ wxLANGUAGE_ALBANIAN_KOSOVO, "sq-XK" , "sq_XK" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Albanian (Kosovo)","shqip (Kosov\303\253)" },
{ wxLANGUAGE_ALBANIAN_NORTH_MACEDONIA, "sq-MK" , "sq_MK" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Albanian (North Macedonia)","shqip (Maqedonia e Veriut)" },
{ wxLANGUAGE_ALSATIAN_FRANCE, "gsw-FR" , "gsw_FR" , "" , 0x84, 0x01, wxLayout_LeftToRight, "Alsatian (France)","Els\303\244ssisch (Fr\303\240nkrisch)" },
{ wxLANGUAGE_AMHARIC, "am" , "am" , "am_ET" , 0x5e, 0x01, wxLayout_LeftToRight, "Amharic","\341\212\240\341\210\233\341\210\255\341\212\233" },
{ wxLANGUAGE_AMHARIC_ETHIOPIA, "am-ET" , "am_ET" , "" , 0x5e, 0x01, wxLayout_LeftToRight, "Amharic (Ethiopia)","\341\212\240\341\210\233\341\210\255\341\212\233 (\341\212\242\341\211\265\341\213\256\341\214\265\341\213\253)" },
{ wxLANGUAGE_ARABIC, "ar" , "ar" , "ar_SA" , 0x01, 0x01, wxLayout_RightToLeft, "Arabic","\330\247\331\204\330\271\330\261\330\250\331\212\330\251" },
{ wxLANGUAGE_ARABIC_ALGERIA, "ar-DZ" , "ar_DZ" , "" , 0x01, 0x05, wxLayout_RightToLeft, "Arabic (Algeria)","\330\247\331\204\330\271\330\261\330\250\331\212\330\251 (\330\247\331\204\330\254\330\262\330\247\330\246\330\261)" },
{ wxLANGUAGE_ARABIC_BAHRAIN, "ar-BH" , "ar_BH" , "" , 0x01, 0x0f, wxLayout_RightToLeft, "Arabic (Bahrain)","\330\247\331\204\330\271\330\261\330\250\331\212\330\251 (\330\247\331\204\330\250\330\255\330\261\331\212\331\206)" },
{ wxLANGUAGE_ARABIC_CHAD, "ar-TD" , "ar_TD" , "" , 0x00, 0x04, wxLayout_RightToLeft, "Arabic (Chad)","\330\247\331\204\330\271\330\261\330\250\331\212\330\251 (\330\252\330\264\330\247\330\257)" },
{ wxLANGUAGE_ARABIC_COMOROS, "ar-KM" , "ar_KM" , "" , 0x00, 0x04, wxLayout_RightToLeft, "Arabic (Comoros)","\330\247\331\204\330\271\330\261\330\250\331\212\330\251 (\330\254\330\262\330\261 \330\247\331\204\331\202\331\205\330\261)" },
{ wxLANGUAGE_ARABIC_DJIBOUTI, "ar-DJ" , "ar_DJ" , "" , 0x00, 0x04, wxLayout_RightToLeft, "Arabic (Djibouti)","\330\247\331\204\330\271\330\261\330\250\331\212\330\251 (\330\254\331\212\330\250\331\210\330\252\331\212)" },
{ wxLANGUAGE_ARABIC_EGYPT, "ar-EG" , "ar_EG" , "" , 0x01, 0x03, wxLayout_RightToLeft, "Arabic (Egypt)","\330\247\331\204\330\271\330\261\330\250\331\212\330\251 (\331\205\330\265\330\261)" },
{ wxLANGUAGE_ARABIC_ERITREA, "ar-ER" , "ar_ER" , "" , 0x00, 0x04, wxLayout_RightToLeft, "Arabic (Eritrea)","\330\247\331\204\330\271\330\261\330\250\331\212\330\251 (\330\245\330\261\331\212\330\252\330\261\331\212\330\247)" },
{ wxLANGUAGE_ARABIC_IRAQ, "ar-IQ" , "ar_IQ" , "" , 0x01, 0x02, wxLayout_RightToLeft, "Arabic (Iraq)","\330\247\331\204\330\271\330\261\330\250\331\212\330\251 (\330\247\331\204\330\271\330\261\330\247\331\202)" },
{ wxLANGUAGE_ARABIC_ISRAEL, "ar-IL" , "ar_IL" , "" , 0x00, 0x04, wxLayout_RightToLeft, "Arabic (Israel)","\330\247\331\204\330\271\330\261\330\250\331\212\330\251 (\330\245\330\263\330\261\330\247\330\246\331\212\331\204)" },
{ wxLANGUAGE_ARABIC_JORDAN, "ar-JO" , "ar_JO" , "" , 0x01, 0x0b, wxLayout_RightToLeft, "Arabic (Jordan)","\330\247\331\204\330\271\330\261\330\250\331\212\330\251 (\330\247\331\204\330\243\330\261\330\257\331\206)" },
{ wxLANGUAGE_ARABIC_KUWAIT, "ar-KW" , "ar_KW" , "" , 0x01, 0x0d, wxLayout_RightToLeft, "Arabic (Kuwait)","\330\247\331\204\330\271\330\261\330\250\331\212\330\251 (\330\247\331\204\331\203\331\210\331\212\330\252)" },
{ wxLANGUAGE_ARABIC_LEBANON, "ar-LB" , "ar_LB" , "" , 0x01, 0x0c, wxLayout_RightToLeft, "Arabic (Lebanon)","\330\247\331\204\330\271\330\261\330\250\331\212\330\251 (\331\204\330\250\331\206\330\247\331\206)" },
{ wxLANGUAGE_ARABIC_LIBYA, "ar-LY" , "ar_LY" , "" , 0x01, 0x04, wxLayout_RightToLeft, "Arabic (Libya)","\330\247\331\204\330\271\330\261\330\250\331\212\330\251 (\331\204\331\212\330\250\331\212\330\247)" },
{ wxLANGUAGE_ARABIC_MAURITANIA, "ar-MR" , "ar_MR" , "" , 0x00, 0x04, wxLayout_RightToLeft, "Arabic (Mauritania)","\330\247\331\204\330\271\330\261\330\250\331\212\330\251 (\331\205\331\210\330\261\331\212\330\252\330\247\331\206\331\212\330\247)" },
{ wxLANGUAGE_ARABIC_MOROCCO, "ar-MA" , "ar_MA" , "" , 0x01, 0x06, wxLayout_RightToLeft, "Arabic (Morocco)","\330\247\331\204\330\271\330\261\330\250\331\212\330\251 (\330\247\331\204\331\205\331\205\331\204\331\203\330\251 \330\247\331\204\331\205\330\272\330\261\330\250\331\212\330\251)" },
{ wxLANGUAGE_ARABIC_OMAN, "ar-OM" , "ar_OM" , "" , 0x01, 0x08, wxLayout_RightToLeft, "Arabic (Oman)","\330\247\331\204\330\271\330\261\330\250\331\212\330\251 (\330\271\331\205\330\247\331\206)" },
{ wxLANGUAGE_ARABIC_PALESTINIAN_AUTHORITY, "ar-PS" , "ar_PS" , "" , 0x00, 0x04, wxLayout_RightToLeft, "Arabic (Palestinian Authority)","\330\247\331\204\330\271\330\261\330\250\331\212\330\251 (\330\247\331\204\330\263\331\204\330\267\330\251 \330\247\331\204\331\201\331\204\330\263\330\267\331\212\331\206\331\212\330\251)" },
{ wxLANGUAGE_ARABIC_QATAR, "ar-QA" , "ar_QA" , "" , 0x01, 0x10, wxLayout_RightToLeft, "Arabic (Qatar)","\330\247\331\204\330\271\330\261\330\250\331\212\330\251 (\331\202\330\267\330\261)" },
{ wxLANGUAGE_ARABIC_SAUDI_ARABIA, "ar-SA" , "ar_SA" , "" , 0x01, 0x01, wxLayout_RightToLeft, "Arabic (Saudi Arabia)","\330\247\331\204\330\271\330\261\330\250\331\212\330\251 (\330\247\331\204\331\205\331\205\331\204\331\203\330\251 \330\247\331\204\330\271\330\261\330\250\331\212\330\251 \330\247\331\204\330\263\330\271\331\210\330\257\331\212\330\251)" },
{ wxLANGUAGE_ARABIC_SOMALIA, "ar-SO" , "ar_SO" , "" , 0x00, 0x04, wxLayout_RightToLeft, "Arabic (Somalia)","\330\247\331\204\330\271\330\261\330\250\331\212\330\251 (\330\247\331\204\330\265\331\210\331\205\330\247\331\204)" },
{ wxLANGUAGE_ARABIC_SOUTH_SUDAN, "ar-SS" , "ar_SS" , "" , 0x00, 0x04, wxLayout_RightToLeft, "Arabic (South Sudan)","\330\247\331\204\330\271\330\261\330\250\331\212\330\251 (\330\254\331\206\331\210\330\250 \330\247\331\204\330\263\331\210\330\257\330\247\331\206)" },
{ wxLANGUAGE_ARABIC_SUDAN, "ar-SD" , "ar_SD" , "" , 0x00, 0x04, wxLayout_RightToLeft, "Arabic (Sudan)","\330\247\331\204\330\271\330\261\330\250\331\212\330\251 (\330\247\331\204\330\263\331\210\330\257\330\247\331\206)" },
{ wxLANGUAGE_ARABIC_SYRIA, "ar-SY" , "ar_SY" , "" , 0x01, 0x0a, wxLayout_RightToLeft, "Arabic (Syria)","\330\247\331\204\330\271\330\261\330\250\331\212\330\251 (\330\263\331\210\330\261\331\212\330\247)" },
{ wxLANGUAGE_ARABIC_TUNISIA, "ar-TN" , "ar_TN" , "" , 0x01, 0x07, wxLayout_RightToLeft, "Arabic (Tunisia)","\330\247\331\204\330\271\330\261\330\250\331\212\330\251 (\330\252\331\210\331\206\330\263)" },
{ wxLANGUAGE_ARABIC_UAE, "ar-AE" , "ar_AE" , "" , 0x01, 0x0e, wxLayout_RightToLeft, "Arabic (United Arab Emirates)","\330\247\331\204\330\271\330\261\330\250\331\212\330\251 (\330\247\331\204\330\245\331\205\330\247\330\261\330\247\330\252 \330\247\331\204\330\271\330\261\330\250\331\212\330\251 \330\247\331\204\331\205\330\252\330\255\330\257\330\251)" },
{ wxLANGUAGE_ARABIC_WORLD, "ar-001" , "ar_001" , "" , 0x00, 0x04, wxLayout_RightToLeft, "Arabic (World)","\330\247\331\204\330\271\330\261\330\250\331\212\330\251 (\330\247\331\204\330\271\330\247\331\204\331\205)" },
{ wxLANGUAGE_ARABIC_YEMEN, "ar-YE" , "ar_YE" , "" , 0x01, 0x09, wxLayout_RightToLeft, "Arabic (Yemen)","\330\247\331\204\330\271\330\261\330\250\331\212\330\251 (\330\247\331\204\331\212\331\205\331\206)" },
{ wxLANGUAGE_ARMENIAN, "hy" , "hy" , "hy_AM" , 0x2b, 0x01, wxLayout_LeftToRight, "Armenian","\325\260\325\241\325\265\325\245\326\200\325\245\325\266" },
{ wxLANGUAGE_ARMENIAN_ARMENIA, "hy-AM" , "hy_AM" , "" , 0x2b, 0x01, wxLayout_LeftToRight, "Armenian (Armenia)","\325\260\325\241\325\265\325\245\326\200\325\245\325\266 (\325\200\325\241\325\265\325\241\325\275\325\277\325\241\325\266)" },
{ wxLANGUAGE_ASSAMESE, "as" , "as" , "as_IN" , 0x4d, 0x01, wxLayout_LeftToRight, "Assamese","\340\246\205\340\246\270\340\246\256\340\247\200\340\246\257\340\246\274\340\246\276" },
{ wxLANGUAGE_ASSAMESE_INDIA, "as-IN" , "as_IN" , "" , 0x4d, 0x01, wxLayout_LeftToRight, "Assamese (India)","\340\246\205\340\246\270\340\246\256\340\247\200\340\246\257\340\246\274\340\246\276 (\340\246\255\340\246\276\340\247\260\340\246\244)" },
{ wxLANGUAGE_ASTURIAN, "ast" , "ast" , "ast_ES" , 0x00, 0x04, wxLayout_LeftToRight, "Asturian","asturianu" },
{ wxLANGUAGE_ASTURIAN_SPAIN, "ast-ES" , "ast_ES" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Asturian (Spain)","asturianu (Espa\303\261a)" },
{ wxLANGUAGE_ASU, "asa" , "asa" , "asa_TZ" , 0x00, 0x04, wxLayout_LeftToRight, "Asu","Kipare" },
{ wxLANGUAGE_ASU_TANZANIA, "asa-TZ" , "asa_TZ" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Asu (Tanzania)","Kipare (Tadhania)" },
{ wxLANGUAGE_AYMARA, "ay" , "ay" , "" , 0 , 0 , wxLayout_LeftToRight, "Aymara","Aymara" },
{ wxLANGUAGE_AZERBAIJANI, "az" , "az" , "" , 0x2c, 0x01, wxLayout_LeftToRight, "Azerbaijani","az\311\231rbaycan" },
{ wxLANGUAGE_AZERBAIJANI_CYRILLIC, "az-Cyrl" , "az@cyrillic" , "" , 0x2c, 0x02, wxLayout_LeftToRight, "Azerbaijani (Cyrillic)","\320\220\320\267\323\231\321\200\320\261\320\260\321\230\322\271\320\260\320\275\302\240\320\264\320\270\320\273\320\270 (\320\232\320\270\321\200\320\270\320\273)" },
{ wxLANGUAGE_AZERBAIJANI_CYRILLIC_AZERBAIJAN, "az-Cyrl-AZ" , "az_AZ@cyrillic" , "" , 0x2c, 0x02, wxLayout_LeftToRight, "Azerbaijani (Cyrillic, Azerbaijan)","\320\260\320\267\323\231\321\200\320\261\320\260\321\230\322\271\320\260\320\275 (\320\220\320\267\323\231\321\200\320\261\320\260\321\230\322\271\320\260\320\275)" },
{ wxLANGUAGE_AZERBAIJANI_LATIN, "az-Latn" , "az@latin" , "" , 0x2c, 0x01, wxLayout_LeftToRight, "Azerbaijani (Latin)","Az\311\231rbaycan\302\255\304\261l\304\261 (Lat\304\261n)" },
{ wxLANGUAGE_AZERBAIJANI_LATIN_AZERBAIJAN, "az-Latn-AZ" , "az_AZ@latin" , "" , 0x2c, 0x01, wxLayout_LeftToRight, "Azerbaijani (Latin, Azerbaijan)","az\311\231rbaycan (Az\311\231rbaycan)" },
{ wxLANGUAGE_BAFIA, "ksf" , "ksf" , "ksf_CM" , 0x00, 0x04, wxLayout_LeftToRight, "Bafia","rikpa" },
{ wxLANGUAGE_BAFIA_CAMEROON, "ksf-CM" , "ksf_CM" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Bafia (Cameroon)","rikpa (kam\311\233r\303\272n)" },
{ wxLANGUAGE_BAMANANKAN, "bm" , "bm" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Bamanankan","bamanakan" },
{ wxLANGUAGE_BAMANANKAN_LATIN, "bm-Latn" , "bm@latin" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Bamanankan (Latin)","bamanakan (Latin)" },
{ wxLANGUAGE_BAMANANKAN_LATIN_MALI, "bm-Latn-ML" , "bm_ML@latin" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Bamanankan (Latin, Mali)","bamanakan (Mali)" },
{ wxLANGUAGE_BANGLA, "bn" , "bn" , "bn_BD" , 0x45, 0x02, wxLayout_LeftToRight, "Bangla","\340\246\254\340\246\276\340\246\202\340\246\262\340\246\276" },
{ wxLANGUAGE_BANGLA_BANGLADESH, "bn-BD" , "bn_BD" , "" , 0x45, 0x02, wxLayout_LeftToRight, "Bangla (Bangladesh)","\340\246\254\340\246\276\340\246\202\340\246\262\340\246\276 (\340\246\254\340\246\276\340\246\202\340\246\262\340\246\276\340\246\246\340\247\207\340\246\266)" },
{ wxLANGUAGE_BANGLA_INDIA, "bn-IN" , "bn_IN" , "" , 0x45, 0x01, wxLayout_LeftToRight, "Bengali (India)","\340\246\254\340\246\276\340\246\202\340\246\262\340\246\276 (\340\246\255\340\246\276\340\246\260\340\246\244)" },
{ wxLANGUAGE_BASAA, "bas" , "bas" , "bas_CM" , 0x00, 0x04, wxLayout_LeftToRight, "Basaa","\306\201\303\240s\303\240a" },
{ wxLANGUAGE_BASAA_CAMEROON, "bas-CM" , "bas_CM" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Basaa (Cameroon)","\306\201\303\240s\303\240a (K\303\240m\311\233\314\200r\303\273n)" },
{ wxLANGUAGE_BASHKIR, "ba" , "ba" , "ba_RU" , 0x6d, 0x01, wxLayout_LeftToRight, "Bashkir","\320\221\320\260\321\210\322\241\320\276\321\200\321\202" },
{ wxLANGUAGE_BASHKIR_RUSSIA, "ba-RU" , "ba_RU" , "" , 0x6d, 0x01, wxLayout_LeftToRight, "Bashkir (Russia)","\320\221\320\260\321\210\322\241\320\276\321\200\321\202 (\320\240\323\231\321\201\323\231\320\271)" },
{ wxLANGUAGE_BASQUE, "eu" , "eu" , "eu_ES" , 0x2d, 0x01, wxLayout_LeftToRight, "Basque","euskara" },
{ wxLANGUAGE_BASQUE_SPAIN, "eu-ES" , "eu_ES" , "" , 0x2d, 0x01, wxLayout_LeftToRight, "Basque (Basque)","euskara (euskara)" },
{ wxLANGUAGE_BELARUSIAN, "be" , "be" , "be_BY" , 0x23, 0x01, wxLayout_LeftToRight, "Belarusian","\320\261\320\265\320\273\320\260\321\200\321\203\321\201\320\272\320\260\321\217" },
{ wxLANGUAGE_BELARUSIAN_BELARUS, "be-BY" , "be_BY" , "" , 0x23, 0x01, wxLayout_LeftToRight, "Belarusian (Belarus)","\320\261\320\265\320\273\320\260\321\200\321\203\321\201\320\272\320\260\321\217 (\320\221\320\265\320\273\320\260\321\200\321\203\321\201\321\214)" },
{ wxLANGUAGE_BEMBA, "bem" , "bem" , "bem_ZM" , 0x00, 0x04, wxLayout_LeftToRight, "Bemba","Ichibemba" },
{ wxLANGUAGE_BEMBA_ZAMBIA, "bem-ZM" , "bem_ZM" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Bemba (Zambia)","Ichibemba (Zambia)" },
{ wxLANGUAGE_BENA, "bez" , "bez" , "bez_TZ" , 0x00, 0x04, wxLayout_LeftToRight, "Bena","Hibena" },
{ wxLANGUAGE_BENA_TANZANIA, "bez-TZ" , "bez_TZ" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Bena (Tanzania)","Hibena (Hutanzania)" },
{ wxLANGUAGE_BIHARI, "bh" , "bh" , "" , 0 , 0 , wxLayout_LeftToRight, "Bihari","Bihari" },
{ wxLANGUAGE_BISLAMA, "bi" , "bi" , "" , 0 , 0 , wxLayout_LeftToRight, "Bislama","Bislama" },
{ wxLANGUAGE_BLIN, "byn" , "byn" , "byn_ER" , 0x00, 0x04, wxLayout_LeftToRight, "Blin","\341\211\245\341\210\212\341\212\225" },
{ wxLANGUAGE_BLIN_ERITREA, "byn-ER" , "byn_ER" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Blin (Eritrea)","\341\211\245\341\210\212\341\212\225 (\341\212\244\341\210\255\341\211\265\341\210\253)" },
{ wxLANGUAGE_BODO, "brx" , "brx" , "brx_IN" , 0x00, 0x04, wxLayout_LeftToRight, "Bodo","\340\244\254\340\244\241\340\244\274\340\245\213" },
{ wxLANGUAGE_BODO_INDIA, "brx-IN" , "brx_IN" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Bodo (India)","\340\244\254\340\244\241\340\244\274\340\245\213 (\340\244\255\340\244\276\340\244\260\340\244\244)" },
{ wxLANGUAGE_BOSNIAN, "bs" , "bs" , "" , 0x1a, 0x05, wxLayout_LeftToRight, "Bosnian","bosanski" },
{ wxLANGUAGE_BOSNIAN_CYRILLIC, "bs-Cyrl" , "bs@cyrillic" , "" , 0x1a, 0x08, wxLayout_LeftToRight, "Bosnian (Cyrillic)","\320\261\320\276\321\201\320\260\320\275\321\201\320\272\320\270 (\320\213\320\270\321\200\320\270\320\273\320\270\321\206\320\260)" },
{ wxLANGUAGE_BOSNIAN_CYRILLIC_BOSNIA_AND_HERZEGOVINA, "bs-Cyrl-BA" , "bs_BA@cyrillic" , "" , 0x1a, 0x08, wxLayout_LeftToRight, "Bosnian (Cyrillic, Bosnia and Herzegovina)","\320\261\320\276\321\201\320\260\320\275\321\201\320\272\320\270 (\320\221\320\276\321\201\320\275\320\260 \320\270 \320\245\320\265\321\200\321\206\320\265\320\263\320\276\320\262\320\270\320\275\320\260)" },
{ wxLANGUAGE_BOSNIAN_LATIN, "bs-Latn" , "bs@latin" , "" , 0x1a, 0x05, wxLayout_LeftToRight, "Bosnian (Latin)","bosanski (Latinica)" },
{ wxLANGUAGE_BOSNIAN_LATIN_BOSNIA_AND_HERZEGOVINA, "bs-Latn-BA" , "bs_BA@latin" , "" , 0x1a, 0x05, wxLayout_LeftToRight, "Bosnian (Latin, Bosnia and Herzegovina)","bosanski (Bosna i Hercegovina)" },
{ wxLANGUAGE_BRETON, "br" , "br" , "br_FR" , 0x7e, 0x01, wxLayout_LeftToRight, "Breton","brezhoneg" },
{ wxLANGUAGE_BRETON_FRANCE, "br-FR" , "br_FR" , "" , 0x7e, 0x01, wxLayout_LeftToRight, "Breton (France)","brezhoneg (Fra\303\261s)" },
{ wxLANGUAGE_BULGARIAN, "bg" , "bg" , "bg_BG" , 0x02, 0x01, wxLayout_LeftToRight, "Bulgarian","\320\261\321\212\320\273\320\263\320\260\321\200\321\201\320\272\320\270" },
{ wxLANGUAGE_BULGARIAN_BULGARIA, "bg-BG" , "bg_BG" , "" , 0x02, 0x01, wxLayout_LeftToRight, "Bulgarian (Bulgaria)","\320\261\321\212\320\273\320\263\320\260\321\200\321\201\320\272\320\270 (\320\221\321\212\320\273\320\263\320\260\321\200\320\270\321\217)" },
{ wxLANGUAGE_BURMESE, "my" , "my" , "my_MM" , 0x55, 0x01, wxLayout_LeftToRight, "Burmese","\341\200\227\341\200\231\341\200\254" },
{ wxLANGUAGE_BURMESE_MYANMAR, "my-MM" , "my_MM" , "" , 0x55, 0x01, wxLayout_LeftToRight, "Burmese (Myanmar)","\341\200\231\341\200\274\341\200\224\341\200\272\341\200\231\341\200\254 (\341\200\231\341\200\274\341\200\224\341\200\272\341\200\231\341\200\254)" },
{ wxLANGUAGE_CATALAN, "ca" , "ca" , "ca_ES" , 0x03, 0x01, wxLayout_LeftToRight, "Catalan","catal\303\240" },
{ wxLANGUAGE_CATALAN_ANDORRA, "ca-AD" , "ca_AD" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Catalan (Andorra)","catal\303\240 (Andorra)" },
{ wxLANGUAGE_CATALAN_FRANCE, "ca-FR" , "ca_FR" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Catalan (France)","catal\303\240 (Fran\303\247a)" },
{ wxLANGUAGE_CATALAN_ITALY, "ca-IT" , "ca_IT" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Catalan (Italy)","catal\303\240 (It\303\240lia)" },
{ wxLANGUAGE_CATALAN_SPAIN, "ca-ES" , "ca_ES" , "" , 0x03, 0x01, wxLayout_LeftToRight, "Catalan (Catalan)","catal\303\240 (catal\303\240)" },
{ wxLANGUAGE_CEBUANO, "ceb" , "ceb" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Cebuano","Binisaya" },
{ wxLANGUAGE_CEBUANO_LATIN, "ceb-Latn" , "ceb@latin" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Cebuano (Latin)","Binisaya (Latin)" },
{ wxLANGUAGE_CEBUANO_LATIN_PHILIPPINES, "ceb-Latn-PH" , "ceb_PH@latin" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Cebuano (Latin, Philippines)","Binisaya (Pilipinas)" },
{ wxLANGUAGE_CENTRAL_ATLAS_TAMAZIGHT, "tzm" , "tzm" , "" , 0x5f, 0x02, wxLayout_LeftToRight, "Central Atlas Tamazight","Tamazi\311\243t n la\341\271\255la\341\271\243" },
{ wxLANGUAGE_CENTRAL_ATLAS_TAMAZIGHT_ARABIC, "tzm-Arab" , "tzm@arabic" , "" , 0x5f, 0x01, wxLayout_RightToLeft, "Central Atlas Tamazight (Arabic)","\330\247\331\204\330\243\331\205\330\247\330\262\331\212\330\272\331\212\330\251 \331\210\330\263\330\267 \330\247\331\204\330\243\330\267\331\204\330\263" },
{ wxLANGUAGE_CENTRAL_ATLAS_TAMAZIGHT_ARABIC_MOROCCO, "tzm-Arab-MA" , "tzm_MA@arabic" , "" , 0x5f, 0x01, wxLayout_RightToLeft, "Central Atlas Tamazight (Arabic, Morocco)","\330\247\331\204\330\243\331\205\330\247\330\262\331\212\330\272\331\212\330\251 \331\210\330\263\330\267 \330\247\331\204\330\243\330\267\331\204\330\263 (\330\247\331\204\331\205\330\272\330\261\330\250)" },
{ wxLANGUAGE_CENTRAL_ATLAS_TAMAZIGHT_LATIN, "tzm-Latn" , "tzm@latin" , "" , 0x5f, 0x02, wxLayout_LeftToRight, "Central Atlas Tamazight (Latin)","Tamazi\311\243t n la\341\271\255la\341\271\243 (Latin)" },
{ wxLANGUAGE_CENTRAL_ATLAS_TAMAZIGHT_LATIN_ALGERIA, "tzm-Latn-DZ" , "tzm_DZ@latin" , "" , 0x5f, 0x02, wxLayout_LeftToRight, "Central Atlas Tamazight (Latin, Algeria)","Tamazi\311\243t n la\341\271\255la\341\271\243 (Djaza\303\257r)" },
{ wxLANGUAGE_CENTRAL_ATLAS_TAMAZIGHT_LATIN_MOROCCO, "tzm-Latn-MA" , "tzm_MA@latin" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Central Atlas Tamazight (Latin, Morocco)","Tamazi\311\243t n la\341\271\255la\341\271\243 (Me\341\271\233\341\271\233uk)" },
{ wxLANGUAGE_CENTRAL_ATLAS_TAMAZIGHT_TIFINAGH, "tzm-Tfng" , "tzm@tifinagh" , "" , 0x5f, 0x04, wxLayout_LeftToRight, "Central Atlas Tamazight (Tifinagh)","Tamazight (Tifinagh)" },
{ wxLANGUAGE_CENTRAL_ATLAS_TAMAZIGHT_TIFINAGH_MOROCCO, "tzm-Tfng-MA" , "tzm_MA@tifinagh" , "" , 0x5f, 0x04, wxLayout_LeftToRight, "Central Atlas Tamazight (Tifinagh, Morocco)","\342\265\234\342\264\260\342\265\216\342\264\260\342\265\243\342\265\211\342\265\226\342\265\234 (\342\265\215\342\265\216\342\265\226\342\265\224\342\265\211\342\264\261)" },
{ wxLANGUAGE_CENTRAL_KURDISH, "ku" , "ku" , "" , 0x92, 0x01, wxLayout_RightToLeft, "Central Kurdish","\332\251\331\210\330\261\330\257\333\214\333\214 \331\206\330\247\331\210\333\225\332\225\330\247\330\263\330\252" },
{ wxLANGUAGE_CENTRAL_KURDISH_ARABIC, "ku-Arab" , "ku@arabic" , "" , 0x92, 0x01, wxLayout_RightToLeft, "Central Kurdish","\332\251\331\210\330\261\330\257\333\214\333\214 \331\206\330\247\331\210\333\225\332\225\330\247\330\263\330\252" },
{ wxLANGUAGE_CENTRAL_KURDISH_ARABIC_IRAQ, "ku-Arab-IQ" , "ku_IQ@arabic" , "" , 0x92, 0x01, wxLayout_RightToLeft, "Central Kurdish (Iraq)","\332\251\331\210\330\261\330\257\333\214\333\214 \331\206\330\247\331\210\333\225\332\225\330\247\330\263\330\252 (\330\271\333\216\330\261\330\247\331\202)" },
{ wxLANGUAGE_CHAKMA, "ccp" , "ccp" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Chakma","\360\221\204\214\360\221\204\213\360\221\204\264\360\221\204\237\360\221\204\263\360\221\204\246" },
{ wxLANGUAGE_CHAKMA_CHAKMA, "ccp-Cakm" , "ccp@chakma" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Chakma (Chakma)","\360\221\204\214\360\221\204\213\360\221\204\264\360\221\204\237\360\221\204\263\360\221\204\246 (\360\221\204\214\360\221\204\207\360\221\204\264\360\221\204\237)" },
{ wxLANGUAGE_CHAKMA_CHAKMA_BANGLADESH, "ccp-Cakm-BD" , "ccp_BD@chakma" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Chakma (Chakma, Bangladesh)","\360\221\204\214\360\221\204\213\360\221\204\264\360\221\204\237\360\221\204\263\360\221\204\246 (\360\221\204\235\360\221\204\201\360\221\204\243\360\221\204\230\360\221\204\254\360\221\204\214\360\221\204\264)" },
{ wxLANGUAGE_CHAKMA_CHAKMA_INDIA, "ccp-Cakm-IN" , "ccp_IN@chakma" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Chakma (Chakma, India)","\360\221\204\214\360\221\204\213\360\221\204\264\360\221\204\237\360\221\204\263\360\221\204\246 (\360\221\204\236\360\221\204\242\360\221\204\247\360\221\204\226\360\221\204\264)" },
{ wxLANGUAGE_CHECHEN, "ce" , "ce" , "ce_RU" , 0x00, 0x04, wxLayout_LeftToRight, "Chechen","\320\275\320\276\321\205\321\207\320\270\320\271\320\275" },
{ wxLANGUAGE_CHECHEN_RUSSIA, "ce-RU" , "ce_RU" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Chechen (Russia)","\320\275\320\276\321\205\321\207\320\270\320\271\320\275 (\320\240\320\276\321\201\321\201\320\270)" },
{ wxLANGUAGE_CHEROKEE, "chr" , "chr" , "" , 0x5c, 0x01, wxLayout_LeftToRight, "Cherokee","\341\217\243\341\216\263\341\216\251" },
{ wxLANGUAGE_CHEROKEE_CHEROKEE, "chr-Cher" , "chr@cherokee" , "" , 0x5c, 0x01, wxLayout_LeftToRight, "Cherokee","\341\217\243\341\216\263\341\216\251" },
{ wxLANGUAGE_CHEROKEE_US, "chr-Cher-US" , "chr_US@cherokee" , "" , 0x5c, 0x01, wxLayout_LeftToRight, "Cherokee (Cherokee, United States)","\341\217\243\341\216\263\341\216\251 (\341\217\214\341\217\212 \341\216\242\341\217\263\341\216\276\341\216\265\341\217\215\341\217\224\341\217\205 \341\217\215\341\216\246\341\217\232\341\216\251)" },
{ wxLANGUAGE_CHIGA, "cgg" , "cgg" , "cgg_UG" , 0x00, 0x04, wxLayout_LeftToRight, "Chiga","Rukiga" },
{ wxLANGUAGE_CHIGA_UGANDA, "cgg-UG" , "cgg_UG" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Chiga (Uganda)","Rukiga (Uganda)" },
{ wxLANGUAGE_CHINESE, "zh" , "zh" , "zh_TW" , 0x04, 0x01, wxLayout_LeftToRight, "Chinese","\344\270\255\346\226\207" },
{ wxLANGUAGE_CHINESE_CHINA, "zh-CN" , "zh_CN" , "" , 0x04, 0x02, wxLayout_LeftToRight, "Chinese (Simplified, China)","\344\270\255\346\226\207(\344\270\255\345\233\275)" },
{ wxLANGUAGE_CHINESE_HONGKONG, "zh-HK" , "zh_HK" , "" , 0x04, 0x03, wxLayout_LeftToRight, "Chinese (Traditional, Hong Kong SAR)","\344\270\255\346\226\207(\351\246\231\346\270\257\347\211\271\345\210\245\350\241\214\346\224\277\345\215\200)" },
{ wxLANGUAGE_CHINESE_MACAO, "zh-MO" , "zh_MO" , "" , 0x04, 0x05, wxLayout_LeftToRight, "Chinese (Traditional, Macao SAR)","\344\270\255\346\226\207(\346\276\263\351\226\200\347\211\271\345\210\245\350\241\214\346\224\277\345\215\200)" },
{ wxLANGUAGE_CHINESE_SIMPLIFIED_EXPLICIT, "zh-Hans" , "zh@Hans" , "zh_CN" , 0x04, 0x02, wxLayout_LeftToRight, "Chinese (Simplified)","\344\270\255\346\226\207(\347\256\200\344\275\223)" },
{ wxLANGUAGE_CHINESE_SIMPLIFIED_HONGKONG, "zh-Hans-HK" , "zh_HK@Hans" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Chinese (Simplified, Hong Kong SAR)","\344\270\255\346\226\207 (\351\246\231\346\270\257\347\211\271\345\210\253\350\241\214\346\224\277\345\214\272)" },
{ wxLANGUAGE_CHINESE_SIMPLIFIED_MACAO, "zh-Hans-MO" , "zh_MO@Hans" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Chinese (Simplified, Macao SAR)","\344\270\255\346\226\207 (\346\276\263\351\227\250\347\211\271\345\210\253\350\241\214\346\224\277\345\214\272)" },
{ wxLANGUAGE_CHINESE_SINGAPORE, "zh-SG" , "zh_SG" , "" , 0x04, 0x04, wxLayout_LeftToRight, "Chinese (Simplified, Singapore)","\344\270\255\346\226\207(\346\226\260\345\212\240\345\235\241)" },
{ wxLANGUAGE_CHINESE_TAIWAN, "zh-TW" , "zh_TW" , "" , 0x04, 0x01, wxLayout_LeftToRight, "Chinese (Traditional, Taiwan)","\344\270\255\346\226\207(\345\217\260\347\201\243)" },
{ wxLANGUAGE_CHINESE_TRADITIONAL_EXPLICIT, "zh-Hant" , "zh@Hant" , "zh_TW" , 0x04, 0x01, wxLayout_LeftToRight, "Chinese (Traditional)","\344\270\255\346\226\207(\347\271\201\351\253\224)" },
{ wxLANGUAGE_CHURCH_SLAVIC, "cu" , "cu" , "cu_RU" , 0x00, 0x04, wxLayout_LeftToRight, "Church Slavic","\321\206\320\265\321\200\320\272\320\276\320\262\320\275\320\276\321\201\320\273\320\276\320\262\320\265\314\201\320\275\321\201\320\272\321\227\320\271" },
{ wxLANGUAGE_CHURCH_SLAVIC_RUSSIA, "cu-RU" , "cu_RU" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Church Slavic (Russia)","\321\206\320\265\321\200\320\272\320\276\320\262\320\275\320\276\321\201\320\273\320\276\320\262\320\265\314\201\320\275\321\201\320\272\321\227\320\271 (\321\200\321\241\321\201\321\201\321\226\314\201\320\260)" },
{ wxLANGUAGE_COLOGNIAN, "ksh" , "ksh" , "ksh_DE" , 0x00, 0x04, wxLayout_LeftToRight, "Colognian","K\303\266lsch" },
{ wxLANGUAGE_COLOGNIAN_GERMANY, "ksh-DE" , "ksh_DE" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Colognian (Germany)","K\303\266lsch (Do\303\274tschland)" },
{ wxLANGUAGE_CORNISH, "kw" , "kw" , "kw_GB" , 0x00, 0x04, wxLayout_LeftToRight, "Cornish","kernewek" },
{ wxLANGUAGE_CORNISH_UK, "kw-GB" , "kw_GB" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Cornish (United Kingdom)","kernewek (Rywvaneth Unys)" },
{ wxLANGUAGE_CORSICAN, "co" , "co" , "co_FR" , 0x83, 0x01, wxLayout_LeftToRight, "Corsican","corsu" },
{ wxLANGUAGE_CORSICAN_FRANCE, "co-FR" , "co_FR" , "" , 0x83, 0x01, wxLayout_LeftToRight, "Corsican (France)","Corsu (Francia)" },
{ wxLANGUAGE_CROATIAN, "hr" , "hr" , "hr_HR" , 0x1a, 0x01, wxLayout_LeftToRight, "Croatian","hrvatski" },
{ wxLANGUAGE_CROATIAN_BOSNIA_AND_HERZEGOVINA, "hr-BA" , "hr_BA" , "" , 0x1a, 0x04, wxLayout_LeftToRight, "Croatian (Bosnia and Herzegovina)","hrvatski (Bosna i Hercegovina)" },
{ wxLANGUAGE_CROATIAN_CROATIA, "hr-HR" , "hr_HR" , "" , 0x1a, 0x01, wxLayout_LeftToRight, "Croatian (Croatia)","hrvatski (Hrvatska)" },
{ wxLANGUAGE_CZECH, "cs" , "cs" , "cs_CZ" , 0x05, 0x01, wxLayout_LeftToRight, "Czech","\304\215e\305\241tina" },
{ wxLANGUAGE_CZECH_CZECHIA, "cs-CZ" , "cs_CZ" , "" , 0x05, 0x01, wxLayout_LeftToRight, "Czech (Czechia)","\304\215e\305\241tina (\304\214esko)" },
{ wxLANGUAGE_DANISH, "da" , "da" , "da_DK" , 0x06, 0x01, wxLayout_LeftToRight, "Danish","dansk" },
{ wxLANGUAGE_DANISH_DENMARK, "da-DK" , "da_DK" , "" , 0x06, 0x01, wxLayout_LeftToRight, "Danish (Denmark)","dansk (Danmark)" },
{ wxLANGUAGE_DANISH_GREENLAND, "da-GL" , "da_GL" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Danish (Greenland)","dansk (Gr\303\270nland)" },
{ wxLANGUAGE_DIVEHI, "dv" , "dv" , "dv_MV" , 0x65, 0x01, wxLayout_RightToLeft, "Divehi","\336\213\336\250\336\210\336\254\336\200\336\250\336\204\336\246\336\220\336\260" },
{ wxLANGUAGE_DIVEHI_MALDIVES, "dv-MV" , "dv_MV" , "" , 0x65, 0x01, wxLayout_RightToLeft, "Divehi (Maldives)","\336\213\336\250\336\210\336\254\336\200\336\250\336\204\336\246\336\220\336\260 (\336\213\336\250\336\210\336\254\336\200\336\250 \336\203\336\247\336\207\336\260\336\226\336\254)" },
{ wxLANGUAGE_DOGRI, "doi" , "doi" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Dogri","\340\244\241\340\245\213\340\244\227\340\244\260\340\245\200" },
{ wxLANGUAGE_DOGRI_DEVANAGARI, "doi-Deva" , "doi@devanagari" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Dogri (Devanagari)","\340\244\241\340\245\213\340\244\227\340\244\260\340\245\200 (\340\244\246\340\245\207\340\244\265\340\244\250\340\244\276\340\244\227\340\244\260\340\245\200)" },
{ wxLANGUAGE_DOGRI_DEVANAGARI_INDIA, "doi-Deva-IN" , "doi_IN@devanagari" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Dogri (Devanagari, India)","\340\244\241\340\245\213\340\244\227\340\244\260\340\245\200 (\340\244\255\340\244\276\340\244\260\340\244\244)" },
{ wxLANGUAGE_DUALA, "dua" , "dua" , "dua_CM" , 0x00, 0x04, wxLayout_LeftToRight, "Duala","du\303\241l\303\241" },
{ wxLANGUAGE_DUALA_CAMEROON, "dua-CM" , "dua_CM" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Duala (Cameroon)","du\303\241l\303\241 (Cameroun)" },
{ wxLANGUAGE_DUTCH, "nl" , "nl" , "nl_NL" , 0x13, 0x01, wxLayout_LeftToRight, "Dutch","Nederlands" },
{ wxLANGUAGE_DUTCH_ARUBA, "nl-AW" , "nl_AW" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Dutch (Aruba)","Nederlands (Aruba)" },
{ wxLANGUAGE_DUTCH_BELGIAN, "nl-BE" , "nl_BE" , "" , 0x13, 0x02, wxLayout_LeftToRight, "Dutch (Belgium)","Nederlands (Belgi\303\253)" },
{ wxLANGUAGE_DUTCH_BONAIRE_SINT_EUSTATIUS_AND_SABA, "nl-BQ" , "nl_BQ" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Dutch (Bonaire, Sint Eustatius and Saba)","Nederlands (Bonaire, Sint Eustatius en Saba)" },
{ wxLANGUAGE_DUTCH_CURACAO, "nl-CW" , "nl_CW" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Dutch (Cura\303\247ao)","Nederlands (Cura\303\247ao)" },
{ wxLANGUAGE_DUTCH_NETHERLANDS, "nl-NL" , "nl_NL" , "" , 0x13, 0x01, wxLayout_LeftToRight, "Dutch (Netherlands)","Nederlands (Nederland)" },
{ wxLANGUAGE_DUTCH_SINT_MAARTEN, "nl-SX" , "nl_SX" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Dutch (Sint Maarten)","Nederlands (Sint-Maarten)" },
{ wxLANGUAGE_DUTCH_SURINAME, "nl-SR" , "nl_SR" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Dutch (Suriname)","Nederlands (Suriname)" },
{ wxLANGUAGE_DZONGKHA, "dz" , "dz" , "dz_BT" , 0x51, 0x03, wxLayout_LeftToRight, "Dzongkha","\340\275\242\340\276\253\340\275\274\340\275\204\340\274\213\340\275\201" },
{ wxLANGUAGE_DZONGKHA_BHUTAN, "dz-BT" , "dz_BT" , "" , 0x51, 0x03, wxLayout_LeftToRight, "Dzongkha (Bhutan)","\340\275\242\340\276\253\340\275\274\340\275\204\340\274\213\340\275\201 (\340\275\240\340\275\226\340\276\262\340\275\264\340\275\202)" },
{ wxLANGUAGE_EDO, "bin" , "bin" , "bin_NG" , 0x66, 0x01, wxLayout_LeftToRight, "Edo","\341\272\270\314\200d\303\263" },
{ wxLANGUAGE_EDO_NIGERIA, "bin-NG" , "bin_NG" , "" , 0x66, 0x01, wxLayout_LeftToRight, "Edo (Nigeria)","\341\272\270\314\200d\303\263 (Nigeria)" },
{ wxLANGUAGE_EMBU, "ebu" , "ebu" , "ebu_KE" , 0x00, 0x04, wxLayout_LeftToRight, "Embu","K\304\251embu" },
{ wxLANGUAGE_EMBU_KENYA, "ebu-KE" , "ebu_KE" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Embu (Kenya)","K\304\251embu (Kenya)" },
{ wxLANGUAGE_ENGLISH, "en" , "en" , "en_GB" , 0x09, 0x02, wxLayout_LeftToRight, "English","English" },
{ wxLANGUAGE_ENGLISH_AMERICAN_SAMOA, "en-AS" , "en_AS" , "" , 0x00, 0x04, wxLayout_LeftToRight, "English (American Samoa)","English (American Samoa)" },
{ wxLANGUAGE_ENGLISH_ANGUILLA, "en-AI" , "en_AI" , "" , 0x00, 0x04, wxLayout_LeftToRight, "English (Anguilla)","English (Anguilla)" },
{ wxLANGUAGE_ENGLISH_ANTIGUA_AND_BARBUDA, "en-AG" , "en_AG" , "" , 0x00, 0x04, wxLayout_LeftToRight, "English (Antigua and Barbuda)","English (Antigua & Barbuda)" },
{ wxLANGUAGE_ENGLISH_AUSTRALIA, "en-AU" , "en_AU" , "" , 0x09, 0x03, wxLayout_LeftToRight, "English (Australia)","English (Australia)" },
{ wxLANGUAGE_ENGLISH_AUSTRIA, "en-AT" , "en_AT" , "" , 0x00, 0x04, wxLayout_LeftToRight, "English (Austria)","English (Austria)" },
{ wxLANGUAGE_ENGLISH_BAHAMAS, "en-BS" , "en_BS" , "" , 0x00, 0x04, wxLayout_LeftToRight, "English (Bahamas)","English (Bahamas)" },
{ wxLANGUAGE_ENGLISH_BARBADOS, "en-BB" , "en_BB" , "" , 0x00, 0x04, wxLayout_LeftToRight, "English (Barbados)","English (Barbados)" },
{ wxLANGUAGE_ENGLISH_BELGIUM, "en-BE" , "en_BE" , "" , 0x00, 0x04, wxLayout_LeftToRight, "English (Belgium)","English (Belgium)" },
{ wxLANGUAGE_ENGLISH_BELIZE, "en-BZ" , "en_BZ" , "" , 0x09, 0x0a, wxLayout_LeftToRight, "English (Belize)","English (Belize)" },
{ wxLANGUAGE_ENGLISH_BERMUDA, "en-BM" , "en_BM" , "" , 0x00, 0x04, wxLayout_LeftToRight, "English (Bermuda)","English (Bermuda)" },
{ wxLANGUAGE_ENGLISH_BOTSWANA, "en-BW" , "en_BW" , "" , 0x00, 0x04, wxLayout_LeftToRight, "English (Botswana)","English (Botswana)" },
{ wxLANGUAGE_ENGLISH_BRITISH_INDIAN_OCEAN_TERRITORY, "en-IO" , "en_IO" , "" , 0x00, 0x04, wxLayout_LeftToRight, "English (British Indian Ocean Territory)","English (British Indian Ocean Territory)" },
{ wxLANGUAGE_ENGLISH_BRITISH_VIRGIN_ISLANDS, "en-VG" , "en_VG" , "" , 0x00, 0x04, wxLayout_LeftToRight, "English (British Virgin Islands)","English (British Virgin Islands)" },
{ wxLANGUAGE_ENGLISH_BURUNDI, "en-BI" , "en_BI" , "" , 0x00, 0x04, wxLayout_LeftToRight, "English (Burundi)","English (Burundi)" },
{ wxLANGUAGE_ENGLISH_CAMEROON, "en-CM" , "en_CM" , "" , 0x00, 0x04, wxLayout_LeftToRight, "English (Cameroon)","English (Cameroon)" },
{ wxLANGUAGE_ENGLISH_CANADA, "en-CA" , "en_CA" , "" , 0x09, 0x04, wxLayout_LeftToRight, "English (Canada)","English (Canada)" },
{ wxLANGUAGE_ENGLISH_CARIBBEAN, "en-029" , "en_029" , "en_CB" , 0x09, 0x09, wxLayout_LeftToRight, "English (Caribbean)","English (Caribbean)" },
{ wxLANGUAGE_ENGLISH_CARIBBEAN_CB, "en-CB" , "en_CB" , "" , 0x09, 0x09, wxLayout_LeftToRight, "English (Caribbean)","English (Caribbean)" },
{ wxLANGUAGE_ENGLISH_CAYMAN_ISLANDS, "en-KY" , "en_KY" , "" , 0x00, 0x04, wxLayout_LeftToRight, "English (Cayman Islands)","English (Cayman Islands)" },
{ wxLANGUAGE_ENGLISH_CHRISTMAS_ISLAND, "en-CX" , "en_CX" , "" , 0x00, 0x04, wxLayout_LeftToRight, "English (Christmas Island)","English (Christmas Island)" },
{ wxLANGUAGE_ENGLISH_COCOS_KEELING_ISLANDS, "en-CC" , "en_CC" , "" , 0x00, 0x04, wxLayout_LeftToRight, "English (Cocos (Keeling) Islands)","English (Cocos (Keeling) Islands)" },
{ wxLANGUAGE_ENGLISH_COOK_ISLANDS, "en-CK" , "en_CK" , "" , 0x00, 0x04, wxLayout_LeftToRight, "English (Cook Islands)","English (Cook Islands)" },
{ wxLANGUAGE_ENGLISH_CYPRUS, "en-CY" , "en_CY" , "" , 0x00, 0x04, wxLayout_LeftToRight, "English (Cyprus)","English (Cyprus)" },
{ wxLANGUAGE_ENGLISH_DENMARK, "en-DK" , "en_DK" , "" , 0x00, 0x04, wxLayout_LeftToRight, "English (Denmark)","English (Denmark)" },
{ wxLANGUAGE_ENGLISH_DOMINICA, "en-DM" , "en_DM" , "" , 0x00, 0x04, wxLayout_LeftToRight, "English (Dominica)","English (Dominica)" },
{ wxLANGUAGE_ENGLISH_EIRE, "en-IE" , "en_IE" , "" , 0x09, 0x06, wxLayout_LeftToRight, "English (Ireland)","English (Ireland)" },
{ wxLANGUAGE_ENGLISH_ERITREA, "en-ER" , "en_ER" , "" , 0x00, 0x04, wxLayout_LeftToRight, "English (Eritrea)","English (Eritrea)" },
{ wxLANGUAGE_ENGLISH_ESWATINI, "en-SZ" , "en_SZ" , "" , 0x00, 0x04, wxLayout_LeftToRight, "English (Eswatini)","English (Eswatini)" },
{ wxLANGUAGE_ENGLISH_EUROPE, "en-150" , "en_150" , "" , 0x00, 0x04, wxLayout_LeftToRight, "English (Europe)","English (Europe)" },
{ wxLANGUAGE_ENGLISH_FALKLAND_ISLANDS, "en-FK" , "en_FK" , "" , 0x00, 0x04, wxLayout_LeftToRight, "English (Falkland Islands)","English (Falkland Islands)" },
{ wxLANGUAGE_ENGLISH_FIJI, "en-FJ" , "en_FJ" , "" , 0x00, 0x04, wxLayout_LeftToRight, "English (Fiji)","English (Fiji)" },
{ wxLANGUAGE_ENGLISH_FINLAND, "en-FI" , "en_FI" , "" , 0x00, 0x04, wxLayout_LeftToRight, "English (Finland)","English (Finland)" },
{ wxLANGUAGE_ENGLISH_GAMBIA, "en-GM" , "en_GM" , "" , 0x00, 0x04, wxLayout_LeftToRight, "English (Gambia)","English (Gambia)" },
{ wxLANGUAGE_ENGLISH_GERMANY, "en-DE" , "en_DE" , "" , 0x00, 0x04, wxLayout_LeftToRight, "English (Germany)","English (Germany)" },
{ wxLANGUAGE_ENGLISH_GHANA, "en-GH" , "en_GH" , "" , 0x00, 0x04, wxLayout_LeftToRight, "English (Ghana)","English (Ghana)" },
{ wxLANGUAGE_ENGLISH_GIBRALTAR, "en-GI" , "en_GI" , "" , 0x00, 0x04, wxLayout_LeftToRight, "English (Gibraltar)","English (Gibraltar)" },
{ wxLANGUAGE_ENGLISH_GRENADA, "en-GD" , "en_GD" , "" , 0x00, 0x04, wxLayout_LeftToRight, "English (Grenada)","English (Grenada)" },
{ wxLANGUAGE_ENGLISH_GUAM, "en-GU" , "en_GU" , "" , 0x00, 0x04, wxLayout_LeftToRight, "English (Guam)","English (Guam)" },
{ wxLANGUAGE_ENGLISH_GUERNSEY, "en-GG" , "en_GG" , "" , 0x00, 0x04, wxLayout_LeftToRight, "English (Guernsey)","English (Guernsey)" },
{ wxLANGUAGE_ENGLISH_GUYANA, "en-GY" , "en_GY" , "" , 0x00, 0x04, wxLayout_LeftToRight, "English (Guyana)","English (Guyana)" },
{ wxLANGUAGE_ENGLISH_HONG_KONG_SAR, "en-HK" , "en_HK" , "" , 0x09, 0x0f, wxLayout_LeftToRight, "English (Hong Kong SAR)","English (Hong Kong SAR)" },
{ wxLANGUAGE_ENGLISH_INDIA, "en-IN" , "en_IN" , "" , 0x09, 0x10, wxLayout_LeftToRight, "English (India)","English (India)" },
{ wxLANGUAGE_ENGLISH_INDONESIA, "en-ID" , "en_ID" , "" , 0x09, 0x0e, wxLayout_LeftToRight, "English (Indonesia)","English (Indonesia)" },
{ wxLANGUAGE_ENGLISH_ISLE_OF_MAN, "en-IM" , "en_IM" , "" , 0x00, 0x04, wxLayout_LeftToRight, "English (Isle of Man)","English (Isle of Man)" },
{ wxLANGUAGE_ENGLISH_ISRAEL, "en-IL" , "en_IL" , "" , 0x00, 0x04, wxLayout_LeftToRight, "English (Israel)","English (Israel)" },
{ wxLANGUAGE_ENGLISH_JAMAICA, "en-JM" , "en_JM" , "" , 0x09, 0x08, wxLayout_LeftToRight, "English (Jamaica)","English (Jamaica)" },
{ wxLANGUAGE_ENGLISH_JERSEY, "en-JE" , "en_JE" , "" , 0x00, 0x04, wxLayout_LeftToRight, "English (Jersey)","English (Jersey)" },
{ wxLANGUAGE_ENGLISH_KENYA, "en-KE" , "en_KE" , "" , 0x00, 0x04, wxLayout_LeftToRight, "English (Kenya)","English (Kenya)" },
{ wxLANGUAGE_ENGLISH_KIRIBATI, "en-KI" , "en_KI" , "" , 0x00, 0x04, wxLayout_LeftToRight, "English (Kiribati)","English (Kiribati)" },
{ wxLANGUAGE_ENGLISH_LESOTHO, "en-LS" , "en_LS" , "" , 0x00, 0x04, wxLayout_LeftToRight, "English (Lesotho)","English (Lesotho)" },
{ wxLANGUAGE_ENGLISH_LIBERIA, "en-LR" , "en_LR" , "" , 0x00, 0x04, wxLayout_LeftToRight, "English (Liberia)","English (Liberia)" },
{ wxLANGUAGE_ENGLISH_MACAO_SAR, "en-MO" , "en_MO" , "" , 0x00, 0x04, wxLayout_LeftToRight, "English (Macao SAR)","English (Macao SAR)" },
{ wxLANGUAGE_ENGLISH_MADAGASCAR, "en-MG" , "en_MG" , "" , 0x00, 0x04, wxLayout_LeftToRight, "English (Madagascar)","English (Madagascar)" },
{ wxLANGUAGE_ENGLISH_MALAWI, "en-MW" , "en_MW" , "" , 0x00, 0x04, wxLayout_LeftToRight, "English (Malawi)","English (Malawi)" },
{ wxLANGUAGE_ENGLISH_MALAYSIA, "en-MY" , "en_MY" , "" , 0x09, 0x11, wxLayout_LeftToRight, "English (Malaysia)","English (Malaysia)" },
{ wxLANGUAGE_ENGLISH_MALTA, "en-MT" , "en_MT" , "" , 0x00, 0x04, wxLayout_LeftToRight, "English (Malta)","English (Malta)" },
{ wxLANGUAGE_ENGLISH_MARSHALL_ISLANDS, "en-MH" , "en_MH" , "" , 0x00, 0x04, wxLayout_LeftToRight, "English (Marshall Islands)","English (Marshall Islands)" },
{ wxLANGUAGE_ENGLISH_MAURITIUS, "en-MU" , "en_MU" , "" , 0x00, 0x04, wxLayout_LeftToRight, "English (Mauritius)","English (Mauritius)" },
{ wxLANGUAGE_ENGLISH_MICRONESIA, "en-FM" , "en_FM" , "" , 0x00, 0x04, wxLayout_LeftToRight, "English (Micronesia)","English (Micronesia)" },
{ wxLANGUAGE_ENGLISH_MONTSERRAT, "en-MS" , "en_MS" , "" , 0x00, 0x04, wxLayout_LeftToRight, "English (Montserrat)","English (Montserrat)" },
{ wxLANGUAGE_ENGLISH_NAMIBIA, "en-NA" , "en_NA" , "" , 0x00, 0x04, wxLayout_LeftToRight, "English (Namibia)","English (Namibia)" },
{ wxLANGUAGE_ENGLISH_NAURU, "en-NR" , "en_NR" , "" , 0x00, 0x04, wxLayout_LeftToRight, "English (Nauru)","English (Nauru)" },
{ wxLANGUAGE_ENGLISH_NETHERLANDS, "en-NL" , "en_NL" , "" , 0x00, 0x04, wxLayout_LeftToRight, "English (Netherlands)","English (Netherlands)" },
{ wxLANGUAGE_ENGLISH_NEW_ZEALAND, "en-NZ" , "en_NZ" , "" , 0x09, 0x05, wxLayout_LeftToRight, "English (New Zealand)","English (New Zealand)" },
{ wxLANGUAGE_ENGLISH_NIGERIA, "en-NG" , "en_NG" , "" , 0x00, 0x04, wxLayout_LeftToRight, "English (Nigeria)","English (Nigeria)" },
{ wxLANGUAGE_ENGLISH_NIUE, "en-NU" , "en_NU" , "" , 0x00, 0x04, wxLayout_LeftToRight, "English (Niue)","English (Niue)" },
{ wxLANGUAGE_ENGLISH_NORFOLK_ISLAND, "en-NF" , "en_NF" , "" , 0x00, 0x04, wxLayout_LeftToRight, "English (Norfolk Island)","English (Norfolk Island)" },
{ wxLANGUAGE_ENGLISH_NORTHERN_MARIANA_ISLANDS, "en-MP" , "en_MP" , "" , 0x00, 0x04, wxLayout_LeftToRight, "English (Northern Mariana Islands)","English (Northern Mariana Islands)" },
{ wxLANGUAGE_ENGLISH_PAKISTAN, "en-PK" , "en_PK" , "" , 0x00, 0x04, wxLayout_LeftToRight, "English (Pakistan)","English (Pakistan)" },
{ wxLANGUAGE_ENGLISH_PALAU, "en-PW" , "en_PW" , "" , 0x00, 0x04, wxLayout_LeftToRight, "English (Palau)","English (Palau)" },
{ wxLANGUAGE_ENGLISH_PAPUA_NEW_GUINEA, "en-PG" , "en_PG" , "" , 0x00, 0x04, wxLayout_LeftToRight, "English (Papua New Guinea)","English (Papua New Guinea)" },
{ wxLANGUAGE_ENGLISH_PHILIPPINES, "en-PH" , "en_PH" , "" , 0x09, 0x0d, wxLayout_LeftToRight, "English (Philippines)","English (Philippines)" },
{ wxLANGUAGE_ENGLISH_PITCAIRN_ISLANDS, "en-PN" , "en_PN" , "" , 0x00, 0x04, wxLayout_LeftToRight, "English (Pitcairn Islands)","English (Pitcairn Islands)" },
{ wxLANGUAGE_ENGLISH_PUERTO_RICO, "en-PR" , "en_PR" , "" , 0x00, 0x04, wxLayout_LeftToRight, "English (Puerto Rico)","English (Puerto Rico)" },
{ wxLANGUAGE_ENGLISH_RWANDA, "en-RW" , "en_RW" , "" , 0x00, 0x04, wxLayout_LeftToRight, "English (Rwanda)","English (Rwanda)" },
{ wxLANGUAGE_ENGLISH_SAMOA, "en-WS" , "en_WS" , "" , 0x00, 0x04, wxLayout_LeftToRight, "English (Samoa)","English (Samoa)" },
{ wxLANGUAGE_ENGLISH_SEYCHELLES, "en-SC" , "en_SC" , "" , 0x00, 0x04, wxLayout_LeftToRight, "English (Seychelles)","English (Seychelles)" },
{ wxLANGUAGE_ENGLISH_SIERRA_LEONE, "en-SL" , "en_SL" , "" , 0x00, 0x04, wxLayout_LeftToRight, "English (Sierra Leone)","English (Sierra Leone)" },
{ wxLANGUAGE_ENGLISH_SINGAPORE, "en-SG" , "en_SG" , "" , 0x09, 0x12, wxLayout_LeftToRight, "English (Singapore)","English (Singapore)" },
{ wxLANGUAGE_ENGLISH_SINT_MAARTEN, "en-SX" , "en_SX" , "" , 0x00, 0x04, wxLayout_LeftToRight, "English (Sint Maarten)","English (Sint Maarten)" },
{ wxLANGUAGE_ENGLISH_SLOVENIA, "en-SI" , "en_SI" , "" , 0x00, 0x04, wxLayout_LeftToRight, "English (Slovenia)","English (Slovenia)" },
{ wxLANGUAGE_ENGLISH_SOLOMON_ISLANDS, "en-SB" , "en_SB" , "" , 0x00, 0x04, wxLayout_LeftToRight, "English (Solomon Islands)","English (Solomon Islands)" },
{ wxLANGUAGE_ENGLISH_SOUTH_AFRICA, "en-ZA" , "en_ZA" , "" , 0x09, 0x07, wxLayout_LeftToRight, "English (South Africa)","English (South Africa)" },
{ wxLANGUAGE_ENGLISH_SOUTH_SUDAN, "en-SS" , "en_SS" , "" , 0x00, 0x04, wxLayout_LeftToRight, "English (South Sudan)","English (South Sudan)" },
{ wxLANGUAGE_ENGLISH_ST_HELENA_ASCENSION_TRISTAN_DA_CUNHA, "en-SH" , "en_SH" , "" , 0x00, 0x04, wxLayout_LeftToRight, "English (St Helena, Ascension, Tristan da Cunha)","English (St Helena, Ascension, Tristan da Cunha)" },
{ wxLANGUAGE_ENGLISH_ST_KITTS_AND_NEVIS, "en-KN" , "en_KN" , "" , 0x00, 0x04, wxLayout_LeftToRight, "English (St. Kitts and Nevis)","English (St. Kitts & Nevis)" },
{ wxLANGUAGE_ENGLISH_ST_LUCIA, "en-LC" , "en_LC" , "" , 0x00, 0x04, wxLayout_LeftToRight, "English (St. Lucia)","English (St. Lucia)" },
{ wxLANGUAGE_ENGLISH_ST_VINCENT_AND_GRENADINES, "en-VC" , "en_VC" , "" , 0x00, 0x04, wxLayout_LeftToRight, "English (St. Vincent and Grenadines)","English (St. Vincent & Grenadines)" },
{ wxLANGUAGE_ENGLISH_SUDAN, "en-SD" , "en_SD" , "" , 0x00, 0x04, wxLayout_LeftToRight, "English (Sudan)","English (Sudan)" },
{ wxLANGUAGE_ENGLISH_SWEDEN, "en-SE" , "en_SE" , "" , 0x00, 0x04, wxLayout_LeftToRight, "English (Sweden)","English (Sweden)" },
{ wxLANGUAGE_ENGLISH_SWITZERLAND, "en-CH" , "en_CH" , "" , 0x00, 0x04, wxLayout_LeftToRight, "English (Switzerland)","English (Switzerland)" },
{ wxLANGUAGE_ENGLISH_TANZANIA, "en-TZ" , "en_TZ" , "" , 0x00, 0x04, wxLayout_LeftToRight, "English (Tanzania)","English (Tanzania)" },
{ wxLANGUAGE_ENGLISH_TOKELAU, "en-TK" , "en_TK" , "" , 0x00, 0x04, wxLayout_LeftToRight, "English (Tokelau)","English (Tokelau)" },
{ wxLANGUAGE_ENGLISH_TONGA, "en-TO" , "en_TO" , "" , 0x00, 0x04, wxLayout_LeftToRight, "English (Tonga)","English (Tonga)" },
{ wxLANGUAGE_ENGLISH_TRINIDAD, "en-TT" , "en_TT" , "" , 0x09, 0x0b, wxLayout_LeftToRight, "English (Trinidad and Tobago)","English (Trinidad & Tobago)" },
{ wxLANGUAGE_ENGLISH_TURKS_AND_CAICOS_ISLANDS, "en-TC" , "en_TC" , "" , 0x00, 0x04, wxLayout_LeftToRight, "English (Turks and Caicos Islands)","English (Turks & Caicos Islands)" },
{ wxLANGUAGE_ENGLISH_TUVALU, "en-TV" , "en_TV" , "" , 0x00, 0x04, wxLayout_LeftToRight, "English (Tuvalu)","English (Tuvalu)" },
{ wxLANGUAGE_ENGLISH_UGANDA, "en-UG" , "en_UG" , "" , 0x00, 0x04, wxLayout_LeftToRight, "English (Uganda)","English (Uganda)" },
{ wxLANGUAGE_ENGLISH_UK, "en-GB" , "en_GB" , "" , 0x09, 0x02, wxLayout_LeftToRight, "English (United Kingdom)","English (United Kingdom)" },
{ wxLANGUAGE_ENGLISH_UNITED_ARAB_EMIRATES, "en-AE" , "en_AE" , "" , 0x09, 0x13, wxLayout_LeftToRight, "English (United Arab Emirates)","English (United Arab Emirates)" },
{ wxLANGUAGE_ENGLISH_US, "en-US" , "en_US" , "" , 0x09, 0x01, wxLayout_LeftToRight, "English (United States)","English (United States)" },
{ wxLANGUAGE_ENGLISH_US_OUTLYING_ISLANDS, "en-UM" , "en_UM" , "" , 0x00, 0x04, wxLayout_LeftToRight, "English (U.S. Outlying Islands)","English (U.S. Outlying Islands)" },
{ wxLANGUAGE_ENGLISH_US_VIRGIN_ISLANDS, "en-VI" , "en_VI" , "" , 0x00, 0x04, wxLayout_LeftToRight, "English (U.S. Virgin Islands)","English (U.S. Virgin Islands)" },
{ wxLANGUAGE_ENGLISH_VANUATU, "en-VU" , "en_VU" , "" , 0x00, 0x04, wxLayout_LeftToRight, "English (Vanuatu)","English (Vanuatu)" },
{ wxLANGUAGE_ENGLISH_WORLD, "en-001" , "en_001" , "" , 0x00, 0x04, wxLayout_LeftToRight, "English (World)","English (World)" },
{ wxLANGUAGE_ENGLISH_ZAMBIA, "en-ZM" , "en_ZM" , "" , 0x00, 0x04, wxLayout_LeftToRight, "English (Zambia)","English (Zambia)" },
{ wxLANGUAGE_ENGLISH_ZIMBABWE, "en-ZW" , "en_ZW" , "" , 0x09, 0x0c, wxLayout_LeftToRight, "English (Zimbabwe)","English (Zimbabwe)" },
{ wxLANGUAGE_ESPERANTO, "eo" , "eo" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Esperanto","esperanto" },
{ wxLANGUAGE_ESPERANTO_WORLD, "eo-001" , "eo_001" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Esperanto (World)","esperanto (Mondo)" },
{ wxLANGUAGE_ESTONIAN, "et" , "et" , "et_EE" , 0x25, 0x01, wxLayout_LeftToRight, "Estonian","eesti" },
{ wxLANGUAGE_ESTONIAN_ESTONIA, "et-EE" , "et_EE" , "" , 0x25, 0x01, wxLayout_LeftToRight, "Estonian (Estonia)","eesti (Eesti)" },
{ wxLANGUAGE_EWE, "ee" , "ee" , "ee_GH" , 0x00, 0x04, wxLayout_LeftToRight, "Ewe","E\312\213egbe" },
{ wxLANGUAGE_EWE_GHANA, "ee-GH" , "ee_GH" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Ewe (Ghana)","E\312\213egbe (Ghana nutome)" },
{ wxLANGUAGE_EWE_TOGO, "ee-TG" , "ee_TG" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Ewe (Togo)","E\312\213egbe (Togo nutome)" },
{ wxLANGUAGE_EWONDO, "ewo" , "ewo" , "ewo_CM" , 0x00, 0x04, wxLayout_LeftToRight, "Ewondo","ewondo" },
{ wxLANGUAGE_EWONDO_CAMEROON, "ewo-CM" , "ewo_CM" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Ewondo (Cameroon)","ewondo (Kam\311\231r\303\272n)" },
{ wxLANGUAGE_FAEROESE, "fo" , "fo" , "fo_FO" , 0x38, 0x01, wxLayout_LeftToRight, "Faroese","f\303\270royskt" },
{ wxLANGUAGE_FAEROESE_DENMARK, "fo-DK" , "fo_DK" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Faroese (Denmark)","f\303\270royskt (Danmark)" },
{ wxLANGUAGE_FAEROESE_FAROE_ISLANDS, "fo-FO" , "fo_FO" , "" , 0x38, 0x01, wxLayout_LeftToRight, "Faroese (Faroe Islands)","f\303\270royskt (F\303\270royar)" },
{ wxLANGUAGE_FIJI, "fj" , "fj" , "" , 0 , 0 , wxLayout_LeftToRight, "Fiji","Na Vosa Vakaviti" },
{ wxLANGUAGE_FILIPINO, "fil" , "fil" , "fil_PH" , 0x64, 0x01, wxLayout_LeftToRight, "Filipino","Filipino" },
{ wxLANGUAGE_FILIPINO_PHILIPPINES, "fil-PH" , "fil_PH" , "" , 0x64, 0x01, wxLayout_LeftToRight, "Filipino (Philippines)","Filipino (Pilipinas)" },
{ wxLANGUAGE_FINNISH, "fi" , "fi" , "fi_FI" , 0x0b, 0x01, wxLayout_LeftToRight, "Finnish","suomi" },
{ wxLANGUAGE_FINNISH_FINLAND, "fi-FI" , "fi_FI" , "" , 0x0b, 0x01, wxLayout_LeftToRight, "Finnish (Finland)","suomi (Suomi)" },
{ wxLANGUAGE_FRENCH, "fr" , "fr" , "fr_FR" , 0x0c, 0x01, wxLayout_LeftToRight, "French","fran\303\247ais" },
{ wxLANGUAGE_FRENCH_ALGERIA, "fr-DZ" , "fr_DZ" , "" , 0x00, 0x04, wxLayout_LeftToRight, "French (Algeria)","fran\303\247ais (Alg\303\251rie)" },
{ wxLANGUAGE_FRENCH_BELGIAN, "fr-BE" , "fr_BE" , "" , 0x0c, 0x02, wxLayout_LeftToRight, "French (Belgium)","fran\303\247ais (Belgique)" },
{ wxLANGUAGE_FRENCH_BENIN, "fr-BJ" , "fr_BJ" , "" , 0x00, 0x04, wxLayout_LeftToRight, "French (Benin)","fran\303\247ais (B\303\251nin)" },
{ wxLANGUAGE_FRENCH_BURKINA_FASO, "fr-BF" , "fr_BF" , "" , 0x00, 0x04, wxLayout_LeftToRight, "French (Burkina Faso)","fran\303\247ais (Burkina Faso)" },
{ wxLANGUAGE_FRENCH_BURUNDI, "fr-BI" , "fr_BI" , "" , 0x00, 0x04, wxLayout_LeftToRight, "French (Burundi)","fran\303\247ais (Burundi)" },
{ wxLANGUAGE_FRENCH_CAMEROON, "fr-CM" , "fr_CM" , "" , 0x0c, 0x0b, wxLayout_LeftToRight, "French (Cameroon)","fran\303\247ais (Cameroun)" },
{ wxLANGUAGE_FRENCH_CANADIAN, "fr-CA" , "fr_CA" , "" , 0x0c, 0x03, wxLayout_LeftToRight, "French (Canada)","fran\303\247ais (Canada)" },
{ wxLANGUAGE_FRENCH_CARIBBEAN, "fr-029" , "fr_029" , "" , 0x0c, 0x07, wxLayout_LeftToRight, "French (Caribbean)","fran\303\247ais (Cara\303\257bes)" },
{ wxLANGUAGE_FRENCH_CENTRAL_AFRICAN_REPUBLIC, "fr-CF" , "fr_CF" , "" , 0x00, 0x04, wxLayout_LeftToRight, "French (Central African Republic)","fran\303\247ais (R\303\251publique centrafricaine)" },
{ wxLANGUAGE_FRENCH_CHAD, "fr-TD" , "fr_TD" , "" , 0x00, 0x04, wxLayout_LeftToRight, "French (Chad)","fran\303\247ais (Tchad)" },
{ wxLANGUAGE_FRENCH_COMOROS, "fr-KM" , "fr_KM" , "" , 0x00, 0x04, wxLayout_LeftToRight, "French (Comoros)","fran\303\247ais (Comores)" },
{ wxLANGUAGE_FRENCH_CONGO, "fr-CG" , "fr_CG" , "" , 0x00, 0x04, wxLayout_LeftToRight, "French (Congo)","fran\303\247ais (Congo)" },
{ wxLANGUAGE_FRENCH_CONGO_DRC, "fr-CD" , "fr_CD" , "" , 0x0c, 0x09, wxLayout_LeftToRight, "French Congo (DRC)","fran\303\247ais (Congo, R\303\251publique d\303\251mocratique du)" },
{ wxLANGUAGE_FRENCH_COTE_DIVOIRE, "fr-CI" , "fr_CI" , "" , 0x0c, 0x0c, wxLayout_LeftToRight, "French (C\303\264te d\342\200\231Ivoire)","fran\303\247ais (C\303\264te d\342\200\231Ivoire)" },
{ wxLANGUAGE_FRENCH_DJIBOUTI, "fr-DJ" , "fr_DJ" , "" , 0x00, 0x04, wxLayout_LeftToRight, "French (Djibouti)","fran\303\247ais (Djibouti)" },
{ wxLANGUAGE_FRENCH_EQUATORIAL_GUINEA, "fr-GQ" , "fr_GQ" , "" , 0x00, 0x04, wxLayout_LeftToRight, "French (Equatorial Guinea)","fran\303\247ais (Guin\303\251e \303\251quatoriale)" },
{ wxLANGUAGE_FRENCH_FRANCE, "fr-FR" , "fr_FR" , "" , 0x0c, 0x01, wxLayout_LeftToRight, "French (France)","fran\303\247ais (France)" },
{ wxLANGUAGE_FRENCH_FRENCH_GUIANA, "fr-GF" , "fr_GF" , "" , 0x00, 0x04, wxLayout_LeftToRight, "French (French Guiana)","fran\303\247ais (Guyane fran\303\247aise)" },
{ wxLANGUAGE_FRENCH_FRENCH_POLYNESIA, "fr-PF" , "fr_PF" , "" , 0x00, 0x04, wxLayout_LeftToRight, "French (French Polynesia)","fran\303\247ais (Polyn\303\251sie fran\303\247aise)" },
{ wxLANGUAGE_FRENCH_GABON, "fr-GA" , "fr_GA" , "" , 0x00, 0x04, wxLayout_LeftToRight, "French (Gabon)","fran\303\247ais (Gabon)" },
{ wxLANGUAGE_FRENCH_GUADELOUPE, "fr-GP" , "fr_GP" , "" , 0x00, 0x04, wxLayout_LeftToRight, "French (Guadeloupe)","fran\303\247ais (Guadeloupe)" },
{ wxLANGUAGE_FRENCH_GUINEA, "fr-GN" , "fr_GN" , "" , 0x00, 0x04, wxLayout_LeftToRight, "French (Guinea)","fran\303\247ais (Guin\303\251e)" },
{ wxLANGUAGE_FRENCH_HAITI, "fr-HT" , "fr_HT" , "" , 0x0c, 0x0f, wxLayout_LeftToRight, "French (Haiti)","fran\303\247ais (Ha\303\257ti)" },
{ wxLANGUAGE_FRENCH_LUXEMBOURG, "fr-LU" , "fr_LU" , "" , 0x0c, 0x05, wxLayout_LeftToRight, "French (Luxembourg)","fran\303\247ais (Luxembourg)" },
{ wxLANGUAGE_FRENCH_MADAGASCAR, "fr-MG" , "fr_MG" , "" , 0x00, 0x04, wxLayout_LeftToRight, "French (Madagascar)","fran\303\247ais (Madagascar)" },
{ wxLANGUAGE_FRENCH_MALI, "fr-ML" , "fr_ML" , "" , 0x0c, 0x0d, wxLayout_LeftToRight, "French (Mali)","fran\303\247ais (Mali)" },
{ wxLANGUAGE_FRENCH_MARTINIQUE, "fr-MQ" , "fr_MQ" , "" , 0x00, 0x04, wxLayout_LeftToRight, "French (Martinique)","fran\303\247ais (Martinique)" },
{ wxLANGUAGE_FRENCH_MAURITANIA, "fr-MR" , "fr_MR" , "" , 0x00, 0x04, wxLayout_LeftToRight, "French (Mauritania)","fran\303\247ais (Mauritanie)" },
{ wxLANGUAGE_FRENCH_MAURITIUS, "fr-MU" , "fr_MU" , "" , 0x00, 0x04, wxLayout_LeftToRight, "French (Mauritius)","fran\303\247ais (Maurice)" },
{ wxLANGUAGE_FRENCH_MAYOTTE, "fr-YT" , "fr_YT" , "" , 0x00, 0x04, wxLayout_LeftToRight, "French (Mayotte)","fran\303\247ais (Mayotte)" },
{ wxLANGUAGE_FRENCH_MONACO, "fr-MC" , "fr_MC" , "" , 0x0c, 0x06, wxLayout_LeftToRight, "French (Monaco)","fran\303\247ais (Monaco)" },
{ wxLANGUAGE_FRENCH_MOROCCO, "fr-MA" , "fr_MA" , "" , 0x0c, 0x0e, wxLayout_LeftToRight, "French (Morocco)","fran\303\247ais (Maroc)" },
{ wxLANGUAGE_FRENCH_NEW_CALEDONIA, "fr-NC" , "fr_NC" , "" , 0x00, 0x04, wxLayout_LeftToRight, "French (New Caledonia)","fran\303\247ais (Nouvelle-Cal\303\251donie)" },
{ wxLANGUAGE_FRENCH_NIGER, "fr-NE" , "fr_NE" , "" , 0x00, 0x04, wxLayout_LeftToRight, "French (Niger)","fran\303\247ais (Niger)" },
{ wxLANGUAGE_FRENCH_REUNION, "fr-RE" , "fr_RE" , "" , 0x0c, 0x08, wxLayout_LeftToRight, "French (R\303\251union)","fran\303\247ais (La R\303\251union)" },
{ wxLANGUAGE_FRENCH_RWANDA, "fr-RW" , "fr_RW" , "" , 0x00, 0x04, wxLayout_LeftToRight, "French (Rwanda)","fran\303\247ais (Rwanda)" },
{ wxLANGUAGE_FRENCH_SENEGAL, "fr-SN" , "fr_SN" , "" , 0x0c, 0x0a, wxLayout_LeftToRight, "French (Senegal)","fran\303\247ais (S\303\251n\303\251gal)" },
{ wxLANGUAGE_FRENCH_SEYCHELLES, "fr-SC" , "fr_SC" , "" , 0x00, 0x04, wxLayout_LeftToRight, "French (Seychelles)","fran\303\247ais (Seychelles)" },
{ wxLANGUAGE_FRENCH_ST_BARTHELEMY, "fr-BL" , "fr_BL" , "" , 0x00, 0x04, wxLayout_LeftToRight, "French (St. Barth\303\251lemy)","fran\303\247ais (Saint-Barth\303\251lemy)" },
{ wxLANGUAGE_FRENCH_ST_MARTIN, "fr-MF" , "fr_MF" , "" , 0x00, 0x04, wxLayout_LeftToRight, "French (St. Martin)","fran\303\247ais (Saint-Martin)" },
{ wxLANGUAGE_FRENCH_ST_PIERRE_AND_MIQUELON, "fr-PM" , "fr_PM" , "" , 0x00, 0x04, wxLayout_LeftToRight, "French (St. Pierre and Miquelon)","fran\303\247ais (Saint-Pierre-et-Miquelon)" },
{ wxLANGUAGE_FRENCH_SWISS, "fr-CH" , "fr_CH" , "" , 0x0c, 0x04, wxLayout_LeftToRight, "French (Switzerland)","fran\303\247ais (Suisse)" },
{ wxLANGUAGE_FRENCH_SYRIA, "fr-SY" , "fr_SY" , "" , 0x00, 0x04, wxLayout_LeftToRight, "French (Syria)","fran\303\247ais (Syrie)" },
{ wxLANGUAGE_FRENCH_TOGO, "fr-TG" , "fr_TG" , "" , 0x00, 0x04, wxLayout_LeftToRight, "French (Togo)","fran\303\247ais (Togo)" },
{ wxLANGUAGE_FRENCH_TUNISIA, "fr-TN" , "fr_TN" , "" , 0x00, 0x04, wxLayout_LeftToRight, "French (Tunisia)","fran\303\247ais (Tunisie)" },
{ wxLANGUAGE_FRENCH_VANUATU, "fr-VU" , "fr_VU" , "" , 0x00, 0x04, wxLayout_LeftToRight, "French (Vanuatu)","fran\303\247ais (Vanuatu)" },
{ wxLANGUAGE_FRENCH_WALLIS_AND_FUTUNA, "fr-WF" , "fr_WF" , "" , 0x00, 0x04, wxLayout_LeftToRight, "French (Wallis and Futuna)","fran\303\247ais (Wallis-et-Futuna)" },
{ wxLANGUAGE_FRISIAN, "fy" , "fy" , "fy_NL" , 0x62, 0x01, wxLayout_LeftToRight, "Western Frisian","Frysk" },
{ wxLANGUAGE_FRISIAN_NETHERLANDS, "fy-NL" , "fy_NL" , "" , 0x62, 0x01, wxLayout_LeftToRight, "Western Frisian (Netherlands)","Frysk (Nederl\303\242n)" },
{ wxLANGUAGE_FRIULIAN, "fur" , "fur" , "fur_IT" , 0x00, 0x04, wxLayout_LeftToRight, "Friulian","furlan" },
{ wxLANGUAGE_FRIULIAN_ITALY, "fur-IT" , "fur_IT" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Friulian (Italy)","furlan (Italie)" },
{ wxLANGUAGE_FULAH, "ff" , "ff" , "" , 0x67, 0x02, wxLayout_LeftToRight, "Fulah","Pulaar" },
{ wxLANGUAGE_FULAH_ADLAM, "ff-Adlm" , "ff@adlam" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Fulah (Adlam)","\360\236\244\206\360\236\244\265\360\236\244\244\360\236\244\242\360\236\244\252 (\360\236\244\200\360\236\244\201\360\236\244\202\360\236\244\242\360\236\244\203)" },
{ wxLANGUAGE_FULAH_ADLAM_BURKINA_FASO, "ff-Adlm-BF" , "ff_BF@adlam" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Fulah (Adlam, Burkina Faso)","\360\236\244\206\360\236\244\265\360\236\244\244\360\236\244\242\360\236\244\252 (\360\236\244\204\360\236\244\265\360\236\244\252\360\236\244\263\360\236\244\255\360\236\244\262\360\236\244\242 \360\236\244\212\360\236\244\242\360\236\244\247\360\236\244\256\360\236\245\205)" },
{ wxLANGUAGE_FULAH_ADLAM_CAMEROON, "ff-Adlm-CM" , "ff_CM@adlam" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Fulah (Adlam, Cameroon)","\360\236\244\206\360\236\244\265\360\236\244\244\360\236\244\242\360\236\244\252 (\360\236\244\221\360\236\244\242\360\236\244\245\360\236\244\242\360\236\244\252\360\236\244\265\360\236\245\205\360\236\244\262)" },
{ wxLANGUAGE_FULAH_ADLAM_GAMBIA, "ff-Adlm-GM" , "ff_GM@adlam" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Fulah (Adlam, Gambia)","\360\236\244\206\360\236\244\265\360\236\244\244\360\236\244\242\360\236\244\252 (\360\236\244\230\360\236\244\242\360\236\244\245\360\236\244\246\360\236\244\255\360\236\244\264\360\236\244\242)" },
{ wxLANGUAGE_FULAH_ADLAM_GHANA, "ff-Adlm-GH" , "ff_GH@adlam" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Fulah (Adlam, Ghana)","\360\236\244\206\360\236\244\265\360\236\244\244\360\236\244\242\360\236\244\252 (\360\236\244\230\360\236\244\242\360\236\244\262\360\236\244\242)" },
{ wxLANGUAGE_FULAH_ADLAM_GUINEA, "ff-Adlm-GN" , "ff_GN@adlam" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Fulah (Adlam, Guinea)","\360\236\244\206\360\236\244\265\360\236\244\244\360\236\244\242\360\236\244\252 (\360\236\244\230\360\236\244\255\360\236\244\262\360\236\244\253)" },
{ wxLANGUAGE_FULAH_ADLAM_GUINEA_BISSAU, "ff-Adlm-GW" , "ff_GW@adlam" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Fulah (Adlam, Guinea-Bissau)","\360\236\244\206\360\236\244\265\360\236\244\244\360\236\244\242\360\236\244\252 (\360\236\244\230\360\236\244\255\360\236\244\262\360\236\244\253-\360\236\244\204\360\236\244\255\360\236\244\247\360\236\244\242\360\236\244\261\360\236\244\256\360\236\245\205)" },
{ wxLANGUAGE_FULAH_ADLAM_LIBERIA, "ff-Adlm-LR" , "ff_LR@adlam" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Fulah (Adlam, Liberia)","\360\236\244\206\360\236\244\265\360\236\244\244\360\236\244\242\360\236\244\252 (\360\236\244\202\360\236\244\242\360\236\244\246\360\236\244\255\360\236\244\252\360\236\244\255\360\236\244\264\360\236\244\242\360\236\245\204)" },
{ wxLANGUAGE_FULAH_ADLAM_MAURITANIA, "ff-Adlm-MR" , "ff_MR@adlam" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Fulah (Adlam, Mauritania)","\360\236\244\206\360\236\244\265\360\236\244\244\360\236\244\242\360\236\244\252 (\360\236\244\203\360\236\244\256\360\236\244\252\360\236\244\274\360\236\244\242\360\236\244\262\360\236\244\255\360\236\245\205)" },
{ wxLANGUAGE_FULAH_ADLAM_NIGER, "ff-Adlm-NE" , "ff_NE@adlam" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Fulah (Adlam, Niger)","\360\236\244\206\360\236\244\265\360\236\244\244\360\236\244\242\360\236\244\252 (\360\236\244\220\360\236\244\255\360\236\245\205\360\236\244\266\360\236\244\253\360\236\244\252)" },
{ wxLANGUAGE_FULAH_ADLAM_NIGERIA, "ff-Adlm-NG" , "ff_NG@adlam" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Fulah (Adlam, Nigeria)","\360\236\244\206\360\236\244\265\360\236\244\244\360\236\244\242\360\236\244\252 (\360\236\244\220\360\236\244\242\360\236\244\266\360\236\244\253\360\236\244\252\360\236\244\255\360\236\244\264\360\236\244\242\360\236\245\204)" },
{ wxLANGUAGE_FULAH_ADLAM_SENEGAL, "ff-Adlm-SN" , "ff_SN@adlam" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Fulah (Adlam, Senegal)","\360\236\244\206\360\236\244\265\360\236\244\244\360\236\244\242\360\236\244\252 (\360\236\244\205\360\236\244\253\360\236\244\262\360\236\244\253\360\236\244\272\360\236\244\242\360\236\245\204\360\236\244\244)" },
{ wxLANGUAGE_FULAH_ADLAM_SIERRA_LEONE, "ff-Adlm-SL" , "ff_SL@adlam" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Fulah (Adlam, Sierra Leone)","\360\236\244\206\360\236\244\265\360\236\244\244\360\236\244\242\360\236\244\252 (\360\236\244\205\360\236\244\242\360\236\244\252\360\236\244\242\360\236\244\244\360\236\244\256\360\236\244\262)" },
{ wxLANGUAGE_FULAH_LATIN, "ff-Latn" , "ff@latin" , "" , 0x67, 0x02, wxLayout_LeftToRight, "Fulah (Latin)","Pulaar" },
{ wxLANGUAGE_FULAH_LATIN_BURKINA_FASO, "ff-Latn-BF" , "ff_BF@latin" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Fulah (Latin, Burkina Faso)","Pulaar (Burkibaa Faaso)" },
{ wxLANGUAGE_FULAH_LATIN_CAMEROON, "ff-Latn-CM" , "ff_CM@latin" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Fulah (Latin, Cameroon)","Pulaar (Kameruun)" },
{ wxLANGUAGE_FULAH_LATIN_GAMBIA, "ff-Latn-GM" , "ff_GM@latin" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Fulah (Latin, Gambia)","Pulaar (Gammbi)" },
{ wxLANGUAGE_FULAH_LATIN_GHANA, "ff-Latn-GH" , "ff_GH@latin" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Fulah (Latin, Ghana)","Pulaar (Ganaa)" },
{ wxLANGUAGE_FULAH_LATIN_GUINEA, "ff-Latn-GN" , "ff_GN@latin" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Fulah (Latin, Guinea)","Pulaar (Gine)" },
{ wxLANGUAGE_FULAH_LATIN_GUINEA_BISSAU, "ff-Latn-GW" , "ff_GW@latin" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Fulah (Latin, Guinea-Bissau)","Pulaar (Gine-Bisaawo)" },
{ wxLANGUAGE_FULAH_LATIN_LIBERIA, "ff-Latn-LR" , "ff_LR@latin" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Fulah (Latin, Liberia)","Pulaar (Liberiyaa)" },
{ wxLANGUAGE_FULAH_LATIN_MAURITANIA, "ff-Latn-MR" , "ff_MR@latin" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Fulah (Latin, Mauritania)","Pulaar (Muritani)" },
{ wxLANGUAGE_FULAH_LATIN_NIGER, "ff-Latn-NE" , "ff_NE@latin" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Fulah (Latin, Niger)","Pulaar (Nijeer)" },
{ wxLANGUAGE_FULAH_LATIN_NIGERIA, "ff-Latn-NG" , "ff_NG@latin" , "" , 0x67, 0x01, wxLayout_LeftToRight, "Fulah (Latin, Nigeria)","Pulaar (Nijeriyaa)" },
{ wxLANGUAGE_FULAH_LATIN_SENEGAL, "ff-Latn-SN" , "ff_SN@latin" , "" , 0x67, 0x02, wxLayout_LeftToRight, "Fulah (Latin, Senegal)","Pulaar (Senegaal)" },
{ wxLANGUAGE_FULAH_LATIN_SIERRA_LEONE, "ff-Latn-SL" , "ff_SL@latin" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Fulah (Latin, Sierra Leone)","Pulaar (Seraa liyon)" },
{ wxLANGUAGE_GALICIAN, "gl" , "gl" , "gl_ES" , 0x56, 0x01, wxLayout_LeftToRight, "Galician","galego" },
{ wxLANGUAGE_GALICIAN_SPAIN, "gl-ES" , "gl_ES" , "" , 0x56, 0x01, wxLayout_LeftToRight, "Galician (Galician)","galego (galego)" },
{ wxLANGUAGE_GANDA, "lg" , "lg" , "lg_UG" , 0x00, 0x04, wxLayout_LeftToRight, "Ganda","Luganda" },
{ wxLANGUAGE_GANDA_UGANDA, "lg-UG" , "lg_UG" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Ganda (Uganda)","Luganda (Yuganda)" },
{ wxLANGUAGE_GEORGIAN, "ka" , "ka" , "ka_GE" , 0x37, 0x01, wxLayout_LeftToRight, "Georgian","\341\203\245\341\203\220\341\203\240\341\203\227\341\203\243\341\203\232\341\203\230" },
{ wxLANGUAGE_GEORGIAN_GEORGIA, "ka-GE" , "ka_GE" , "" , 0x37, 0x01, wxLayout_LeftToRight, "Georgian (Georgia)","\341\203\245\341\203\220\341\203\240\341\203\227\341\203\243\341\203\232\341\203\230 (\341\203\241\341\203\220\341\203\245\341\203\220\341\203\240\341\203\227\341\203\225\341\203\224\341\203\232\341\203\235)" },
{ wxLANGUAGE_GERMAN, "de" , "de" , "de_DE" , 0x07, 0x01, wxLayout_LeftToRight, "German","Deutsch" },
{ wxLANGUAGE_GERMAN_AUSTRIAN, "de-AT" , "de_AT" , "" , 0x07, 0x03, wxLayout_LeftToRight, "German (Austria)","Deutsch (\303\226sterreich)" },
{ wxLANGUAGE_GERMAN_BELGIUM, "de-BE" , "de_BE" , "" , 0x00, 0x04, wxLayout_LeftToRight, "German (Belgium)","Deutsch (Belgien)" },
{ wxLANGUAGE_GERMAN_GERMANY, "de-DE" , "de_DE" , "" , 0x07, 0x01, wxLayout_LeftToRight, "German (Germany)","Deutsch (Deutschland)" },
{ wxLANGUAGE_GERMAN_ITALY, "de-IT" , "de_IT" , "" , 0x00, 0x04, wxLayout_LeftToRight, "German (Italy)","Deutsch (Italien)" },
{ wxLANGUAGE_GERMAN_LIECHTENSTEIN, "de-LI" , "de_LI" , "" , 0x07, 0x05, wxLayout_LeftToRight, "German (Liechtenstein)","Deutsch (Liechtenstein)" },
{ wxLANGUAGE_GERMAN_LUXEMBOURG, "de-LU" , "de_LU" , "" , 0x07, 0x04, wxLayout_LeftToRight, "German (Luxembourg)","Deutsch (Luxemburg)" },
{ wxLANGUAGE_GERMAN_SWISS, "de-CH" , "de_CH" , "" , 0x07, 0x02, wxLayout_LeftToRight, "German (Switzerland)","Deutsch (Schweiz)" },
{ wxLANGUAGE_GREEK, "el" , "el" , "el_GR" , 0x08, 0x01, wxLayout_LeftToRight, "Greek","\316\225\316\273\316\273\316\267\316\275\316\271\316\272\316\254" },
{ wxLANGUAGE_GREEK_CYPRUS, "el-CY" , "el_CY" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Greek (Cyprus)","\316\225\316\273\316\273\316\267\316\275\316\271\316\272\316\254 (\316\232\317\215\317\200\317\201\316\277\317\202)" },
{ wxLANGUAGE_GREEK_GREECE, "el-GR" , "el_GR" , "" , 0x08, 0x01, wxLayout_LeftToRight, "Greek (Greece)","\316\225\316\273\316\273\316\267\316\275\316\271\316\272\316\254 (\316\225\316\273\316\273\316\254\316\264\316\261)" },
{ wxLANGUAGE_GUARANI, "gn" , "gn" , "gn_PY" , 0x74, 0x01, wxLayout_LeftToRight, "Guarani","Ava\303\261e\342\200\231\341\272\275" },
{ wxLANGUAGE_GUARANI_PARAGUAY, "gn-PY" , "gn_PY" , "" , 0x74, 0x01, wxLayout_LeftToRight, "Guarani (Paraguay)","Ava\303\261e\342\200\231\341\272\275 (Paragu\303\241i)" },
{ wxLANGUAGE_GUJARATI, "gu" , "gu" , "gu_IN" , 0x47, 0x01, wxLayout_LeftToRight, "Gujarati","\340\252\227\340\253\201\340\252\234\340\252\260\340\252\276\340\252\244\340\253\200" },
{ wxLANGUAGE_GUJARATI_INDIA, "gu-IN" , "gu_IN" , "" , 0x47, 0x01, wxLayout_LeftToRight, "Gujarati (India)","\340\252\227\340\253\201\340\252\234\340\252\260\340\252\276\340\252\244\340\253\200 (\340\252\255\340\252\276\340\252\260\340\252\244)" },
{ wxLANGUAGE_GUSII, "guz" , "guz" , "guz_KE" , 0x00, 0x04, wxLayout_LeftToRight, "Gusii","Ekegusii" },
{ wxLANGUAGE_GUSII_KENYA, "guz-KE" , "guz_KE" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Gusii (Kenya)","Ekegusii (Kenya)" },
{ wxLANGUAGE_HAUSA, "ha" , "ha" , "" , 0x68, 0x01, wxLayout_LeftToRight, "Hausa","Hausa" },
{ wxLANGUAGE_HAUSA_LATIN, "ha-Latn" , "ha@latin" , "" , 0x68, 0x01, wxLayout_LeftToRight, "Hausa (Latin)","Hausa (Latin)" },
{ wxLANGUAGE_HAUSA_LATIN_GHANA, "ha-Latn-GH" , "ha_GH@latin" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Hausa (Latin, Ghana)","Hausa (Gana)" },
{ wxLANGUAGE_HAUSA_LATIN_NIGER, "ha-Latn-NE" , "ha_NE@latin" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Hausa (Latin, Niger)","Hausa (Nijar)" },
{ wxLANGUAGE_HAUSA_LATIN_NIGERIA, "ha-Latn-NG" , "ha_NG@latin" , "" , 0x68, 0x01, wxLayout_LeftToRight, "Hausa (Latin, Nigeria)","Hausa (Najeriya)" },
{ wxLANGUAGE_HAWAIIAN, "haw" , "haw" , "haw_US" , 0x75, 0x01, wxLayout_LeftToRight, "Hawaiian","\312\273\305\214lelo Hawai\312\273i" },
{ wxLANGUAGE_HAWAIIAN_US, "haw-US" , "haw_US" , "" , 0x75, 0x01, wxLayout_LeftToRight, "Hawaiian (United States)","\312\273\305\214lelo Hawai\312\273i (\312\273Amelika Hui P\305\253 \312\273Ia)" },
{ wxLANGUAGE_HEBREW, "he" , "he" , "he_IL" , 0x0d, 0x01, wxLayout_RightToLeft, "Hebrew","\327\242\327\221\327\250\327\231\327\252" },
{ wxLANGUAGE_HEBREW_ISRAEL, "he-IL" , "he_IL" , "" , 0x0d, 0x01, wxLayout_RightToLeft, "Hebrew (Israel)","\327\242\327\221\327\250\327\231\327\252 (\327\231\327\251\327\250\327\220\327\234)" },
{ wxLANGUAGE_HINDI, "hi" , "hi" , "hi_IN" , 0x39, 0x01, wxLayout_LeftToRight, "Hindi","\340\244\271\340\244\277\340\244\250\340\245\215\340\244\246\340\245\200" },
{ wxLANGUAGE_HINDI_INDIA, "hi-IN" , "hi_IN" , "" , 0x39, 0x01, wxLayout_LeftToRight, "Hindi (India)","\340\244\271\340\244\277\340\244\250\340\245\215\340\244\246\340\245\200 (\340\244\255\340\244\276\340\244\260\340\244\244)" },
{ wxLANGUAGE_HUNGARIAN, "hu" , "hu" , "hu_HU" , 0x0e, 0x01, wxLayout_LeftToRight, "Hungarian","magyar" },
{ wxLANGUAGE_HUNGARIAN_HUNGARY, "hu-HU" , "hu_HU" , "" , 0x0e, 0x01, wxLayout_LeftToRight, "Hungarian (Hungary)","magyar (Magyarorsz\303\241g)" },
{ wxLANGUAGE_IBIBIO, "ibb" , "ibb" , "ibb_NG" , 0x69, 0x01, wxLayout_LeftToRight, "Ibibio","Ibibio-Efik" },
{ wxLANGUAGE_IBIBIO_NIGERIA, "ibb-NG" , "ibb_NG" , "" , 0x69, 0x01, wxLayout_LeftToRight, "Ibibio (Nigeria)","Ibibio-Efik (Nigeria)" },
{ wxLANGUAGE_ICELANDIC, "is" , "is" , "is_IS" , 0x0f, 0x01, wxLayout_LeftToRight, "Icelandic","\303\255slenska" },
{ wxLANGUAGE_ICELANDIC_ICELAND, "is-IS" , "is_IS" , "" , 0x0f, 0x01, wxLayout_LeftToRight, "Icelandic (Iceland)","\303\255slenska (\303\215sland)" },
{ wxLANGUAGE_IGBO, "ig" , "ig" , "ig_NG" , 0x70, 0x01, wxLayout_LeftToRight, "Igbo","Igbo" },
{ wxLANGUAGE_IGBO_NIGERIA, "ig-NG" , "ig_NG" , "" , 0x70, 0x01, wxLayout_LeftToRight, "Igbo (Nigeria)","Igbo (Na\341\273\213j\341\273\213r\341\273\213a)" },
{ wxLANGUAGE_INDONESIAN, "id" , "id" , "id_ID" , 0x21, 0x01, wxLayout_LeftToRight, "Indonesian","Indonesia" },
{ wxLANGUAGE_INDONESIAN_INDONESIA, "id-ID" , "id_ID" , "" , 0x21, 0x01, wxLayout_LeftToRight, "Indonesian (Indonesia)","Indonesia (Indonesia)" },
{ wxLANGUAGE_INTERLINGUA, "ia" , "ia" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Interlingua","interlingua" },
{ wxLANGUAGE_INTERLINGUA_WORLD, "ia-001" , "ia_001" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Interlingua (World)","interlingua (Mundo)" },
{ wxLANGUAGE_INTERLINGUE, "ie" , "ie" , "" , 0 , 0 , wxLayout_LeftToRight, "Interlingue","Interlingue" },
{ wxLANGUAGE_INUKTITUT, "iu" , "iu" , "" , 0x5d, 0x02, wxLayout_LeftToRight, "Inuktitut","Inuktitut" },
{ wxLANGUAGE_INUKTITUT_LATIN, "iu-Latn" , "iu@latin" , "" , 0x5d, 0x02, wxLayout_LeftToRight, "Inuktitut (Latin)","Inuktitut (Qaliujaaqpait)" },
{ wxLANGUAGE_INUKTITUT_LATIN_CANADA, "iu-Latn-CA" , "iu_CA@latin" , "" , 0x5d, 0x02, wxLayout_LeftToRight, "Inuktitut (Latin, Canada)","Inuktitut (Kanatami)" },
{ wxLANGUAGE_INUKTITUT_SYLLABICS, "iu-Cans" , "iu@canadian_aboriginal" , "" , 0x5d, 0x01, wxLayout_LeftToRight, "Inuktitut (Syllabics)","\341\220\203\341\223\204\341\222\203\341\221\216\341\221\220\341\221\246 (\341\226\203\341\223\202\341\220\205\341\224\256\341\226\205\341\220\270\341\220\203\341\221\246)" },
{ wxLANGUAGE_INUKTITUT_SYLLABICS_CANADA, "iu-Cans-CA" , "iu_CA@canadian_aboriginal" , "" , 0x5d, 0x01, wxLayout_LeftToRight, "Inuktitut (Syllabics, Canada)","\341\220\203\341\223\204\341\222\203\341\221\216\341\221\220\341\221\246 (\341\221\262\341\223\207\341\221\225\341\222\245)" },
{ wxLANGUAGE_INUPIAK, "ik" , "ik" , "" , 0 , 0 , wxLayout_LeftToRight, "Inupiak","Inupiaq" },
{ wxLANGUAGE_IRISH, "ga" , "ga" , "ga_IE" , 0x3c, 0x02, wxLayout_LeftToRight, "Irish","Gaeilge" },
{ wxLANGUAGE_IRISH_IRELAND, "ga-IE" , "ga_IE" , "" , 0x3c, 0x02, wxLayout_LeftToRight, "Irish (Ireland)","Gaeilge (\303\211ire)" },
{ wxLANGUAGE_IRISH_UNITED_KINGDOM, "ga-GB" , "ga_GB" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Irish (United Kingdom)","Gaeilge (an R\303\255ocht Aontaithe)" },
{ wxLANGUAGE_ITALIAN, "it" , "it" , "it_IT" , 0x10, 0x01, wxLayout_LeftToRight, "Italian","italiano" },
{ wxLANGUAGE_ITALIAN_ITALY, "it-IT" , "it_IT" , "" , 0x10, 0x01, wxLayout_LeftToRight, "Italian (Italy)","italiano (Italia)" },
{ wxLANGUAGE_ITALIAN_SAN_MARINO, "it-SM" , "it_SM" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Italian (San Marino)","italiano (San Marino)" },
{ wxLANGUAGE_ITALIAN_SWISS, "it-CH" , "it_CH" , "" , 0x10, 0x02, wxLayout_LeftToRight, "Italian (Switzerland)","italiano (Svizzera)" },
{ wxLANGUAGE_ITALIAN_VATICAN_CITY, "it-VA" , "it_VA" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Italian (Vatican City)","italiano (Citt\303\240 del Vaticano)" },
{ wxLANGUAGE_JAPANESE, "ja" , "ja" , "ja_JP" , 0x11, 0x01, wxLayout_LeftToRight, "Japanese","\346\227\245\346\234\254\350\252\236" },
{ wxLANGUAGE_JAPANESE_JAPAN, "ja-JP" , "ja_JP" , "" , 0x11, 0x01, wxLayout_LeftToRight, "Japanese (Japan)","\346\227\245\346\234\254\350\252\236 (\346\227\245\346\234\254)" },
{ wxLANGUAGE_JAVANESE, "jv" , "jv" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Javanese","Basa Jawa" },
{ wxLANGUAGE_JAVANESE_JAVANESE, "jv-Java" , "jv@javanese" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Javanese (Javanese)","\352\246\247\352\246\261\352\246\227\352\246\256" },
{ wxLANGUAGE_JAVANESE_JAVANESE_INDONESIA, "jv-Java-ID" , "jv_ID@javanese" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Javanese (Javanese, Indonesia)","\352\246\247\352\246\261\352\246\227\352\246\256 (Indon\303\251sia)" },
{ wxLANGUAGE_JAVANESE_LATIN, "jv-Latn" , "jv@latin" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Javanese","Basa Jawa" },
{ wxLANGUAGE_JAVANESE_LATIN_INDONESIA, "jv-Latn-ID" , "jv_ID@latin" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Javanese (Indonesia)","Basa Jawa (Indonesia)" },
{ wxLANGUAGE_JOLA_FONYI, "dyo" , "dyo" , "dyo_SN" , 0x00, 0x04, wxLayout_LeftToRight, "Jola-Fonyi","joola" },
{ wxLANGUAGE_JOLA_FONYI_SENEGAL, "dyo-SN" , "dyo_SN" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Jola-Fonyi (Senegal)","joola (Senegal)" },
{ wxLANGUAGE_KABUVERDIANU, "kea" , "kea" , "kea_CV" , 0x00, 0x04, wxLayout_LeftToRight, "Kabuverdianu","kabuverdianu" },
{ wxLANGUAGE_KABUVERDIANU_CABO_VERDE, "kea-CV" , "kea_CV" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Kabuverdianu (Cabo Verde)","kabuverdianu (Kabu Verdi)" },
{ wxLANGUAGE_KABYLE, "kab" , "kab" , "kab_DZ" , 0x00, 0x04, wxLayout_LeftToRight, "Kabyle","Taqbaylit" },
{ wxLANGUAGE_KABYLE_ALGERIA, "kab-DZ" , "kab_DZ" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Kabyle (Algeria)","Taqbaylit (Lezzayer)" },
{ wxLANGUAGE_KAKO, "kkj" , "kkj" , "kkj_CM" , 0x00, 0x04, wxLayout_LeftToRight, "Kako","kak\311\224" },
{ wxLANGUAGE_KAKO_CAMEROON, "kkj-CM" , "kkj_CM" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Kako (Cameroon)","kak\311\224 (Kam\311\233run)" },
{ wxLANGUAGE_KALAALLISUT, "kl" , "kl" , "kl_GL" , 0x6f, 0x01, wxLayout_LeftToRight, "Kalaallisut","kalaallisut" },
{ wxLANGUAGE_KALAALLISUT_GREENLAND, "kl-GL" , "kl_GL" , "" , 0x6f, 0x01, wxLayout_LeftToRight, "Kalaallisut (Greenland)","kalaallisut (Kalaallit Nunaat)" },
{ wxLANGUAGE_KALENJIN, "kln" , "kln" , "kln_KE" , 0x00, 0x04, wxLayout_LeftToRight, "Kalenjin","Kalenjin" },
{ wxLANGUAGE_KALENJIN_KENYA, "kln-KE" , "kln_KE" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Kalenjin (Kenya)","Kalenjin (Emetab Kenya)" },
{ wxLANGUAGE_KAMBA, "kam" , "kam" , "kam_KE" , 0x00, 0x04, wxLayout_LeftToRight, "Kamba","Kikamba" },
{ wxLANGUAGE_KAMBA_KENYA, "kam-KE" , "kam_KE" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Kamba (Kenya)","Kikamba (Kenya)" },
{ wxLANGUAGE_KANNADA, "kn" , "kn" , "kn_IN" , 0x4b, 0x01, wxLayout_LeftToRight, "Kannada","\340\262\225\340\262\250\340\263\215\340\262\250\340\262\241" },
{ wxLANGUAGE_KANNADA_INDIA, "kn-IN" , "kn_IN" , "" , 0x4b, 0x01, wxLayout_LeftToRight, "Kannada (India)","\340\262\225\340\262\250\340\263\215\340\262\250\340\262\241 (\340\262\255\340\262\276\340\262\260\340\262\244)" },
{ wxLANGUAGE_KANURI, "kr" , "kr" , "" , 0x71, 0x01, wxLayout_LeftToRight, "Kanuri","Kanuri" },
{ wxLANGUAGE_KANURI_LATIN, "kr-Latn" , "kr@latin" , "" , 0x71, 0x01, wxLayout_LeftToRight, "Kanuri (Latin)","Kanuri" },
{ wxLANGUAGE_KANURI_LATIN_NIGERIA, "kr-Latn-NG" , "kr_NG@latin" , "" , 0x71, 0x01, wxLayout_LeftToRight, "Kanuri (Latin, Nigeria)","Kanuri (Nigeria)" },
{ wxLANGUAGE_KASHMIRI, "ks" , "ks" , "ks_IN" , 0x00, 0x04, wxLayout_RightToLeft, "Kashmiri","\332\251\331\262\330\264\331\217\330\261" },
{ wxLANGUAGE_KASHMIRI_ARABIC, "ks-Arab" , "ks@arabic" , "" , 0x00, 0x04, wxLayout_RightToLeft, "Kashmiri (Arabic)","\332\251\331\262\330\264\331\217\330\261 (\330\247\331\216\330\261\330\250\333\214)" },
{ wxLANGUAGE_KASHMIRI_ARABIC_INDIA, "ks-Arab-IN" , "ks_IN@arabic" , "" , 0x00, 0x04, wxLayout_RightToLeft, "Kashmiri (Arabic)","\332\251\331\262\330\264\331\217\330\261 (\330\247\331\216\330\261\330\250\333\214)" },
{ wxLANGUAGE_KASHMIRI_DEVANAGARI, "ks-Deva" , "ks@devanagari" , "" , 0x60, 0x02, wxLayout_LeftToRight, "Kashmiri (Devanagari)","\340\244\225\340\245\211\340\244\266\340\245\201\340\244\260" },
{ wxLANGUAGE_KASHMIRI_DEVANAGARI_INDIA, "ks-Deva-IN" , "ks_IN@devanagari" , "" , 0x60, 0x02, wxLayout_LeftToRight, "Kashmiri (Devanagari)","\340\244\225\340\245\211\340\244\266\340\245\201\340\244\260 (India)" },
{ wxLANGUAGE_KASHMIRI_INDIA, "ks-IN" , "ks_IN" , "" , 0x00, 0x04, wxLayout_RightToLeft, "Kashmiri (India)","\332\251\330\264\331\210\330\261 (\330\250\332\276\330\247\330\261\330\252)" },
{ wxLANGUAGE_KAZAKH, "kk" , "kk" , "kk_KZ" , 0x3f, 0x01, wxLayout_LeftToRight, "Kazakh","\322\233\320\260\320\267\320\260\322\233 \321\202\321\226\320\273\321\226" },
{ wxLANGUAGE_KAZAKH_KAZAKHSTAN, "kk-KZ" , "kk_KZ" , "" , 0x3f, 0x01, wxLayout_LeftToRight, "Kazakh (Kazakhstan)","\322\233\320\260\320\267\320\260\322\233 \321\202\321\226\320\273\321\226 (\322\232\320\260\320\267\320\260\322\233\321\201\321\202\320\260\320\275)" },
{ wxLANGUAGE_KHMER, "km" , "km" , "km_KH" , 0x53, 0x01, wxLayout_LeftToRight, "Khmer","\341\236\201\341\237\222\341\236\230\341\237\202\341\236\232" },
{ wxLANGUAGE_KHMER_CAMBODIA, "km-KH" , "km_KH" , "" , 0x53, 0x01, wxLayout_LeftToRight, "Khmer (Cambodia)","\341\236\201\341\237\222\341\236\230\341\237\202\341\236\232 (\341\236\200\341\236\230\341\237\222\341\236\226\341\236\273\341\236\207\341\236\266)" },
{ wxLANGUAGE_KICHE, "quc" , "quc" , "" , 0x86, 0x01, wxLayout_LeftToRight, "K\312\274iche\312\274","K\312\274iche\312\274" },
{ wxLANGUAGE_KICHE_LATIN, "quc-Latn" , "quc@latin" , "" , 0x86, 0x01, wxLayout_LeftToRight, "K\312\274iche\312\274 (Latin)","K\312\274iche\312\274" },
{ wxLANGUAGE_KICHE_LATIN_GUATEMALA, "quc-Latn-GT" , "quc_GT@latin" , "" , 0x86, 0x01, wxLayout_LeftToRight, "K\312\274iche\312\274 (Latin, Guatemala)","K\312\274iche\312\274 (Guatemala)" },
{ wxLANGUAGE_KIKUYU, "ki" , "ki" , "ki_KE" , 0x00, 0x04, wxLayout_LeftToRight, "Kikuyu","Gikuyu" },
{ wxLANGUAGE_KIKUYU_KENYA, "ki-KE" , "ki_KE" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Kikuyu (Kenya)","Gikuyu (Kenya)" },
{ wxLANGUAGE_KINYARWANDA, "rw" , "rw" , "rw_RW" , 0x87, 0x01, wxLayout_LeftToRight, "Kinyarwanda","Kinyarwanda" },
{ wxLANGUAGE_KINYARWANDA_RWANDA, "rw-RW" , "rw_RW" , "" , 0x87, 0x01, wxLayout_LeftToRight, "Kinyarwanda (Rwanda)","Kinyarwanda (U Rwanda)" },
{ wxLANGUAGE_KIRGHIZ, "ky" , "ky" , "ky_KG" , 0x40, 0x01, wxLayout_LeftToRight, "Kyrgyz","\320\272\321\213\321\200\320\263\321\213\320\267\321\207\320\260" },
{ wxLANGUAGE_KIRGHIZ_KYRGYZSTAN, "ky-KG" , "ky_KG" , "" , 0x40, 0x01, wxLayout_LeftToRight, "Kyrgyz (Kyrgyzstan)","\320\272\321\213\321\200\320\263\321\213\320\267\321\207\320\260 (\320\232\321\213\321\200\320\263\321\213\320\267\321\201\321\202\320\260\320\275)" },
{ wxLANGUAGE_KIRUNDI, "rn" , "rn" , "rn_BI" , 0x00, 0x04, wxLayout_LeftToRight, "Rundi","Ikirundi" },
{ wxLANGUAGE_KIRUNDI_BURUNDI, "rn-BI" , "rn_BI" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Rundi (Burundi)","Ikirundi (Uburundi)" },
{ wxLANGUAGE_KONKANI, "kok" , "kok" , "kok_IN" , 0x57, 0x01, wxLayout_LeftToRight, "Konkani","\340\244\225\340\245\213\340\244\202\340\244\225\340\244\243\340\245\200" },
{ wxLANGUAGE_KONKANI_INDIA, "kok-IN" , "kok_IN" , "" , 0x57, 0x01, wxLayout_LeftToRight, "Konkani (India)","\340\244\225\340\245\213\340\244\202\340\244\225\340\244\243\340\245\200 (\340\244\255\340\244\276\340\244\260\340\244\244)" },
{ wxLANGUAGE_KOREAN, "ko" , "ko" , "ko_KR" , 0x12, 0x01, wxLayout_LeftToRight, "Korean","\355\225\234\352\265\255\354\226\264" },
{ wxLANGUAGE_KOREAN_KOREA, "ko-KR" , "ko_KR" , "" , 0x12, 0x01, wxLayout_LeftToRight, "Korean (Korea)","\355\225\234\352\265\255\354\226\264(\353\214\200\355\225\234\353\257\274\352\265\255)" },
{ wxLANGUAGE_KOREAN_NORTH_KOREA, "ko-KP" , "ko_KP" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Korean (North Korea)","\355\225\234\352\265\255\354\226\264 (\354\241\260\354\204\240\353\257\274\354\243\274\354\243\274\354\235\230\354\235\270\353\257\274\352\263\265\355\231\224\352\265\255)" },
{ wxLANGUAGE_KOYRABORO_SENNI, "ses" , "ses" , "ses_ML" , 0x00, 0x04, wxLayout_LeftToRight, "Koyraboro Senni","Koyraboro senni" },
{ wxLANGUAGE_KOYRABORO_SENNI_MALI, "ses-ML" , "ses_ML" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Koyraboro Senni (Mali)","Koyraboro senni (Maali)" },
{ wxLANGUAGE_KOYRA_CHIINI, "khq" , "khq" , "khq_ML" , 0x00, 0x04, wxLayout_LeftToRight, "Koyra Chiini","Koyra ciini" },
{ wxLANGUAGE_KOYRA_CHIINI_MALI, "khq-ML" , "khq_ML" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Koyra Chiini (Mali)","Koyra ciini (Maali)" },
{ wxLANGUAGE_KURDISH, "ku-TR" , "ku_TR" , "" , 0 , 0 , wxLayout_LeftToRight, "Kurdish","Kurd\303\256" },
{ wxLANGUAGE_KURDISH_ARABIC_IRAN, "ku-Arab-IR" , "ku_IR@arabic" , "" , 0x00, 0x04, wxLayout_RightToLeft, "Kurdish (Arabic, Iran)","\332\251\331\210\330\261\330\257\333\214 (\330\246\333\216\330\261\330\247\331\206)" },
{ wxLANGUAGE_KWASIO, "nmg" , "nmg" , "nmg_CM" , 0x00, 0x04, wxLayout_LeftToRight, "Kwasio","Kwasio" },
{ wxLANGUAGE_KWASIO_CAMEROON, "nmg-CM" , "nmg_CM" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Kwasio (Cameroon)","Kwasio (Kamerun)" },
{ wxLANGUAGE_LAKOTA, "lkt" , "lkt" , "lkt_US" , 0x00, 0x04, wxLayout_LeftToRight, "Lakota","Lak\310\237\303\263l\312\274iyapi" },
{ wxLANGUAGE_LAKOTA_US, "lkt-US" , "lkt_US" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Lakota (United States)","Lak\310\237\303\263l\312\274iyapi (M\303\255laha\305\213ska T\310\237am\303\241k\310\237o\304\215he)" },
{ wxLANGUAGE_LANGI, "lag" , "lag" , "lag_TZ" , 0x00, 0x04, wxLayout_LeftToRight, "Langi","K\311\250laangi" },
{ wxLANGUAGE_LANGI_TANZANIA, "lag-TZ" , "lag_TZ" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Langi (Tanzania)","K\311\250laangi (Taansan\303\255a)" },
{ wxLANGUAGE_LAOTHIAN, "lo" , "lo" , "lo_LA" , 0x54, 0x01, wxLayout_LeftToRight, "Lao","\340\272\245\340\272\262\340\272\247" },
{ wxLANGUAGE_LAOTHIAN_LAOS, "lo-LA" , "lo_LA" , "" , 0x54, 0x01, wxLayout_LeftToRight, "Lao (Laos)","\340\272\245\340\272\262\340\272\247 (\340\272\245\340\272\262\340\272\247)" },
{ wxLANGUAGE_LATIN, "la" , "la" , "la_VA" , 0x76, 0x01, wxLayout_LeftToRight, "Latin","Latina" },
{ wxLANGUAGE_LATIN_VATICAN_CITY, "la-VA" , "la_VA" , "" , 0x76, 0x01, wxLayout_LeftToRight, "Latin (Vatican City)","Latina (Civitas Vaticana)" },
{ wxLANGUAGE_LATIN_WORLD, "la-001" , "la_001" , "" , 0x76, 0x01, wxLayout_LeftToRight, "Latin (World)","Latina (Mundus)" },
{ wxLANGUAGE_LATVIAN, "lv" , "lv" , "lv_LV" , 0x26, 0x01, wxLayout_LeftToRight, "Latvian","latvie\305\241u" },
{ wxLANGUAGE_LATVIAN_LATVIA, "lv-LV" , "lv_LV" , "" , 0x26, 0x01, wxLayout_LeftToRight, "Latvian (Latvia)","latvie\305\241u (Latvija)" },
{ wxLANGUAGE_LINGALA, "ln" , "ln" , "ln_CD" , 0x00, 0x04, wxLayout_LeftToRight, "Lingala","ling\303\241la" },
{ wxLANGUAGE_LINGALA_ANGOLA, "ln-AO" , "ln_AO" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Lingala (Angola)","ling\303\241la (Ang\303\263la)" },
{ wxLANGUAGE_LINGALA_CENTRAL_AFRICAN_REPUBLIC, "ln-CF" , "ln_CF" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Lingala (Central African Republic)","ling\303\241la (Repibiki ya Afr\303\255ka ya K\303\241ti)" },
{ wxLANGUAGE_LINGALA_CONGO, "ln-CG" , "ln_CG" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Lingala (Congo)","ling\303\241la (Kongo)" },
{ wxLANGUAGE_LINGALA_CONGO_DRC, "ln-CD" , "ln_CD" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Lingala (Congo DRC)","ling\303\241la (Republ\303\255ki ya Kong\303\263 Demokrat\303\255ki)" },
{ wxLANGUAGE_LITHUANIAN, "lt" , "lt" , "lt_LT" , 0x27, 0x01, wxLayout_LeftToRight, "Lithuanian","lietuvi\305\263" },
{ wxLANGUAGE_LITHUANIAN_LITHUANIA, "lt-LT" , "lt_LT" , "" , 0x27, 0x01, wxLayout_LeftToRight, "Lithuanian (Lithuania)","lietuvi\305\263 (Lietuva)" },
{ wxLANGUAGE_LOWER_SORBIAN, "dsb" , "dsb" , "dsb_DE" , 0x2e, 0x02, wxLayout_LeftToRight, "Lower Sorbian","dolnoserb\305\241\304\207ina" },
{ wxLANGUAGE_LOWER_SORBIAN_GERMANY, "dsb-DE" , "dsb_DE" , "" , 0x2e, 0x02, wxLayout_LeftToRight, "Lower Sorbian (Germany)","dolnoserb\305\241\304\207ina (Nimska)" },
{ wxLANGUAGE_LOW_GERMAN, "nds" , "nds" , "nds_DE" , 0x00, 0x04, wxLayout_LeftToRight, "Low German","Neddersass\342\200\231sch" },
{ wxLANGUAGE_LOW_GERMAN_GERMANY, "nds-DE" , "nds_DE" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Low German (Germany)","Neddersass\342\200\231sch (D\303\274\303\274tschland)" },
{ wxLANGUAGE_LOW_GERMAN_NETHERLANDS, "nds-NL" , "nds_NL" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Low German (Netherlands)","Neddersass\342\200\231sch (Nedderlannen)" },
{ wxLANGUAGE_LUBA_KATANGA, "lu" , "lu" , "lu_CD" , 0x00, 0x04, wxLayout_LeftToRight, "Luba-Katanga","Tshiluba" },
{ wxLANGUAGE_LUBA_KATANGA_CONGO_DRC, "lu-CD" , "lu_CD" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Luba-Katanga (Congo DRC)","Tshiluba (Ditunga wa Kongu)" },
{ wxLANGUAGE_LUO, "luo" , "luo" , "luo_KE" , 0x00, 0x04, wxLayout_LeftToRight, "Luo","Dholuo" },
{ wxLANGUAGE_LUO_KENYA, "luo-KE" , "luo_KE" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Luo (Kenya)","Dholuo (Kenya)" },
{ wxLANGUAGE_LUXEMBOURGISH, "lb" , "lb" , "lb_LU" , 0x6e, 0x01, wxLayout_LeftToRight, "Luxembourgish","L\303\253tzebuergesch" },
{ wxLANGUAGE_LUXEMBOURGISH_LUXEMBOURG, "lb-LU" , "lb_LU" , "" , 0x6e, 0x01, wxLayout_LeftToRight, "Luxembourgish (Luxembourg)","L\303\253tzebuergesch (L\303\253tzebuerg)" },
{ wxLANGUAGE_LUYIA, "luy" , "luy" , "luy_KE" , 0x00, 0x04, wxLayout_LeftToRight, "Luyia","Luluhia" },
{ wxLANGUAGE_LUYIA_KENYA, "luy-KE" , "luy_KE" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Luyia (Kenya)","Luluhia (Kenya)" },
{ wxLANGUAGE_MACEDONIAN, "mk" , "mk" , "mk_MK" , 0x2f, 0x01, wxLayout_LeftToRight, "Macedonian","\320\274\320\260\320\272\320\265\320\264\320\276\320\275\321\201\320\272\320\270" },
{ wxLANGUAGE_MACEDONIAN_NORTH_MACEDONIA, "mk-MK" , "mk_MK" , "" , 0x2f, 0x01, wxLayout_LeftToRight, "Macedonian (North Macedonia)","\320\274\320\260\320\272\320\265\320\264\320\276\320\275\321\201\320\272\320\270 (\320\241\320\265\320\262\320\265\321\200\320\275\320\260 \320\234\320\260\320\272\320\265\320\264\320\276\320\275\320\270\321\230\320\260)" },
{ wxLANGUAGE_MACHAME, "jmc" , "jmc" , "jmc_TZ" , 0x00, 0x04, wxLayout_LeftToRight, "Machame","Kimachame" },
{ wxLANGUAGE_MACHAME_TANZANIA, "jmc-TZ" , "jmc_TZ" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Machame (Tanzania)","Kimachame (Tanzania)" },
{ wxLANGUAGE_MAITHILI, "mai" , "mai" , "mai_IN" , 0x00, 0x04, wxLayout_LeftToRight, "Maithili","\340\244\256\340\245\210\340\244\245\340\244\277\340\244\262\340\245\200" },
{ wxLANGUAGE_MAITHILI_INDIA, "mai-IN" , "mai_IN" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Maithili (India)","\340\244\256\340\245\210\340\244\245\340\244\277\340\244\262\340\245\200 (\340\244\255\340\244\276\340\244\260\340\244\244)" },
{ wxLANGUAGE_MAKHUWA_MEETTO, "mgh" , "mgh" , "mgh_MZ" , 0x00, 0x04, wxLayout_LeftToRight, "Makhuwa-Meetto","Makua" },
{ wxLANGUAGE_MAKHUWA_MEETTO_MOZAMBIQUE, "mgh-MZ" , "mgh_MZ" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Makhuwa-Meetto (Mozambique)","Makua (Umozambiki)" },
{ wxLANGUAGE_MAKONDE, "kde" , "kde" , "kde_TZ" , 0x00, 0x04, wxLayout_LeftToRight, "Makonde","Chimakonde" },
{ wxLANGUAGE_MAKONDE_TANZANIA, "kde-TZ" , "kde_TZ" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Makonde (Tanzania)","Chimakonde (Tanzania)" },
{ wxLANGUAGE_MALAGASY, "mg" , "mg" , "mg_MG" , 0x00, 0x04, wxLayout_LeftToRight, "Malagasy","Malagasy" },
{ wxLANGUAGE_MALAGASY_MADAGASCAR, "mg-MG" , "mg_MG" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Malagasy (Madagascar)","Malagasy (Madagasikara)" },
{ wxLANGUAGE_MALAY, "ms" , "ms" , "ms_MY" , 0x3e, 0x01, wxLayout_LeftToRight, "Malay","Melayu" },
{ wxLANGUAGE_MALAYALAM, "ml" , "ml" , "ml_IN" , 0x4c, 0x01, wxLayout_LeftToRight, "Malayalam","\340\264\256\340\264\262\340\264\257\340\264\276\340\264\263\340\264\202" },
{ wxLANGUAGE_MALAYALAM_INDIA, "ml-IN" , "ml_IN" , "" , 0x4c, 0x01, wxLayout_LeftToRight, "Malayalam (India)","\340\264\256\340\264\262\340\264\257\340\264\276\340\264\263\340\264\202 (\340\264\207\340\264\250\340\265\215\340\264\244\340\265\215\340\264\257)" },
{ wxLANGUAGE_MALAY_BRUNEI, "ms-BN" , "ms_BN" , "" , 0x3e, 0x02, wxLayout_LeftToRight, "Malay (Brunei)","Melayu (Brunei)" },
{ wxLANGUAGE_MALAY_INDONESIA, "ms-ID" , "ms_ID" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Malay (Indonesia)","Melayu (Indonesia)" },
{ wxLANGUAGE_MALAY_MALAYSIA, "ms-MY" , "ms_MY" , "" , 0x3e, 0x01, wxLayout_LeftToRight, "Malay (Malaysia)","Melayu (Malaysia)" },
{ wxLANGUAGE_MALAY_SINGAPORE, "ms-SG" , "ms_SG" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Malay (Singapore)","Melayu (Singapura)" },
{ wxLANGUAGE_MALTESE, "mt" , "mt" , "mt_MT" , 0x3a, 0x01, wxLayout_LeftToRight, "Maltese","Malti" },
{ wxLANGUAGE_MALTESE_MALTA, "mt-MT" , "mt_MT" , "" , 0x3a, 0x01, wxLayout_LeftToRight, "Maltese (Malta)","Malti (Malta)" },
{ wxLANGUAGE_MANIPURI, "mni" , "mni" , "mni_IN" , 0x58, 0x01, wxLayout_LeftToRight, "Manipuri","\340\246\256\340\247\210\340\246\244\340\247\210\340\246\262\340\247\213\340\246\250\340\247\215" },
{ wxLANGUAGE_MANIPURI_BENGALI, "mni-Beng" , "mni@bengali" , "" , 0x58, 0x01, wxLayout_LeftToRight, "Manipuri (Bangla)","\340\246\256\340\247\210\340\246\244\340\247\210\340\246\262\340\247\213\340\246\250\340\247\215" },
{ wxLANGUAGE_MANIPURI_INDIA, "mni-IN" , "mni_IN" , "" , 0x58, 0x01, wxLayout_LeftToRight, "Manipuri (Bangla, India)","\340\246\256\340\247\210\340\246\244\340\247\210\340\246\262\340\247\213\340\246\250\340\247\215 (\340\246\207\340\246\250\340\247\215\340\246\246\340\246\277\340\246\257\340\246\274\340\246\276)" },
{ wxLANGUAGE_MANX, "gv" , "gv" , "gv_IM" , 0x00, 0x04, wxLayout_LeftToRight, "Manx","Gaelg" },
{ wxLANGUAGE_MANX_ISLE_OF_MAN, "gv-IM" , "gv_IM" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Manx (Isle of Man)","Gaelg (Ellan Vannin)" },
{ wxLANGUAGE_MAORI, "mi" , "mi" , "mi_NZ" , 0x81, 0x01, wxLayout_LeftToRight, "Maori","te reo M\304\201ori" },
{ wxLANGUAGE_MAORI_NEW_ZEALAND, "mi-NZ" , "mi_NZ" , "" , 0x81, 0x01, wxLayout_LeftToRight, "Maori (New Zealand)","te reo M\304\201ori (Aotearoa)" },
{ wxLANGUAGE_MAPUCHE, "arn" , "arn" , "arn_CL" , 0x7a, 0x01, wxLayout_LeftToRight, "Mapuche","Mapudungun" },
{ wxLANGUAGE_MAPUCHE_CHILE, "arn-CL" , "arn_CL" , "" , 0x7a, 0x01, wxLayout_LeftToRight, "Mapuche (Chile)","Mapudungun (Chile)" },
{ wxLANGUAGE_MARATHI, "mr" , "mr" , "mr_IN" , 0x4e, 0x01, wxLayout_LeftToRight, "Marathi","\340\244\256\340\244\260\340\244\276\340\244\240\340\245\200" },
{ wxLANGUAGE_MARATHI_INDIA, "mr-IN" , "mr_IN" , "" , 0x4e, 0x01, wxLayout_LeftToRight, "Marathi (India)","\340\244\256\340\244\260\340\244\276\340\244\240\340\245\200 (\340\244\255\340\244\276\340\244\260\340\244\244)" },
{ wxLANGUAGE_MASAI, "mas" , "mas" , "mas_KE" , 0x00, 0x04, wxLayout_LeftToRight, "Masai","Maa" },
{ wxLANGUAGE_MASAI_KENYA, "mas-KE" , "mas_KE" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Masai (Kenya)","Maa (Kenya)" },
{ wxLANGUAGE_MASAI_TANZANIA, "mas-TZ" , "mas_TZ" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Masai (Tanzania)","Maa (Tansania)" },
{ wxLANGUAGE_MAZANDERANI, "mzn" , "mzn" , "mzn_IR" , 0x00, 0x04, wxLayout_RightToLeft, "Mazanderani","\331\205\330\247\330\262\330\261\331\210\331\206\333\214" },
{ wxLANGUAGE_MAZANDERANI_IRAN, "mzn-IR" , "mzn_IR" , "" , 0x00, 0x04, wxLayout_RightToLeft, "Mazanderani (Iran)","\331\205\330\247\330\262\330\261\331\210\331\206\333\214 (\330\247\333\214\330\261\330\247\331\206)" },
{ wxLANGUAGE_MERU, "mer" , "mer" , "mer_KE" , 0x00, 0x04, wxLayout_LeftToRight, "Meru","K\304\251m\304\251r\305\251" },
{ wxLANGUAGE_MERU_KENYA, "mer-KE" , "mer_KE" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Meru (Kenya)","K\304\251m\304\251r\305\251 (Kenya)" },
{ wxLANGUAGE_META, "mgo" , "mgo" , "mgo_CM" , 0x00, 0x04, wxLayout_LeftToRight, "Meta\312\274","meta\312\274" },
{ wxLANGUAGE_META_CAMEROON, "mgo-CM" , "mgo_CM" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Meta\312\274 (Cameroon)","meta\312\274 (Kamalun)" },
{ wxLANGUAGE_MOHAWK, "moh" , "moh" , "moh_CA" , 0x7c, 0x01, wxLayout_LeftToRight, "Mohawk","Kanien\312\274k\303\251ha" },
{ wxLANGUAGE_MOHAWK_CANADA, "moh-CA" , "moh_CA" , "" , 0x7c, 0x01, wxLayout_LeftToRight, "Mohawk (Canada)","Kanien\312\274k\303\251ha (Canada)" },
{ wxLANGUAGE_MOLDAVIAN, "mo" , "mo" , "" , 0 , 0 , wxLayout_LeftToRight, "Moldavian","\320\273\320\270\320\274\320\261\320\260 \320\274\320\276\320\273\320\264\320\276\320\262\320\265\320\275\321\217\321\201\320\272\321\215" },
{ wxLANGUAGE_MONGOLIAN, "mn" , "mn" , "mn_MN" , 0x50, 0x01, wxLayout_LeftToRight, "Mongolian","\320\234\320\276\320\275\320\263\320\276\320\273\302\240\321\205\321\215\320\273" },
{ wxLANGUAGE_MONGOLIAN_CYRILLIC, "mn-Cyrl" , "mn@cyrillic" , "" , 0x50, 0x01, wxLayout_LeftToRight, "Mongolian","\320\234\320\276\320\275\320\263\320\276\320\273\302\240\321\205\321\215\320\273 (\320\232\320\270\321\200\320\270\320\273\320\273 \322\257\321\201\321\215\320\263)" },
{ wxLANGUAGE_MONGOLIAN_MONGOLIA, "mn-MN" , "mn_MN" , "" , 0x50, 0x01, wxLayout_LeftToRight, "Mongolian (Mongolia)","\320\274\320\276\320\275\320\263\320\276\320\273 (\320\234\320\276\320\275\320\263\320\276\320\273)" },
{ wxLANGUAGE_MONGOLIAN_TRADITIONAL, "mn-Mong" , "mn@mongolian" , "" , 0x50, 0x02, wxLayout_LeftToRight, "Mongolian (Traditional Mongolian)","\341\240\256\341\240\243\341\240\251\341\240\255\341\240\243\341\240\244\341\240\257 \341\240\254\341\240\241\341\240\257\341\240\241 (\341\240\256\341\240\243\341\240\251\341\240\255\341\240\243\341\240\244\341\240\257 \341\240\254\341\240\241\341\240\257\341\240\241)" },
{ wxLANGUAGE_MONGOLIAN_TRADITIONAL_CHINA, "mn-Mong-CN" , "mn_CN@mongolian" , "" , 0x50, 0x02, wxLayout_LeftToRight, "Mongolian (Traditional Mongolian, China)","\341\240\256\341\240\243\341\240\251\341\240\255\341\240\243\341\240\244\341\240\257 \341\240\254\341\240\241\341\240\257\341\240\241 (\341\240\252\341\240\246\341\240\255\341\240\246\341\240\263\341\240\241 \341\240\250\341\240\240\341\240\242\341\240\267\341\240\240\341\240\256\341\240\263\341\240\240\341\240\254\341\240\244 \341\240\263\341\240\244\341\240\256\341\240\263\341\240\240\341\240\263\341\240\244 \341\240\240\341\240\267\341\240\240\341\240\263 \341\240\243\341\240\257\341\240\243\341\240\260)" },
{ wxLANGUAGE_MONGOLIAN_TRADITIONAL_MONGOLIA, "mn-Mong-MN" , "mn_MN@mongolian" , "" , 0x50, 0x03, wxLayout_LeftToRight, "Mongolian (Traditional Mongolian, Mongolia)","\341\240\256\341\240\243\341\240\251\341\240\255\341\240\243\341\240\257 \341\240\254\341\240\241\341\240\257\341\240\241 (\341\240\256\341\240\243\341\240\251\341\240\255\341\240\243\341\240\257 \341\240\243\341\240\257\341\240\243\341\240\260)" },
{ wxLANGUAGE_MORISYEN, "mfe" , "mfe" , "mfe_MU" , 0x00, 0x04, wxLayout_LeftToRight, "Morisyen","kreol morisien" },
{ wxLANGUAGE_MORISYEN_MAURITIUS, "mfe-MU" , "mfe_MU" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Morisyen (Mauritius)","kreol morisien (Moris)" },
{ wxLANGUAGE_MUNDANG, "mua" , "mua" , "mua_CM" , 0x00, 0x04, wxLayout_LeftToRight, "Mundang","MUNDA\305\212" },
{ wxLANGUAGE_MUNDANG_CAMEROON, "mua-CM" , "mua_CM" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Mundang (Cameroon)","MUNDA\305\212 (kameru\305\213)" },
{ wxLANGUAGE_NAMA, "naq" , "naq" , "naq_NA" , 0x00, 0x04, wxLayout_LeftToRight, "Nama","Khoekhoegowab" },
{ wxLANGUAGE_NAMA_NAMIBIA, "naq-NA" , "naq_NA" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Nama (Namibia)","Khoekhoegowab (Namibiab)" },
{ wxLANGUAGE_NAURU, "na" , "na" , "" , 0 , 0 , wxLayout_LeftToRight, "Nauru","Nauru" },
{ wxLANGUAGE_NEPALI, "ne" , "ne" , "ne_NP" , 0x61, 0x01, wxLayout_LeftToRight, "Nepali","\340\244\250\340\245\207\340\244\252\340\244\276\340\244\262\340\245\200" },
{ wxLANGUAGE_NEPALI_INDIA, "ne-IN" , "ne_IN" , "" , 0x61, 0x02, wxLayout_LeftToRight, "Nepali (India)","\340\244\250\340\245\207\340\244\252\340\244\276\340\244\262\340\245\200 (\340\244\255\340\244\276\340\244\260\340\244\244)" },
{ wxLANGUAGE_NEPALI_NEPAL, "ne-NP" , "ne_NP" , "" , 0x61, 0x01, wxLayout_LeftToRight, "Nepali (Nepal)","\340\244\250\340\245\207\340\244\252\340\244\276\340\244\262\340\245\200 (\340\244\250\340\245\207\340\244\252\340\244\276\340\244\262)" },
{ wxLANGUAGE_NGIEMBOON, "nnh" , "nnh" , "nnh_CM" , 0x00, 0x04, wxLayout_LeftToRight, "Ngiemboon","Shw\303\263\305\213\303\262 ngiemb\311\224\311\224n" },
{ wxLANGUAGE_NGIEMBOON_CAMEROON, "nnh-CM" , "nnh_CM" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Ngiemboon (Cameroon)","Shw\303\263\305\213\303\262 ngiemb\311\224\311\224n (K\303\240mal\303\273m)" },
{ wxLANGUAGE_NGOMBA, "jgo" , "jgo" , "jgo_CM" , 0x00, 0x04, wxLayout_LeftToRight, "Ngomba","Nda\352\236\214a" },
{ wxLANGUAGE_NGOMBA_CAMEROON, "jgo-CM" , "jgo_CM" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Ngomba (Cameroon)","Nda\352\236\214a (Kam\311\233l\303\273n)" },
{ wxLANGUAGE_NIGERIAN_PIDGIN, "pcm" , "pcm" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Nigerian Pidgin","Naij\303\255ri\303\241 P\303\255jin" },
{ wxLANGUAGE_NIGERIAN_PIDGIN_LATIN, "pcm-Latn" , "pcm@latin" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Nigerian Pidgin (Latin)","Naij\303\255ri\303\241 P\303\255jin (L\303\241tin)" },
{ wxLANGUAGE_NIGERIAN_PIDGIN_LATIN_NIGERIA, "pcm-Latn-NG" , "pcm_NG@latin" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Nigerian Pidgin (Latin, Nigeria)","Naij\303\255ri\303\241 P\303\255jin (Naij\303\255ria)" },
{ wxLANGUAGE_NKO, "nqo" , "nqo" , "nqo_GN" , 0x00, 0x04, wxLayout_RightToLeft, "N'ko","\337\222\337\236\337\217" },
{ wxLANGUAGE_NKO_GUINEA, "nqo-GN" , "nqo_GN" , "" , 0x00, 0x04, wxLayout_RightToLeft, "N'ko (Guinea)","\337\222\337\236\337\217 (\337\226\337\214\337\254\337\243\337\215\337\254 \337\236\337\212\337\262\337\223\337\215\337\262)" },
{ wxLANGUAGE_NORTHERN_LURI, "lrc" , "lrc" , "lrc_IR" , 0x00, 0x04, wxLayout_RightToLeft, "Northern Luri","\331\204\333\212\330\261\333\214 \330\264\331\210\331\205\330\247\331\204\333\214" },
{ wxLANGUAGE_NORTHERN_LURI_IRAN, "lrc-IR" , "lrc_IR" , "" , 0x00, 0x04, wxLayout_RightToLeft, "Northern Luri (Iran)","\331\204\333\212\330\261\333\214 \330\264\331\210\331\205\330\247\331\204\333\214 (Iran)" },
{ wxLANGUAGE_NORTHERN_LURI_IRAQ, "lrc-IQ" , "lrc_IQ" , "" , 0x00, 0x04, wxLayout_RightToLeft, "Northern Luri (Iraq)","\331\204\333\212\330\261\333\214 \330\264\331\210\331\205\330\247\331\204\333\214 (Iraq)" },
{ wxLANGUAGE_NORTH_NDEBELE, "nd" , "nd" , "nd_ZW" , 0x00, 0x04, wxLayout_LeftToRight, "North Ndebele","isiNdebele" },
{ wxLANGUAGE_NORTH_NDEBELE_ZIMBABWE, "nd-ZW" , "nd_ZW" , "" , 0x00, 0x04, wxLayout_LeftToRight, "North Ndebele (Zimbabwe)","isiNdebele (Zimbabwe)" },
{ wxLANGUAGE_NORWEGIAN, "no" , "no" , "" , 0x14, 0x01, wxLayout_LeftToRight, "Norwegian","norsk" },
{ wxLANGUAGE_NORWEGIAN_BOKMAL, "nb" , "nb" , "nb_NO" , 0x14, 0x01, wxLayout_LeftToRight, "Norwegian Bokm\303\245l","norsk bokm\303\245l" },
{ wxLANGUAGE_NORWEGIAN_BOKMAL_NORWAY, "nb-NO" , "nb_NO" , "" , 0x14, 0x01, wxLayout_LeftToRight, "Norwegian Bokm\303\245l (Norway)","norsk bokm\303\245l (Norge)" },
{ wxLANGUAGE_NORWEGIAN_BOKMAL_SVALBARD_AND_JAN_MAYEN, "nb-SJ" , "nb_SJ" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Norwegian Bokm\303\245l (Svalbard and Jan Mayen)","norsk bokm\303\245l (Svalbard og Jan Mayen)" },
{ wxLANGUAGE_NORWEGIAN_NYNORSK, "nn" , "nn" , "nn_NO" , 0x14, 0x02, wxLayout_LeftToRight, "Norwegian Nynorsk","norsk nynorsk" },
{ wxLANGUAGE_NORWEGIAN_NYNORSK_NORWAY, "nn-NO" , "nn_NO" , "" , 0x14, 0x02, wxLayout_LeftToRight, "Norwegian Nynorsk (Norway)","norsk nynorsk (Noreg)" },
{ wxLANGUAGE_NUER, "nus" , "nus" , "nus_SS" , 0x00, 0x04, wxLayout_LeftToRight, "Nuer","Thok Nath" },
{ wxLANGUAGE_NUER_SOUTH_SUDAN, "nus-SS" , "nus_SS" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Nuer (South Sudan)","Thok Nath (South Sudan)" },
{ wxLANGUAGE_NYANKOLE, "nyn" , "nyn" , "nyn_UG" , 0x00, 0x04, wxLayout_LeftToRight, "Nyankole","Runyankore" },
{ wxLANGUAGE_NYANKOLE_UGANDA, "nyn-UG" , "nyn_UG" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Nyankole (Uganda)","Runyankore (Uganda)" },
{ wxLANGUAGE_OCCITAN, "oc" , "oc" , "oc_FR" , 0x82, 0x01, wxLayout_LeftToRight, "Occitan","occitan" },
{ wxLANGUAGE_OCCITAN_FRANCE, "oc-FR" , "oc_FR" , "" , 0x82, 0x01, wxLayout_LeftToRight, "Occitan (France)","occitan (Fran\303\247a)" },
{ wxLANGUAGE_ODIA, "or" , "or" , "or_IN" , 0x48, 0x01, wxLayout_LeftToRight, "Odia","\340\254\223\340\254\241\340\254\274\340\254\277\340\254\206" },
{ wxLANGUAGE_ODIA_INDIA, "or-IN" , "or_IN" , "" , 0x48, 0x01, wxLayout_LeftToRight, "Odia (India)","\340\254\223\340\254\241\340\254\274\340\254\277\340\254\206 (\340\254\255\340\254\276\340\254\260\340\254\244)" },
{ wxLANGUAGE_OROMO, "om" , "om" , "om_ET" , 0x72, 0x01, wxLayout_LeftToRight, "Oromo","Oromoo" },
{ wxLANGUAGE_OROMO_ETHIOPIA, "om-ET" , "om_ET" , "" , 0x72, 0x01, wxLayout_LeftToRight, "Oromo (Ethiopia)","Oromoo (Itoophiyaa)" },
{ wxLANGUAGE_OROMO_KENYA, "om-KE" , "om_KE" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Oromo (Kenya)","Oromoo (Keeniyaa)" },
{ wxLANGUAGE_OSSETIC, "os" , "os" , "os_GE" , 0x00, 0x04, wxLayout_LeftToRight, "Ossetic","\320\270\321\200\320\276\320\275" },
{ wxLANGUAGE_OSSETIC_GEORGIA, "os-GE" , "os_GE" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Ossetic (Georgia)","\320\270\321\200\320\276\320\275 (\320\223\321\203\321\213\321\200\320\264\320\267\321\213\321\201\321\202\320\276\320\275)" },
{ wxLANGUAGE_OSSETIC_RUSSIA, "os-RU" , "os_RU" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Ossetic (Russia)","\320\270\321\200\320\276\320\275 (\320\243\323\225\321\200\323\225\321\201\320\265)" },
{ wxLANGUAGE_PAPIAMENTO, "pap" , "pap" , "" , 0x79, 0x01, wxLayout_LeftToRight, "Papiamento","Papiamentu" },
{ wxLANGUAGE_PAPIAMENTO_CARIBBEAN, "pap-029" , "pap_029" , "" , 0x79, 0x01, wxLayout_LeftToRight, "Papiamento (Caribbean)","Papiamentu (Caribbean)" },
{ wxLANGUAGE_PASHTO, "ps" , "ps" , "ps_AF" , 0x63, 0x01, wxLayout_RightToLeft, "Pashto","\331\276\332\232\330\252\331\210" },
{ wxLANGUAGE_PASHTO_AFGHANISTAN, "ps-AF" , "ps_AF" , "" , 0x63, 0x01, wxLayout_RightToLeft, "Pashto (Afghanistan)","\331\276\332\232\330\252\331\210 (\330\247\331\201\330\272\330\247\331\206\330\263\330\252\330\247\331\206)" },
{ wxLANGUAGE_PASHTO_PAKISTAN, "ps-PK" , "ps_PK" , "" , 0x00, 0x04, wxLayout_RightToLeft, "Pashto (Pakistan)","\331\276\332\232\330\252\331\210 (\331\276\330\247\332\251\330\263\330\252\330\247\331\206)" },
{ wxLANGUAGE_PERSIAN, "fa" , "fa" , "fa_IR" , 0x29, 0x01, wxLayout_RightToLeft, "Persian","\331\201\330\247\330\261\330\263\333\214" },
{ wxLANGUAGE_PERSIAN_AFGHANISTAN, "fa-AF" , "fa_AF" , "" , 0x8c, 0x01, wxLayout_RightToLeft, "Persian (Afghanistan)","\331\201\330\247\330\261\330\263\333\214 (\330\247\331\201\330\272\330\247\331\206\330\263\330\252\330\247\331\206)" },
{ wxLANGUAGE_PERSIAN_IRAN, "fa-IR" , "fa_IR" , "" , 0x29, 0x01, wxLayout_RightToLeft, "Persian (Iran)","\331\201\330\247\330\261\330\263\333\214 (\330\247\333\214\330\261\330\247\331\206)" },
{ wxLANGUAGE_POLISH, "pl" , "pl" , "pl_PL" , 0x15, 0x01, wxLayout_LeftToRight, "Polish","polski" },
{ wxLANGUAGE_POLISH_POLAND, "pl-PL" , "pl_PL" , "" , 0x15, 0x01, wxLayout_LeftToRight, "Polish (Poland)","polski (Polska)" },
{ wxLANGUAGE_PORTUGUESE, "pt" , "pt" , "pt_PT" , 0x16, 0x02, wxLayout_LeftToRight, "Portuguese","portugu\303\252s" },
{ wxLANGUAGE_PORTUGUESE_ANGOLA, "pt-AO" , "pt_AO" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Portuguese (Angola)","portugu\303\252s (Angola)" },
{ wxLANGUAGE_PORTUGUESE_BRAZILIAN, "pt-BR" , "pt_BR" , "" , 0x16, 0x01, wxLayout_LeftToRight, "Portuguese (Brazil)","portugu\303\252s (Brasil)" },
{ wxLANGUAGE_PORTUGUESE_CABO_VERDE, "pt-CV" , "pt_CV" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Portuguese (Cabo Verde)","portugu\303\252s (Cabo Verde)" },
{ wxLANGUAGE_PORTUGUESE_EQUATORIAL_GUINEA, "pt-GQ" , "pt_GQ" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Portuguese (Equatorial Guinea)","portugu\303\252s (Guin\303\251 Equatorial)" },
{ wxLANGUAGE_PORTUGUESE_GUINEA_BISSAU, "pt-GW" , "pt_GW" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Portuguese (Guinea-Bissau)","portugu\303\252s (Guin\303\251-Bissau)" },
{ wxLANGUAGE_PORTUGUESE_LUXEMBOURG, "pt-LU" , "pt_LU" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Portuguese (Luxembourg)","portugu\303\252s (Luxemburgo)" },
{ wxLANGUAGE_PORTUGUESE_MACAO_SAR, "pt-MO" , "pt_MO" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Portuguese (Macao SAR)","portugu\303\252s (RAE de Macau)" },
{ wxLANGUAGE_PORTUGUESE_MOZAMBIQUE, "pt-MZ" , "pt_MZ" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Portuguese (Mozambique)","portugu\303\252s (Mo\303\247ambique)" },
{ wxLANGUAGE_PORTUGUESE_PORTUGAL, "pt-PT" , "pt_PT" , "" , 0x16, 0x02, wxLayout_LeftToRight, "Portuguese (Portugal)","portugu\303\252s (Portugal)" },
{ wxLANGUAGE_PORTUGUESE_SAO_TOME_AND_PRINCIPE, "pt-ST" , "pt_ST" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Portuguese (S\303\243o Tom\303\251 and Pr\303\255ncipe)","portugu\303\252s (S\303\243o Tom\303\251 e Pr\303\255ncipe)" },
{ wxLANGUAGE_PORTUGUESE_SWITZERLAND, "pt-CH" , "pt_CH" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Portuguese (Switzerland)","portugu\303\252s (Su\303\255\303\247a)" },
{ wxLANGUAGE_PORTUGUESE_TIMOR_LESTE, "pt-TL" , "pt_TL" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Portuguese (Timor-Leste)","portugu\303\252s (Timor-Leste)" },
{ wxLANGUAGE_PRUSSIAN, "prg" , "prg" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Prussian","pr\305\253siskan" },
{ wxLANGUAGE_PRUSSIAN_WORLD, "prg-001" , "prg_001" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Prussian (World)","pr\305\253siskan (sw\304\253tai)" },
{ wxLANGUAGE_PUNJABI, "pa" , "pa" , "pa_IN" , 0x46, 0x01, wxLayout_LeftToRight, "Punjabi","\340\250\252\340\251\260\340\250\234\340\250\276\340\250\254\340\251\200" },
{ wxLANGUAGE_PUNJABI_ARABIC, "pa-Arab" , "pa@arabic" , "" , 0x46, 0x02, wxLayout_RightToLeft, "Punjabi","\331\276\331\206\330\254\330\247\330\250\333\214" },
{ wxLANGUAGE_PUNJABI_GURMUKHI, "pa-Guru" , "pa@gurmukhi" , "" , 0x46, 0x01, wxLayout_LeftToRight, "Punjabi","\340\250\252\340\251\260\340\250\234\340\250\276\340\250\254\340\251\200" },
{ wxLANGUAGE_PUNJABI_INDIA, "pa-IN" , "pa_IN" , "" , 0x46, 0x01, wxLayout_LeftToRight, "Punjabi (India)","\340\250\252\340\251\260\340\250\234\340\250\276\340\250\254\340\251\200 (\340\250\255\340\250\276\340\250\260\340\250\244)" },
{ wxLANGUAGE_PUNJABI_PAKISTAN, "pa-Arab-PK" , "pa_PK@arabic" , "" , 0x46, 0x02, wxLayout_RightToLeft, "Punjabi (Pakistan)","\331\276\331\206\330\254\330\247\330\250\333\214 (\331\276\330\247\332\251\330\263\330\252\330\247\331\206)" },
{ wxLANGUAGE_QUECHUA, "quz" , "quz" , "quz_BO" , 0x6b, 0x01, wxLayout_LeftToRight, "Quechua","Runasimi" },
{ wxLANGUAGE_QUECHUA_BOLIVIA, "quz-BO" , "quz_BO" , "" , 0x6b, 0x01, wxLayout_LeftToRight, "Quechua (Bolivia)","Runasimi (Bolivia)" },
{ wxLANGUAGE_QUECHUA_ECUADOR, "quz-EC" , "quz_EC" , "" , 0x6b, 0x02, wxLayout_LeftToRight, "Quechua (Ecuador)","Runasimi (Ecuador)" },
{ wxLANGUAGE_QUECHUA_MACRO, "qu" , "qu" , "" , 0 , 0 , wxLayout_LeftToRight, "Quechua","Qhichwa" },
{ wxLANGUAGE_QUECHUA_PERU, "quz-PE" , "quz_PE" , "" , 0x6b, 0x03, wxLayout_LeftToRight, "Quechua (Peru)","Runasimi (Per\303\272)" },
{ wxLANGUAGE_RHAETO_ROMANCE, "rm" , "rm" , "rm_CH" , 0x17, 0x01, wxLayout_LeftToRight, "Romansh","rumantsch" },
{ wxLANGUAGE_RHAETO_ROMANCE_SWITZERLAND, "rm-CH" , "rm_CH" , "" , 0x17, 0x01, wxLayout_LeftToRight, "Romansh (Switzerland)","rumantsch (Svizra)" },
{ wxLANGUAGE_ROMANIAN, "ro" , "ro" , "ro_RO" , 0x18, 0x01, wxLayout_LeftToRight, "Romanian","rom\303\242n\304\203" },
{ wxLANGUAGE_ROMANIAN_MOLDOVA, "ro-MD" , "ro_MD" , "" , 0x18, 0x02, wxLayout_LeftToRight, "Romanian (Moldova)","rom\303\242n\304\203 (Republica Moldova)" },
{ wxLANGUAGE_ROMANIAN_ROMANIA, "ro-RO" , "ro_RO" , "" , 0x18, 0x01, wxLayout_LeftToRight, "Romanian (Romania)","rom\303\242n\304\203 (Rom\303\242nia)" },
{ wxLANGUAGE_ROMBO, "rof" , "rof" , "rof_TZ" , 0x00, 0x04, wxLayout_LeftToRight, "Rombo","Kihorombo" },
{ wxLANGUAGE_ROMBO_TANZANIA, "rof-TZ" , "rof_TZ" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Rombo (Tanzania)","Kihorombo (Tanzania)" },
{ wxLANGUAGE_RUSSIAN, "ru" , "ru" , "ru_RU" , 0x19, 0x01, wxLayout_LeftToRight, "Russian","\321\200\321\203\321\201\321\201\320\272\320\270\320\271" },
{ wxLANGUAGE_RUSSIAN_BELARUS, "ru-BY" , "ru_BY" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Russian (Belarus)","\321\200\321\203\321\201\321\201\320\272\320\270\320\271 (\320\221\320\265\320\273\320\260\321\200\321\203\321\201\321\214)" },
{ wxLANGUAGE_RUSSIAN_KAZAKHSTAN, "ru-KZ" , "ru_KZ" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Russian (Kazakhstan)","\321\200\321\203\321\201\321\201\320\272\320\270\320\271 (\320\232\320\260\320\267\320\260\321\205\321\201\321\202\320\260\320\275)" },
{ wxLANGUAGE_RUSSIAN_KYRGYZSTAN, "ru-KG" , "ru_KG" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Russian (Kyrgyzstan)","\321\200\321\203\321\201\321\201\320\272\320\270\320\271 (\320\232\320\270\321\200\320\263\320\270\320\267\320\270\321\217)" },
{ wxLANGUAGE_RUSSIAN_MOLDOVA, "ru-MD" , "ru_MD" , "" , 0x19, 0x02, wxLayout_LeftToRight, "Russian (Moldova)","\321\200\321\203\321\201\321\201\320\272\320\270\320\271 (\320\234\320\276\320\273\320\264\320\276\320\262\320\260)" },
{ wxLANGUAGE_RUSSIAN_RUSSIA, "ru-RU" , "ru_RU" , "" , 0x19, 0x01, wxLayout_LeftToRight, "Russian (Russia)","\321\200\321\203\321\201\321\201\320\272\320\270\320\271 (\320\240\320\276\321\201\321\201\320\270\321\217)" },
{ wxLANGUAGE_RUSSIAN_UKRAINE, "ru-UA" , "ru_UA" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Russian (Ukraine)","\321\200\321\203\321\201\321\201\320\272\320\270\320\271 (\320\243\320\272\321\200\320\260\320\270\320\275\320\260)" },
{ wxLANGUAGE_RWA, "rwk" , "rwk" , "rwk_TZ" , 0x00, 0x04, wxLayout_LeftToRight, "Rwa","Kiruwa" },
{ wxLANGUAGE_RWA_TANZANIA, "rwk-TZ" , "rwk_TZ" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Rwa (Tanzania)","Kiruwa (Tanzania)" },
{ wxLANGUAGE_SAHO, "ssy" , "ssy" , "ssy_ER" , 0x00, 0x04, wxLayout_LeftToRight, "Saho","Saho" },
{ wxLANGUAGE_SAHO_ERITREA, "ssy-ER" , "ssy_ER" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Saho (Eritrea)","Saho (Eretria)" },
{ wxLANGUAGE_SAKHA, "sah" , "sah" , "sah_RU" , 0x85, 0x01, wxLayout_LeftToRight, "Sakha","\321\201\320\260\321\205\320\260 \321\202\321\213\320\273\320\260" },
{ wxLANGUAGE_SAKHA_RUSSIA, "sah-RU" , "sah_RU" , "" , 0x85, 0x01, wxLayout_LeftToRight, "Sakha (Russia)","\321\201\320\260\321\205\320\260 \321\202\321\213\320\273\320\260 (\320\220\321\200\320\260\321\201\321\201\321\213\321\213\320\271\320\260)" },
{ wxLANGUAGE_SAMBURU, "saq" , "saq" , "saq_KE" , 0x00, 0x04, wxLayout_LeftToRight, "Samburu","Kisampur" },
{ wxLANGUAGE_SAMBURU_KENYA, "saq-KE" , "saq_KE" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Samburu (Kenya)","Kisampur (Kenya)" },
{ wxLANGUAGE_SAMI, "se" , "se" , "se_NO" , 0x3b, 0x01, wxLayout_LeftToRight, "Northern Sami","davvis\303\241megiella" },
{ wxLANGUAGE_SAMI_FINLAND, "se-FI" , "se_FI" , "" , 0x3b, 0x03, wxLayout_LeftToRight, "Sami, Northern (Finland)","davvis\303\241megiella (Suopma)" },
{ wxLANGUAGE_SAMI_INARI, "smn" , "smn" , "smn_FI" , 0x3b, 0x09, wxLayout_LeftToRight, "Sami (Inari)","anar\303\242\305\241kiel\303\242" },
{ wxLANGUAGE_SAMI_INARI_FINLAND, "smn-FI" , "smn_FI" , "" , 0x3b, 0x09, wxLayout_LeftToRight, "Sami, Inari (Finland)","anar\303\242\305\241kiel\303\242 (Suom\303\242)" },
{ wxLANGUAGE_SAMI_LULE, "smj" , "smj" , "smj_SE" , 0x3b, 0x05, wxLayout_LeftToRight, "Sami (Lule)","julevus\303\241megiella" },
{ wxLANGUAGE_SAMI_LULE_NORWAY, "smj-NO" , "smj_NO" , "" , 0x3b, 0x04, wxLayout_LeftToRight, "Sami, Lule (Norway)","julevus\303\241megiella (Vuodna)" },
{ wxLANGUAGE_SAMI_LULE_SWEDEN, "smj-SE" , "smj_SE" , "" , 0x3b, 0x05, wxLayout_LeftToRight, "Sami, Lule (Sweden)","julevus\303\241megiella (Svierik)" },
{ wxLANGUAGE_SAMI_NORWAY, "se-NO" , "se_NO" , "" , 0x3b, 0x01, wxLayout_LeftToRight, "Sami, Northern (Norway)","davvis\303\241megiella (Norga)" },
{ wxLANGUAGE_SAMI_SKOLT, "sms" , "sms" , "sms_FI" , 0x3b, 0x08, wxLayout_LeftToRight, "Sami (Skolt)","s\303\244\303\244\302\264m\307\251i\303\265ll" },
{ wxLANGUAGE_SAMI_SKOLT_FINLAND, "sms-FI" , "sms_FI" , "" , 0x3b, 0x08, wxLayout_LeftToRight, "Sami, Skolt (Finland)","s\303\244\303\244\302\264m\307\251i\303\265ll (L\303\244\303\244\302\264ddj\303\242nnam)" },
{ wxLANGUAGE_SAMI_SOUTHERN, "sma" , "sma" , "sma_SE" , 0x3b, 0x07, wxLayout_LeftToRight, "Sami (Southern)","\303\245arjelsaemieng\303\257ele" },
{ wxLANGUAGE_SAMI_SOUTHERN_NORWAY, "sma-NO" , "sma_NO" , "" , 0x3b, 0x06, wxLayout_LeftToRight, "Sami, Southern (Norway)","\303\245arjelsaemieng\303\257ele (N\303\266\303\266rje)" },
{ wxLANGUAGE_SAMI_SOUTHERN_SWEDEN, "sma-SE" , "sma_SE" , "" , 0x3b, 0x07, wxLayout_LeftToRight, "Sami, Southern (Sweden)","\303\245arjelsaemieng\303\257ele (Sveerje)" },
{ wxLANGUAGE_SAMI_SWEDEN, "se-SE" , "se_SE" , "" , 0x3b, 0x02, wxLayout_LeftToRight, "Sami, Northern (Sweden)","davvis\303\241megiella (Ruo\305\247\305\247a)" },
{ wxLANGUAGE_SAMOAN, "sm" , "sm" , "" , 0 , 0 , wxLayout_LeftToRight, "Samoan","Samoa" },
{ wxLANGUAGE_SANGHO, "sg" , "sg" , "sg_CF" , 0x00, 0x04, wxLayout_LeftToRight, "Sango","S\303\244ng\303\266" },
{ wxLANGUAGE_SANGHO_CENTRAL_AFRICAN_REPUBLIC, "sg-CF" , "sg_CF" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Sango (Central African Republic)","S\303\244ng\303\266 (K\303\266d\303\266r\303\266s\303\252se t\303\256 B\303\252afr\303\256ka)" },
{ wxLANGUAGE_SANGU, "sbp" , "sbp" , "sbp_TZ" , 0x00, 0x04, wxLayout_LeftToRight, "Sangu","Ishisangu" },
{ wxLANGUAGE_SANGU_TANZANIA, "sbp-TZ" , "sbp_TZ" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Sangu (Tanzania)","Ishisangu (Tansaniya)" },
{ wxLANGUAGE_SANSKRIT, "sa" , "sa" , "sa_IN" , 0x4f, 0x01, wxLayout_LeftToRight, "Sanskrit","\340\244\270\340\244\202\340\244\270\340\245\215\340\244\225\340\245\203\340\244\244 \340\244\255\340\244\276\340\244\267\340\244\276" },
{ wxLANGUAGE_SANSKRIT_INDIA, "sa-IN" , "sa_IN" , "" , 0x4f, 0x01, wxLayout_LeftToRight, "Sanskrit (India)","\340\244\270\340\244\202\340\244\270\340\245\215\340\244\225\340\245\203\340\244\244 \340\244\255\340\244\276\340\244\267\340\244\276 (\340\244\255\340\244\276\340\244\260\340\244\244\340\244\203)" },
{ wxLANGUAGE_SANTALI, "sat" , "sat" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Santali","\341\261\245\341\261\237\341\261\261\341\261\233\341\261\237\341\261\262\341\261\244" },
{ wxLANGUAGE_SANTALI_OL_CHIKI, "sat-Olck" , "sat@ol_chiki" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Santali (Ol Chiki)","\341\261\245\341\261\237\341\261\261\341\261\233\341\261\237\341\261\262\341\261\244 (\341\261\232\341\261\236 \341\261\252\341\261\244\341\261\240\341\261\244)" },
{ wxLANGUAGE_SANTALI_OL_CHIKI_INDIA, "sat-Olck-IN" , "sat_IN@ol_chiki" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Santali (Ol Chiki, India)","\341\261\245\341\261\237\341\261\261\341\261\233\341\261\237\341\261\262\341\261\244 (\341\261\244\341\261\261\341\261\260\341\261\244\341\261\255\341\261\237)" },
{ wxLANGUAGE_SCOTS_GAELIC, "gd" , "gd" , "gd_GB" , 0x91, 0x01, wxLayout_LeftToRight, "Scottish Gaelic","G\303\240idhlig" },
{ wxLANGUAGE_SCOTS_GAELIC_UK, "gd-GB" , "gd_GB" , "" , 0x91, 0x01, wxLayout_LeftToRight, "Scottish Gaelic (United Kingdom)","G\303\240idhlig (An R\303\254oghachd Aonaichte)" },
{ wxLANGUAGE_SENA, "seh" , "seh" , "seh_MZ" , 0x00, 0x04, wxLayout_LeftToRight, "Sena","sena" },
{ wxLANGUAGE_SENA_MOZAMBIQUE, "seh-MZ" , "seh_MZ" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Sena (Mozambique)","sena (Mo\303\247ambique)" },
{ wxLANGUAGE_SERBIAN, "sr" , "sr" , "sr_RS" , 0x1a, 0x01, wxLayout_LeftToRight, "Serbian","srpski" },
{ wxLANGUAGE_SERBIAN_CYRILLIC, "sr-Cyrl" , "sr@cyrillic" , "" , 0x1a, 0x0a, wxLayout_LeftToRight, "Serbian (Cyrillic)","\321\201\321\200\320\277\321\201\320\272\320\270 (\320\213\320\270\321\200\320\270\320\273\320\270\321\206\320\260)" },
{ wxLANGUAGE_SERBIAN_CYRILLIC_BOSNIA_AND_HERZEGOVINA, "sr-Cyrl-BA" , "sr_BA@cyrillic" , "" , 0x1a, 0x07, wxLayout_LeftToRight, "Serbian (Cyrillic, Bosnia and Herzegovina)","\321\201\321\200\320\277\321\201\320\272\320\270 (\320\221\320\276\321\201\320\275\320\260 \320\270 \320\245\320\265\321\200\321\206\320\265\320\263\320\276\320\262\320\270\320\275\320\260)" },
{ wxLANGUAGE_SERBIAN_CYRILLIC_KOSOVO, "sr-Cyrl-XK" , "sr_XK@cyrillic" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Serbian (Cyrillic, Kosovo)","\321\201\321\200\320\277\321\201\320\272\320\270 (\320\232\320\276\321\201\320\276\320\262\320\276)" },
{ wxLANGUAGE_SERBIAN_CYRILLIC_MONTENEGRO, "sr-Cyrl-ME" , "sr_ME@cyrillic" , "" , 0x1a, 0x0c, wxLayout_LeftToRight, "Serbian (Cyrillic, Montenegro)","\321\201\321\200\320\277\321\201\320\272\320\270 (\320\246\321\200\320\275\320\260 \320\223\320\276\321\200\320\260)" },
{ wxLANGUAGE_SERBIAN_CYRILLIC_SERBIA, "sr-Cyrl-RS" , "sr_RS@cyrillic" , "" , 0x1a, 0x0a, wxLayout_LeftToRight, "Serbian (Cyrillic, Serbia)","\321\201\321\200\320\277\321\201\320\272\320\270 (\320\241\321\200\320\261\320\270\321\230\320\260)" },
{ wxLANGUAGE_SERBIAN_CYRILLIC_YU, "sr-Cyrl-YU" , "sr_YU@cyrillic" , "" , 0x1a, 0x03, wxLayout_LeftToRight, "Serbian (Cyrillic)","\321\201\321\200\320\277\321\201\320\272\320\270 (\320\241\321\200\320\261\320\270\321\230\320\260)" },
{ wxLANGUAGE_SERBIAN_LATIN, "sr-Latn" , "sr@latin" , "" , 0x1a, 0x09, wxLayout_LeftToRight, "Serbian (Latin)","srpski (latinica)" },
{ wxLANGUAGE_SERBIAN_LATIN_BOSNIA_AND_HERZEGOVINA, "sr-Latn-BA" , "sr_BA@latin" , "" , 0x1a, 0x06, wxLayout_LeftToRight, "Serbian (Latin, Bosnia and Herzegovina)","srpski (Bosna i Hercegovina)" },
{ wxLANGUAGE_SERBIAN_LATIN_KOSOVO, "sr-Latn-XK" , "sr_XK@latin" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Serbian (Latin, Kosovo)","srpski (Kosovo)" },
{ wxLANGUAGE_SERBIAN_LATIN_MONTENEGRO, "sr-Latn-ME" , "sr_ME@latin" , "" , 0x1a, 0x0b, wxLayout_LeftToRight, "Serbian (Latin, Montenegro)","srpski (Crna Gora)" },
{ wxLANGUAGE_SERBIAN_LATIN_SERBIA, "sr-Latn-RS" , "sr_RS@latin" , "" , 0x1a, 0x09, wxLayout_LeftToRight, "Serbian (Latin, Serbia)","srpski (Srbija)" },
{ wxLANGUAGE_SERBIAN_LATIN_YU, "sr-Latn-YU" , "sr_YU@latin" , "" , 0x1a, 0x02, wxLayout_LeftToRight, "Serbian (Latin)","srpski (latinica)" },
{ wxLANGUAGE_SERBIAN_SERBIA, "sr-RS" , "sr_RS" , "" , 0x1a, 0x01, wxLayout_LeftToRight, "Serbian (Serbia)","srpski (Srbija)" },
{ wxLANGUAGE_SERBIAN_YU, "sr-YU" , "sr_YU" , "" , 0x1a, 0x01, wxLayout_LeftToRight, "Serbian","srpski" },
{ wxLANGUAGE_SERBO_CROATIAN, "sh" , "sh" , "" , 0 , 0 , wxLayout_LeftToRight, "Serbo-Croatian","srpskohrvatski" },
{ wxLANGUAGE_SESOTHO, "st" , "st" , "st_ZA" , 0x30, 0x01, wxLayout_LeftToRight, "Sesotho","Sesotho" },
{ wxLANGUAGE_SESOTHO_LESOTHO, "st-LS" , "st_LS" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Sesotho (Lesotho)","Sesotho (Lesotho)" },
{ wxLANGUAGE_SESOTHO_SA_LEBOA, "nso" , "nso" , "nso_ZA" , 0x6c, 0x01, wxLayout_LeftToRight, "Sesotho sa Leboa","Sesotho sa Leboa" },
{ wxLANGUAGE_SESOTHO_SA_LEBOA_SOUTH_AFRICA, "nso-ZA" , "nso_ZA" , "" , 0x6c, 0x01, wxLayout_LeftToRight, "Sesotho sa Leboa (South Africa)","Sesotho sa Leboa (Afrika Borwa)" },
{ wxLANGUAGE_SESOTHO_SOUTH_AFRICA, "st-ZA" , "st_ZA" , "" , 0x30, 0x01, wxLayout_LeftToRight, "Sesotho (South Africa)","Sesotho (South Africa)" },
{ wxLANGUAGE_SETSWANA, "tn" , "tn" , "tn_ZA" , 0x32, 0x01, wxLayout_LeftToRight, "Setswana","Setswana" },
{ wxLANGUAGE_SETSWANA_BOTSWANA, "tn-BW" , "tn_BW" , "" , 0x32, 0x02, wxLayout_LeftToRight, "Setswana (Botswana)","Setswana (Botswana)" },
{ wxLANGUAGE_SETSWANA_SOUTH_AFRICA, "tn-ZA" , "tn_ZA" , "" , 0x32, 0x01, wxLayout_LeftToRight, "Setswana (South Africa)","Setswana (Aforika Borwa)" },
{ wxLANGUAGE_SHAMBALA, "ksb" , "ksb" , "ksb_TZ" , 0x00, 0x04, wxLayout_LeftToRight, "Shambala","Kishambaa" },
{ wxLANGUAGE_SHAMBALA_TANZANIA, "ksb-TZ" , "ksb_TZ" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Shambala (Tanzania)","Kishambaa (Tanzania)" },
{ wxLANGUAGE_SHONA, "sn" , "sn" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Shona","chiShona" },
{ wxLANGUAGE_SHONA_LATIN, "sn-Latn" , "sn@latin" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Shona (Latin)","chiShona (Latin)" },
{ wxLANGUAGE_SHONA_LATIN_ZIMBABWE, "sn-Latn-ZW" , "sn_ZW@latin" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Shona (Latin, Zimbabwe)","chiShona (Zimbabwe)" },
{ wxLANGUAGE_SINDHI, "sd" , "sd" , "" , 0x59, 0x02, wxLayout_RightToLeft, "Sindhi","\330\263\331\206\332\214\331\212" },
{ wxLANGUAGE_SINDHI_ARABIC, "sd-Arab" , "sd@arabic" , "" , 0x59, 0x02, wxLayout_RightToLeft, "Sindhi","\330\263\331\206\332\214\331\212" },
{ wxLANGUAGE_SINDHI_DEVANAGARI, "sd-Deva" , "sd@devanagari" , "" , 0x59, 0x01, wxLayout_LeftToRight, "Sindhi (Devanagari)","\340\244\270\340\244\277\340\244\250\340\245\215\340\244\247\340\245\200" },
{ wxLANGUAGE_SINDHI_DEVANAGARI_INDIA, "sd-Deva-IN" , "sd_IN@devanagari" , "" , 0x59, 0x01, wxLayout_LeftToRight, "Sindhi (Devanagari, India)","\340\244\270\340\244\277\340\244\250\340\245\215\340\244\247\340\245\200 (\340\244\255\340\244\276\340\244\260\340\244\244)" },
{ wxLANGUAGE_SINDHI_PAKISTAN, "sd-Arab-PK" , "sd_PK@arabic" , "" , 0x59, 0x02, wxLayout_RightToLeft, "Sindhi (Pakistan)","\330\263\331\206\332\214\331\212 (\331\276\330\247\332\251\330\263\330\252\330\247\331\206)" },
{ wxLANGUAGE_SINHALESE, "si" , "si" , "si_LK" , 0x5b, 0x01, wxLayout_LeftToRight, "Sinhala","\340\267\203\340\267\222\340\266\202\340\267\204\340\266\275" },
{ wxLANGUAGE_SINHALESE_SRI_LANKA, "si-LK" , "si_LK" , "" , 0x5b, 0x01, wxLayout_LeftToRight, "Sinhala (Sri Lanka)","\340\267\203\340\267\222\340\266\202\340\267\204\340\266\275 (\340\267\201\340\267\212\342\200\215\340\266\273\340\267\223 \340\266\275\340\266\202\340\266\232\340\267\217\340\267\200)" },
{ wxLANGUAGE_SISWATI, "ss" , "ss" , "ss_ZA" , 0x00, 0x04, wxLayout_LeftToRight, "siSwati","Siswati" },
{ wxLANGUAGE_SISWATI_ESWATINI, "ss-SZ" , "ss_SZ" , "" , 0x00, 0x04, wxLayout_LeftToRight, "siSwati (Eswatini)","siSwati (eSwatini)" },
{ wxLANGUAGE_SISWATI_SOUTH_AFRICA, "ss-ZA" , "ss_ZA" , "" , 0x00, 0x04, wxLayout_LeftToRight, "siSwati (South Africa)","siSwati (South Africa)" },
{ wxLANGUAGE_SLOVAK, "sk" , "sk" , "sk_SK" , 0x1b, 0x01, wxLayout_LeftToRight, "Slovak","sloven\304\215ina" },
{ wxLANGUAGE_SLOVAK_SLOVAKIA, "sk-SK" , "sk_SK" , "" , 0x1b, 0x01, wxLayout_LeftToRight, "Slovak (Slovakia)","sloven\304\215ina (Slovensko)" },
{ wxLANGUAGE_SLOVENIAN, "sl" , "sl" , "sl_SI" , 0x24, 0x01, wxLayout_LeftToRight, "Slovenian","sloven\305\241\304\215ina" },
{ wxLANGUAGE_SLOVENIAN_SLOVENIA, "sl-SI" , "sl_SI" , "" , 0x24, 0x01, wxLayout_LeftToRight, "Slovenian (Slovenia)","sloven\305\241\304\215ina (Slovenija)" },
{ wxLANGUAGE_SOGA, "xog" , "xog" , "xog_UG" , 0x00, 0x04, wxLayout_LeftToRight, "Soga","Olusoga" },
{ wxLANGUAGE_SOGA_UGANDA, "xog-UG" , "xog_UG" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Soga (Uganda)","Olusoga (Yuganda)" },
{ wxLANGUAGE_SOMALI, "so" , "so" , "so_SO" , 0x77, 0x01, wxLayout_LeftToRight, "Somali","Soomaali" },
{ wxLANGUAGE_SOMALI_DJIBOUTI, "so-DJ" , "so_DJ" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Somali (Djibouti)","Soomaali (Jabuuti)" },
{ wxLANGUAGE_SOMALI_ETHIOPIA, "so-ET" , "so_ET" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Somali (Ethiopia)","Soomaali (Itoobiya)" },
{ wxLANGUAGE_SOMALI_KENYA, "so-KE" , "so_KE" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Somali (Kenya)","Soomaali (Kenya)" },
{ wxLANGUAGE_SOMALI_SOMALIA, "so-SO" , "so_SO" , "" , 0x77, 0x01, wxLayout_LeftToRight, "Somali (Somalia)","Soomaali (Soomaaliya)" },
{ wxLANGUAGE_SOUTH_NDEBELE, "nr" , "nr" , "nr_ZA" , 0x00, 0x04, wxLayout_LeftToRight, "South Ndebele","isiNdebele" },
{ wxLANGUAGE_SOUTH_NDEBELE_SOUTH_AFRICA, "nr-ZA" , "nr_ZA" , "" , 0x00, 0x04, wxLayout_LeftToRight, "South Ndebele (South Africa)","isiNdebele (South Africa)" },
{ wxLANGUAGE_SPANISH, "es" , "es" , "es_ES" , 0x0a, 0x03, wxLayout_LeftToRight, "Spanish","espa\303\261ol" },
{ wxLANGUAGE_SPANISH_ARGENTINA, "es-AR" , "es_AR" , "" , 0x0a, 0x0b, wxLayout_LeftToRight, "Spanish (Argentina)","espa\303\261ol (Argentina)" },
{ wxLANGUAGE_SPANISH_BELIZE, "es-BZ" , "es_BZ" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Spanish (Belize)","espa\303\261ol (Belice)" },
{ wxLANGUAGE_SPANISH_BOLIVIA, "es-BO" , "es_BO" , "" , 0x0a, 0x10, wxLayout_LeftToRight, "Spanish (Bolivia)","espa\303\261ol (Bolivia)" },
{ wxLANGUAGE_SPANISH_BRAZIL, "es-BR" , "es_BR" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Spanish (Brazil)","espa\303\261ol (Brasil)" },
{ wxLANGUAGE_SPANISH_CHILE, "es-CL" , "es_CL" , "" , 0x0a, 0x0d, wxLayout_LeftToRight, "Spanish (Chile)","espa\303\261ol (Chile)" },
{ wxLANGUAGE_SPANISH_COLOMBIA, "es-CO" , "es_CO" , "" , 0x0a, 0x09, wxLayout_LeftToRight, "Spanish (Colombia)","espa\303\261ol (Colombia)" },
{ wxLANGUAGE_SPANISH_COSTA_RICA, "es-CR" , "es_CR" , "" , 0x0a, 0x05, wxLayout_LeftToRight, "Spanish (Costa Rica)","espa\303\261ol (Costa Rica)" },
{ wxLANGUAGE_SPANISH_CUBA, "es-CU" , "es_CU" , "" , 0x0a, 0x17, wxLayout_LeftToRight, "Spanish (Cuba)","espa\303\261ol (Cuba)" },
{ wxLANGUAGE_SPANISH_DOMINICAN_REPUBLIC, "es-DO" , "es_DO" , "" , 0x0a, 0x07, wxLayout_LeftToRight, "Spanish (Dominican Republic)","espa\303\261ol (Rep\303\272blica Dominicana)" },
{ wxLANGUAGE_SPANISH_ECUADOR, "es-EC" , "es_EC" , "" , 0x0a, 0x0c, wxLayout_LeftToRight, "Spanish (Ecuador)","espa\303\261ol (Ecuador)" },
{ wxLANGUAGE_SPANISH_EL_SALVADOR, "es-SV" , "es_SV" , "" , 0x0a, 0x11, wxLayout_LeftToRight, "Spanish (El Salvador)","espa\303\261ol (El Salvador)" },
{ wxLANGUAGE_SPANISH_EQUATORIAL_GUINEA, "es-GQ" , "es_GQ" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Spanish (Equatorial Guinea)","espa\303\261ol (Guinea Ecuatorial)" },
{ wxLANGUAGE_SPANISH_GUATEMALA, "es-GT" , "es_GT" , "" , 0x0a, 0x04, wxLayout_LeftToRight, "Spanish (Guatemala)","espa\303\261ol (Guatemala)" },
{ wxLANGUAGE_SPANISH_HONDURAS, "es-HN" , "es_HN" , "" , 0x0a, 0x12, wxLayout_LeftToRight, "Spanish (Honduras)","espa\303\261ol (Honduras)" },
{ wxLANGUAGE_SPANISH_LATIN_AMERICA, "es-419" , "es_419" , "" , 0x0a, 0x16, wxLayout_LeftToRight, "Spanish (Latin America)","espa\303\261ol (Latinoam\303\251rica)" },
{ wxLANGUAGE_SPANISH_MEXICAN, "es-MX" , "es_MX" , "" , 0x0a, 0x02, wxLayout_LeftToRight, "Spanish (Mexico)","espa\303\261ol (M\303\251xico)" },
{ wxLANGUAGE_SPANISH_NICARAGUA, "es-NI" , "es_NI" , "" , 0x0a, 0x13, wxLayout_LeftToRight, "Spanish (Nicaragua)","espa\303\261ol (Nicaragua)" },
{ wxLANGUAGE_SPANISH_PANAMA, "es-PA" , "es_PA" , "" , 0x0a, 0x06, wxLayout_LeftToRight, "Spanish (Panama)","espa\303\261ol (Panam\303\241)" },
{ wxLANGUAGE_SPANISH_PARAGUAY, "es-PY" , "es_PY" , "" , 0x0a, 0x0f, wxLayout_LeftToRight, "Spanish (Paraguay)","espa\303\261ol (Paraguay)" },
{ wxLANGUAGE_SPANISH_PERU, "es-PE" , "es_PE" , "" , 0x0a, 0x0a, wxLayout_LeftToRight, "Spanish (Peru)","espa\303\261ol (Per\303\272)" },
{ wxLANGUAGE_SPANISH_PHILIPPINES, "es-PH" , "es_PH" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Spanish (Philippines)","espa\303\261ol (Filipinas)" },
{ wxLANGUAGE_SPANISH_PUERTO_RICO, "es-PR" , "es_PR" , "" , 0x0a, 0x14, wxLayout_LeftToRight, "Spanish (Puerto Rico)","espa\303\261ol (Puerto Rico)" },
{ wxLANGUAGE_SPANISH_SPAIN, "es-ES" , "es_ES" , "" , 0x0a, 0x03, wxLayout_LeftToRight, "Spanish (Spain, International Sort)","espa\303\261ol (Espa\303\261a, alfabetizaci\303\263n internacional)" },
{ wxLANGUAGE_SPANISH_URUGUAY, "es-UY" , "es_UY" , "" , 0x0a, 0x0e, wxLayout_LeftToRight, "Spanish (Uruguay)","espa\303\261ol (Uruguay)" },
{ wxLANGUAGE_SPANISH_US, "es-US" , "es_US" , "" , 0x0a, 0x15, wxLayout_LeftToRight, "Spanish (United States)","espa\303\261ol (Estados Unidos)" },
{ wxLANGUAGE_SPANISH_VENEZUELA, "es-VE" , "es_VE" , "" , 0x0a, 0x08, wxLayout_LeftToRight, "Spanish (Venezuela)","espa\303\261ol (Venezuela)" },
{ wxLANGUAGE_STANDARD_MOROCCAN_TAMAZIGHT, "zgh" , "zgh" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Standard Moroccan Tamazight","\342\265\234\342\264\260\342\265\216\342\264\260\342\265\243\342\265\211\342\265\226\342\265\234" },
{ wxLANGUAGE_STANDARD_MOROCCAN_TAMAZIGHT_TIFINAGH, "zgh-Tfng" , "zgh@tifinagh" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Standard Moroccan Tamazight (Tifinagh)","\342\265\234\342\264\260\342\265\216\342\264\260\342\265\243\342\265\211\342\265\226\342\265\234 (Tifinagh)" },
{ wxLANGUAGE_STANDARD_MOROCCAN_TAMAZIGHT_TIFINAGH_MOROCCO, "zgh-Tfng-MA" , "zgh_MA@tifinagh" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Standard Moroccan Tamazight (Tifinagh, Morocco)","\342\265\234\342\264\260\342\265\216\342\264\260\342\265\243\342\265\211\342\265\226\342\265\234 (\342\265\215\342\265\216\342\265\226\342\265\224\342\265\211\342\264\261)" },
{ wxLANGUAGE_SUNDANESE, "su" , "su" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Sundanese","Basa Sunda" },
{ wxLANGUAGE_SUNDANESE_LATIN, "su-Latn" , "su@latin" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Sundanese (Latin)","Basa Sunda (Latin)" },
{ wxLANGUAGE_SUNDANESE_LATIN_INDONESIA, "su-Latn-ID" , "su_ID@latin" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Sundanese (Latin, Indonesia)","Basa Sunda (Indonesia)" },
{ wxLANGUAGE_SWAHILI, "sw" , "sw" , "sw_KE" , 0x41, 0x01, wxLayout_LeftToRight, "Kiswahili","Kiswahili" },
{ wxLANGUAGE_SWAHILI_CONGO_DRC, "sw-CD" , "sw_CD" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Kiswahili (Congo DRC)","Kiswahili (Jamhuri ya Kidemokrasia ya Kongo)" },
{ wxLANGUAGE_SWAHILI_KENYA, "sw-KE" , "sw_KE" , "" , 0x41, 0x01, wxLayout_LeftToRight, "Kiswahili (Kenya)","Kiswahili (Kenya)" },
{ wxLANGUAGE_SWAHILI_TANZANIA, "sw-TZ" , "sw_TZ" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Kiswahili (Tanzania)","Kiswahili (Tanzania)" },
{ wxLANGUAGE_SWAHILI_UGANDA, "sw-UG" , "sw_UG" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Kiswahili (Uganda)","Kiswahili (Uganda)" },
{ wxLANGUAGE_SWEDISH, "sv" , "sv" , "sv_SE" , 0x1d, 0x01, wxLayout_LeftToRight, "Swedish","svenska" },
{ wxLANGUAGE_SWEDISH_ALAND_ISLANDS, "sv-AX" , "sv_AX" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Swedish (\303\205land Islands)","svenska (\303\205land)" },
{ wxLANGUAGE_SWEDISH_FINLAND, "sv-FI" , "sv_FI" , "" , 0x1d, 0x02, wxLayout_LeftToRight, "Swedish (Finland)","svenska (Finland)" },
{ wxLANGUAGE_SWEDISH_SWEDEN, "sv-SE" , "sv_SE" , "" , 0x1d, 0x01, wxLayout_LeftToRight, "Swedish (Sweden)","svenska (Sverige)" },
{ wxLANGUAGE_SWISS_GERMAN, "gsw" , "gsw" , "gsw_CH" , 0x00, 0x04, wxLayout_LeftToRight, "Swiss German","Schwiizert\303\274\303\274tsch" },
{ wxLANGUAGE_SWISS_GERMAN_LIECHTENSTEIN, "gsw-LI" , "gsw_LI" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Swiss German (Liechtenstein)","Schwiizert\303\274\303\274tsch (Li\303\244chtescht\303\244i)" },
{ wxLANGUAGE_SWISS_GERMAN_SWITZERLAND, "gsw-CH" , "gsw_CH" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Swiss German (Switzerland)","Schwiizert\303\274\303\274tsch (Schwiiz)" },
{ wxLANGUAGE_SYRIAC, "syr" , "syr" , "syr_SY" , 0x5a, 0x01, wxLayout_RightToLeft, "Syriac","\334\243\334\230\334\252\334\235\334\235\334\220" },
{ wxLANGUAGE_SYRIAC_SYRIA, "syr-SY" , "syr_SY" , "" , 0x5a, 0x01, wxLayout_RightToLeft, "Syriac (Syria)","\334\243\334\230\334\252\334\235\334\235\334\220 (\334\243\334\230\334\252\334\235\334\220)" },
{ wxLANGUAGE_TACHELHIT, "shi" , "shi" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Tachelhit","\342\265\234\342\264\260\342\265\233\342\265\215\342\265\203\342\265\211\342\265\234" },
{ wxLANGUAGE_TACHELHIT_LATIN, "shi-Latn" , "shi@latin" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Tachelhit (Latin)","Tashel\341\270\245iyt (Latin)" },
{ wxLANGUAGE_TACHELHIT_LATIN_MOROCCO, "shi-Latn-MA" , "shi_MA@latin" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Tachelhit (Latin, Morocco)","Tashel\341\270\245iyt (lm\311\243rib)" },
{ wxLANGUAGE_TACHELHIT_TIFINAGH, "shi-Tfng" , "shi@tifinagh" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Tachelhit (Tifinagh)","\342\265\234\342\264\260\342\265\233\342\265\215\342\265\203\342\265\211\342\265\234 (Tifinagh)" },
{ wxLANGUAGE_TACHELHIT_TIFINAGH_MOROCCO, "shi-Tfng-MA" , "shi_MA@tifinagh" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Tachelhit (Tifinagh, Morocco)","\342\265\234\342\264\260\342\265\233\342\265\215\342\265\203\342\265\211\342\265\234 (\342\265\215\342\265\216\342\265\226\342\265\224\342\265\211\342\264\261)" },
{ wxLANGUAGE_TAGALOG, "tl" , "tl" , "tl_PH" , 0 , 0 , wxLayout_LeftToRight, "Tagalog","Tagalog" },
{ wxLANGUAGE_TAGALOG_PHILIPPINES, "tl-PH" , "tl_PH" , "" , 0 , 0 , wxLayout_LeftToRight, "Tagalog (Philippines)","Tagalog (Pilipinas)" },
{ wxLANGUAGE_TAITA, "dav" , "dav" , "dav_KE" , 0x00, 0x04, wxLayout_LeftToRight, "Taita","Kitaita" },
{ wxLANGUAGE_TAITA_KENYA, "dav-KE" , "dav_KE" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Taita (Kenya)","Kitaita (Kenya)" },
{ wxLANGUAGE_TAJIK, "tg" , "tg" , "" , 0x28, 0x01, wxLayout_LeftToRight, "Tajik","\320\242\320\276\322\267\320\270\320\272\323\243" },
{ wxLANGUAGE_TAJIK_CYRILLIC, "tg-Cyrl" , "tg@cyrillic" , "" , 0x28, 0x01, wxLayout_LeftToRight, "Tajik (Cyrillic)","\320\242\320\276\322\267\320\270\320\272\323\243 (\320\232\320\270\321\200\320\270\320\273\320\273\320\270\320\272\323\243)" },
{ wxLANGUAGE_TAJIK_CYRILLIC_TAJIKISTAN, "tg-Cyrl-TJ" , "tg_TJ@cyrillic" , "" , 0x28, 0x01, wxLayout_LeftToRight, "Tajik (Cyrillic, Tajikistan)","\321\202\320\276\322\267\320\270\320\272\323\243 (\320\242\320\276\322\267\320\270\320\272\320\270\321\201\321\202\320\276\320\275)" },
{ wxLANGUAGE_TAMIL, "ta" , "ta" , "ta_IN" , 0x49, 0x01, wxLayout_LeftToRight, "Tamil","\340\256\244\340\256\256\340\256\277\340\256\264\340\257\215" },
{ wxLANGUAGE_TAMIL_INDIA, "ta-IN" , "ta_IN" , "" , 0x49, 0x01, wxLayout_LeftToRight, "Tamil (India)","\340\256\244\340\256\256\340\256\277\340\256\264\340\257\215 (\340\256\207\340\256\250\340\257\215\340\256\244\340\256\277\340\256\257\340\256\276)" },
{ wxLANGUAGE_TAMIL_MALAYSIA, "ta-MY" , "ta_MY" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Tamil (Malaysia)","\340\256\244\340\256\256\340\256\277\340\256\264\340\257\215 (\340\256\256\340\256\262\340\257\207\340\256\232\340\256\277\340\256\257\340\256\276)" },
{ wxLANGUAGE_TAMIL_SINGAPORE, "ta-SG" , "ta_SG" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Tamil (Singapore)","\340\256\244\340\256\256\340\256\277\340\256\264\340\257\215 (\340\256\232\340\256\277\340\256\231\340\257\215\340\256\225\340\256\252\340\257\215\340\256\252\340\257\202\340\256\260\340\257\215)" },
{ wxLANGUAGE_TAMIL_SRI_LANKA, "ta-LK" , "ta_LK" , "" , 0x49, 0x02, wxLayout_LeftToRight, "Tamil (Sri Lanka)","\340\256\244\340\256\256\340\256\277\340\256\264\340\257\215 (\340\256\207\340\256\262\340\256\231\340\257\215\340\256\225\340\257\210)" },
{ wxLANGUAGE_TASAWAQ, "twq" , "twq" , "twq_NE" , 0x00, 0x04, wxLayout_LeftToRight, "Tasawaq","Tasawaq senni" },
{ wxLANGUAGE_TASAWAQ_NIGER, "twq-NE" , "twq_NE" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Tasawaq (Niger)","Tasawaq senni (Ni\305\276er)" },
{ wxLANGUAGE_TATAR, "tt" , "tt" , "tt_RU" , 0x44, 0x01, wxLayout_LeftToRight, "Tatar","\321\202\320\260\321\202\320\260\321\200" },
{ wxLANGUAGE_TATAR_RUSSIA, "tt-RU" , "tt_RU" , "" , 0x44, 0x01, wxLayout_LeftToRight, "Tatar (Russia)","\321\202\320\260\321\202\320\260\321\200 (\320\240\320\276\321\201\321\201\320\270\321\217)" },
{ wxLANGUAGE_TELUGU, "te" , "te" , "te_IN" , 0x4a, 0x01, wxLayout_LeftToRight, "Telugu","\340\260\244\340\261\206\340\260\262\340\261\201\340\260\227\340\261\201" },
{ wxLANGUAGE_TELUGU_INDIA, "te-IN" , "te_IN" , "" , 0x4a, 0x01, wxLayout_LeftToRight, "Telugu (India)","\340\260\244\340\261\206\340\260\262\340\261\201\340\260\227\340\261\201 (\340\260\255\340\260\276\340\260\260\340\260\244\340\260\246\340\261\207\340\260\266\340\260\202)" },
{ wxLANGUAGE_TESO, "teo" , "teo" , "teo_UG" , 0x00, 0x04, wxLayout_LeftToRight, "Teso","Kiteso" },
{ wxLANGUAGE_TESO_KENYA, "teo-KE" , "teo_KE" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Teso (Kenya)","Kiteso (Kenia)" },
{ wxLANGUAGE_TESO_UGANDA, "teo-UG" , "teo_UG" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Teso (Uganda)","Kiteso (Uganda)" },
{ wxLANGUAGE_THAI, "th" , "th" , "th_TH" , 0x1e, 0x01, wxLayout_LeftToRight, "Thai","\340\271\204\340\270\227\340\270\242" },
{ wxLANGUAGE_THAI_THAILAND, "th-TH" , "th_TH" , "" , 0x1e, 0x01, wxLayout_LeftToRight, "Thai (Thailand)","\340\271\204\340\270\227\340\270\242 (\340\271\204\340\270\227\340\270\242)" },
{ wxLANGUAGE_TIBETAN, "bo" , "bo" , "bo_CN" , 0x51, 0x01, wxLayout_LeftToRight, "Tibetan","\340\275\226\340\275\274\340\275\221\340\274\213\340\275\246\340\276\220\340\275\221\340\274\213" },
{ wxLANGUAGE_TIBETAN_CHINA, "bo-CN" , "bo_CN" , "" , 0x51, 0x01, wxLayout_LeftToRight, "Tibetan (China)","\340\275\226\340\275\274\340\275\221\340\274\213\340\275\246\340\276\220\340\275\221\340\274\213 (\340\275\242\340\276\222\340\276\261\340\274\213\340\275\223\340\275\202)" },
{ wxLANGUAGE_TIBETAN_INDIA, "bo-IN" , "bo_IN" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Tibetan (India)","\340\275\226\340\275\274\340\275\221\340\274\213\340\275\246\340\276\220\340\275\221\340\274\213 (\340\275\242\340\276\222\340\276\261\340\274\213\340\275\202\340\275\242\340\274\213)" },
{ wxLANGUAGE_TIGRE, "tig" , "tig" , "tig_ER" , 0x00, 0x04, wxLayout_LeftToRight, "Tigre","\341\211\265\341\214\215\341\210\250" },
{ wxLANGUAGE_TIGRE_ERITREA, "tig-ER" , "tig_ER" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Tigre (Eritrea)","\341\211\265\341\214\215\341\210\250 (\341\212\244\341\210\255\341\211\265\341\210\253)" },
{ wxLANGUAGE_TIGRINYA, "ti" , "ti" , "ti_ER" , 0x73, 0x02, wxLayout_LeftToRight, "Tigrinya","\341\211\265\341\214\215\341\210\255" },
{ wxLANGUAGE_TIGRINYA_ERITREA, "ti-ER" , "ti_ER" , "" , 0x73, 0x02, wxLayout_LeftToRight, "Tigrinya (Eritrea)","\341\211\265\341\214\215\341\210\255 (\341\212\244\341\210\255\341\211\265\341\210\253)" },
{ wxLANGUAGE_TIGRINYA_ETHIOPIA, "ti-ET" , "ti_ET" , "" , 0x73, 0x01, wxLayout_LeftToRight, "Tigrinya (Ethiopia)","\341\211\265\341\214\215\341\210\255 (\341\212\242\341\211\265\341\213\256\341\214\265\341\213\253)" },
{ wxLANGUAGE_TONGA, "to" , "to" , "to_TO" , 0x00, 0x04, wxLayout_LeftToRight, "Tongan","lea fakatonga" },
{ wxLANGUAGE_TONGA_TONGA, "to-TO" , "to_TO" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Tongan (Tonga)","lea fakatonga (Tonga)" },
{ wxLANGUAGE_TSONGA, "ts" , "ts" , "ts_ZA" , 0x31, 0x01, wxLayout_LeftToRight, "Xitsonga","Xitsonga" },
{ wxLANGUAGE_TSONGA_SOUTH_AFRICA, "ts-ZA" , "ts_ZA" , "" , 0x31, 0x01, wxLayout_LeftToRight, "Xitsonga (South Africa)","Xitsonga (South Africa)" },
{ wxLANGUAGE_TURKISH, "tr" , "tr" , "tr_TR" , 0x1f, 0x01, wxLayout_LeftToRight, "Turkish","T\303\274rk\303\247e" },
{ wxLANGUAGE_TURKISH_CYPRUS, "tr-CY" , "tr_CY" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Turkish (Cyprus)","T\303\274rk\303\247e (K\304\261br\304\261s)" },
{ wxLANGUAGE_TURKISH_TURKIYE, "tr-TR" , "tr_TR" , "" , 0x1f, 0x01, wxLayout_LeftToRight, "Turkish (T\303\274rkiye)","T\303\274rk\303\247e (T\303\274rkiye)" },
{ wxLANGUAGE_TURKMEN, "tk" , "tk" , "tk_TM" , 0x42, 0x01, wxLayout_LeftToRight, "Turkmen","t\303\274rkmen dili" },
{ wxLANGUAGE_TURKMEN_TURKMENISTAN, "tk-TM" , "tk_TM" , "" , 0x42, 0x01, wxLayout_LeftToRight, "Turkmen (Turkmenistan)","t\303\274rkmen dili (T\303\274rkmenistan)" },
{ wxLANGUAGE_TWI, "tw" , "tw" , "" , 0 , 0 , wxLayout_LeftToRight, "Twi","Twi" },
{ wxLANGUAGE_UIGHUR, "ug" , "ug" , "ug_CN" , 0x80, 0x01, wxLayout_RightToLeft, "Uyghur","\330\246\333\207\331\212\330\272\333\207\330\261\332\206\333\225" },
{ wxLANGUAGE_UIGHUR_CHINA, "ug-CN" , "ug_CN" , "" , 0x80, 0x01, wxLayout_RightToLeft, "Uyghur (China)","\330\246\333\207\331\212\330\272\333\207\330\261\332\206\333\225 (\330\254\333\207\332\255\330\256\333\207\330\247 \330\256\333\225\331\204\331\202 \330\254\333\207\331\205\332\276\333\207\330\261\331\211\331\212\331\211\330\252\331\211)" },
{ wxLANGUAGE_UKRAINIAN, "uk" , "uk" , "uk_UA" , 0x22, 0x01, wxLayout_LeftToRight, "Ukrainian","\321\203\320\272\321\200\320\260\321\227\320\275\321\201\321\214\320\272\320\260" },
{ wxLANGUAGE_UKRAINIAN_UKRAINE, "uk-UA" , "uk_UA" , "" , 0x22, 0x01, wxLayout_LeftToRight, "Ukrainian (Ukraine)","\321\203\320\272\321\200\320\260\321\227\320\275\321\201\321\214\320\272\320\260 (\320\243\320\272\321\200\320\260\321\227\320\275\320\260)" },
{ wxLANGUAGE_UPPER_SORBIAN, "hsb" , "hsb" , "hsb_DE" , 0x2e, 0x01, wxLayout_LeftToRight, "Upper Sorbian","hornjoserb\305\241\304\207ina" },
{ wxLANGUAGE_UPPER_SORBIAN_GERMANY, "hsb-DE" , "hsb_DE" , "" , 0x2e, 0x01, wxLayout_LeftToRight, "Upper Sorbian (Germany)","hornjoserb\305\241\304\207ina (N\304\233mska)" },
{ wxLANGUAGE_URDU, "ur" , "ur" , "ur_PK" , 0x20, 0x01, wxLayout_RightToLeft, "Urdu","\330\247\330\261\330\257\331\210" },
{ wxLANGUAGE_URDU_INDIA, "ur-IN" , "ur_IN" , "" , 0x20, 0x02, wxLayout_RightToLeft, "Urdu (India)","\330\247\330\261\330\257\331\210 (\330\250\332\276\330\247\330\261\330\252)" },
{ wxLANGUAGE_URDU_PAKISTAN, "ur-PK" , "ur_PK" , "" , 0x20, 0x01, wxLayout_RightToLeft, "Urdu (Pakistan)","\330\247\330\261\330\257\331\210 (\331\276\330\247\332\251\330\263\330\252\330\247\331\206)" },
{ wxLANGUAGE_UZBEK, "uz" , "uz" , "" , 0x43, 0x01, wxLayout_LeftToRight, "Uzbek","o\342\200\230zbek" },
{ wxLANGUAGE_UZBEK_ARABIC, "uz-Arab" , "uz@arabic" , "" , 0x00, 0x04, wxLayout_RightToLeft, "Uzbek (Arabic)","\330\247\331\210\330\262\330\250\333\214\332\251 (\330\271\330\261\330\250\333\214)" },
{ wxLANGUAGE_UZBEK_ARABIC_AFGHANISTAN, "uz-Arab-AF" , "uz_AF@arabic" , "" , 0x00, 0x04, wxLayout_RightToLeft, "Uzbek (Arabic, Afghanistan)","\330\247\331\210\330\262\330\250\333\214\332\251 (\330\247\331\201\330\272\330\247\331\206\330\263\330\252\330\247\331\206)" },
{ wxLANGUAGE_UZBEK_CYRILLIC, "uz-Cyrl" , "uz@cyrillic" , "" , 0x43, 0x02, wxLayout_LeftToRight, "Uzbek (Cyrillic)","\320\216\320\267\320\261\320\265\320\272 (\320\232\320\270\321\200\320\270\320\273)" },
{ wxLANGUAGE_UZBEK_CYRILLIC_UZBEKISTAN, "uz-Cyrl-UZ" , "uz_UZ@cyrillic" , "" , 0x43, 0x02, wxLayout_LeftToRight, "Uzbek (Cyrillic, Uzbekistan)","\321\236\320\267\320\261\320\265\320\272\321\207\320\260 (\320\216\320\267\320\261\320\265\320\272\320\270\321\201\321\202\320\276\320\275)" },
{ wxLANGUAGE_UZBEK_LATIN, "uz-Latn" , "uz@latin" , "" , 0x43, 0x01, wxLayout_LeftToRight, "Uzbek (Latin)","o\342\200\230zbek" },
{ wxLANGUAGE_UZBEK_LATIN_UZBEKISTAN, "uz-Latn-UZ" , "uz_UZ@latin" , "" , 0x43, 0x01, wxLayout_LeftToRight, "Uzbek (Latin, Uzbekistan)","o\342\200\230zbek (O\312\273zbekiston)" },
{ wxLANGUAGE_VAI, "vai" , "vai" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Vai","\352\225\231\352\224\244" },
{ wxLANGUAGE_VAI_LATIN, "vai-Latn" , "vai@latin" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Vai (Latin)","Vai (Latin)" },
{ wxLANGUAGE_VAI_LATIN_LIBERIA, "vai-Latn-LR" , "vai_LR@latin" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Vai (Latin, Liberia)","Vai (Laibhiya)" },
{ wxLANGUAGE_VAI_VAI, "vai-Vaii" , "vai@vai" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Vai (Vai)","\352\225\231\352\224\244 (Vai)" },
{ wxLANGUAGE_VAI_VAI_LIBERIA, "vai-Vaii-LR" , "vai_LR@vai" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Vai (Vai, Liberia)","\352\225\231\352\224\244 (\352\225\236\352\224\244\352\224\253\352\225\251)" },
{ wxLANGUAGE_VALENCIAN, "ca-ES-valencia" , "ca_ES@valencia" , "" , 0x03, 0x02, wxLayout_LeftToRight, "Valencian (Spain)","valenci\303\240 (Espanya)" },
{ wxLANGUAGE_VENDA, "ve" , "ve" , "ve_ZA" , 0x33, 0x01, wxLayout_LeftToRight, "Venda","Tshiven\341\270\223a" },
{ wxLANGUAGE_VENDA_SOUTH_AFRICA, "ve-ZA" , "ve_ZA" , "" , 0x33, 0x01, wxLayout_LeftToRight, "Venda (South Africa)","Tshiven\341\270\223a (South Africa)" },
{ wxLANGUAGE_VIETNAMESE, "vi" , "vi" , "vi_VN" , 0x2a, 0x01, wxLayout_LeftToRight, "Vietnamese","Ti\341\272\277ng Vi\341\273\207t" },
{ wxLANGUAGE_VIETNAMESE_VIETNAM, "vi-VN" , "vi_VN" , "" , 0x2a, 0x01, wxLayout_LeftToRight, "Vietnamese (Vietnam)","Ti\341\272\277ng Vi\341\273\207t (Vi\341\273\207t Nam)" },
{ wxLANGUAGE_VOLAPUK, "vo" , "vo" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Volap\303\274k","Volap\303\274k" },
{ wxLANGUAGE_VOLAPUK_WORLD, "vo-001" , "vo_001" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Volap\303\274k (World)","Volap\303\274k (World)" },
{ wxLANGUAGE_VUNJO, "vun" , "vun" , "vun_TZ" , 0x00, 0x04, wxLayout_LeftToRight, "Vunjo","Kyivunjo" },
{ wxLANGUAGE_VUNJO_TANZANIA, "vun-TZ" , "vun_TZ" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Vunjo (Tanzania)","Kyivunjo (Tanzania)" },
{ wxLANGUAGE_WALSER, "wae" , "wae" , "wae_CH" , 0x00, 0x04, wxLayout_LeftToRight, "Walser","Walser" },
{ wxLANGUAGE_WALSER_SWITZERLAND, "wae-CH" , "wae_CH" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Walser (Switzerland)","Walser (Schwiz)" },
{ wxLANGUAGE_WELSH, "cy" , "cy" , "cy_GB" , 0x52, 0x01, wxLayout_LeftToRight, "Welsh","Cymraeg" },
{ wxLANGUAGE_WELSH_UK, "cy-GB" , "cy_GB" , "" , 0x52, 0x01, wxLayout_LeftToRight, "Welsh (United Kingdom)","Cymraeg (Y Deyrnas Unedig)" },
{ wxLANGUAGE_WOLAYTTA, "wal" , "wal" , "wal_ET" , 0x00, 0x04, wxLayout_LeftToRight, "Wolaytta","\341\213\210\341\210\213\341\213\255\341\211\263\341\211\261" },
{ wxLANGUAGE_WOLAYTTA_ETHIOPIA, "wal-ET" , "wal_ET" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Wolaytta (Ethiopia)","\341\213\210\341\210\213\341\213\255\341\211\263\341\211\261 (\341\212\242\341\211\265\341\213\256\341\214\265\341\213\253)" },
{ wxLANGUAGE_WOLOF, "wo" , "wo" , "wo_SN" , 0x88, 0x01, wxLayout_LeftToRight, "Wolof","Wolof" },
{ wxLANGUAGE_WOLOF_SENEGAL, "wo-SN" , "wo_SN" , "" , 0x88, 0x01, wxLayout_LeftToRight, "Wolof (Senegal)","Wolof (Senegaal)" },
{ wxLANGUAGE_XHOSA, "xh" , "xh" , "xh_ZA" , 0x34, 0x01, wxLayout_LeftToRight, "isiXhosa","isiXhosa" },
{ wxLANGUAGE_XHOSA_SOUTH_AFRICA, "xh-ZA" , "xh_ZA" , "" , 0x34, 0x01, wxLayout_LeftToRight, "isiXhosa (South Africa)","isiXhosa (eMzantsi Afrika)" },
{ wxLANGUAGE_YANGBEN, "yav" , "yav" , "yav_CM" , 0x00, 0x04, wxLayout_LeftToRight, "Yangben","nuasue" },
{ wxLANGUAGE_YANGBEN_CAMEROON, "yav-CM" , "yav_CM" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Yangben (Cameroon)","nuasue (Kemel\303\272n)" },
{ wxLANGUAGE_YI, "ii" , "ii" , "ii_CN" , 0x78, 0x01, wxLayout_LeftToRight, "Yi","\352\206\210\352\214\240\352\211\231" },
{ wxLANGUAGE_YIDDISH, "yi" , "yi" , "" , 0x3d, 0x01, wxLayout_RightToLeft, "Yiddish","\327\231\327\231\326\264\327\223\327\231\327\251" },
{ wxLANGUAGE_YIDDISH_WORLD, "yi-001" , "yi_001" , "" , 0x3d, 0x01, wxLayout_RightToLeft, "Yiddish (World)","\327\231\327\231\326\264\327\223\327\231\327\251 (\327\225\327\225\327\242\327\234\327\230)" },
{ wxLANGUAGE_YI_CHINA, "ii-CN" , "ii_CN" , "" , 0x78, 0x01, wxLayout_LeftToRight, "Yi (China)","\352\206\210\352\214\240\352\211\231 (\352\215\217\352\207\251)" },
{ wxLANGUAGE_YORUBA, "yo" , "yo" , "yo_NG" , 0x6a, 0x01, wxLayout_LeftToRight, "Yoruba","\303\210d\303\250 Yor\303\271b\303\241" },
{ wxLANGUAGE_YORUBA_BENIN, "yo-BJ" , "yo_BJ" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Yoruba (Benin)","\303\210d\303\250 Yor\303\271b\303\241 (B\311\233\314\200n\311\233\314\200)" },
{ wxLANGUAGE_YORUBA_NIGERIA, "yo-NG" , "yo_NG" , "" , 0x6a, 0x01, wxLayout_LeftToRight, "Yoruba (Nigeria)","\303\210d\303\250 Yor\303\271b\303\241 (N\303\240\303\254j\303\255r\303\255\303\240)" },
{ wxLANGUAGE_ZARMA, "dje" , "dje" , "dje_NE" , 0x00, 0x04, wxLayout_LeftToRight, "Zarma","Zarmaciine" },
{ wxLANGUAGE_ZARMA_NIGER, "dje-NE" , "dje_NE" , "" , 0x00, 0x04, wxLayout_LeftToRight, "Zarma (Niger)","Zarmaciine (Ni\305\276er)" },
{ wxLANGUAGE_ZHUANG, "za" , "za" , "" , 0 , 0 , wxLayout_LeftToRight, "Zhuang","Zhuang" },
{ wxLANGUAGE_ZULU, "zu" , "zu" , "zu_ZA" , 0x35, 0x01, wxLayout_LeftToRight, "isiZulu","isiZulu" },
{ wxLANGUAGE_ZULU_SOUTH_AFRICA, "zu-ZA" , "zu_ZA" , "" , 0x35, 0x01, wxLayout_LeftToRight, "isiZulu (South Africa)","isiZulu (iNingizimu Afrika)" },
{ 0, nullptr, nullptr, nullptr, 0, 0, wxLayout_Default, nullptr, nullptr }
};
// --- --- --- generated code ends here --- --- ---
#endif // _WX_PRIVATE_LANG_INFO_H_

View File

@@ -0,0 +1,353 @@
/////////////////////////////////////////////////////////////////////////////
// Name: wx/private/lang_likely.h
// Purpose: Mapping of likely subtags
// Author: misc/languages/genlang.py
// Created: 2024-10-04
// Copyright: (c) 2024 wxWidgets development team <vadim@wxwidgets.org>
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
// WARNING: Parts of this file are generated. See misc/languages/README for
// details.
#ifndef _WX_PRIVATE_LANG_LIKELY_H_
#define _WX_PRIVATE_LANG_LIKELY_H_
// ----------------------------------------------------------------------------
// Mapping of language ids to default locale tags
// ----------------------------------------------------------------------------
// --- --- --- generated code begins here --- --- ---
// The following data tables are generated by misc/languages/genlang.py
// When making changes, please put them into misc/languages/likelytabl.txt
// Data table for likely subtags
static const struct likelyData_t
{
const char* tagfrom;
const char* tagto;
}
tabLikelyData[] =
{
{ "aa", "aa-Latn-ET" },
{ "ab", "ab-Cyrl-GE" },
{ "af", "af-Latn-ZA" },
{ "agq", "agq-Latn-CM" },
{ "ak", "ak-Latn-GH" },
{ "am", "am-Ethi-ET" },
{ "ar", "ar-Arab-EG" },
{ "arn", "arn-Latn-CL" },
{ "as", "as-Beng-IN" },
{ "asa", "asa-Latn-TZ" },
{ "ast", "ast-Latn-ES" },
{ "ay", "ay-Latn-BO" },
{ "az", "az-Latn-AZ" },
{ "az-Arab", "az-Arab-IR" },
{ "az-IQ", "az-Arab-IQ" },
{ "az-IR", "az-Arab-IR" },
{ "az-RU", "az-Cyrl-RU" },
{ "ba", "ba-Cyrl-RU" },
{ "bas", "bas-Latn-CM" },
{ "be", "be-Cyrl-BY" },
{ "bem", "bem-Latn-ZM" },
{ "bez", "bez-Latn-TZ" },
{ "bg", "bg-Cyrl-BG" },
{ "bi", "bi-Latn-VU" },
{ "bin", "bin-Latn-NG" },
{ "bm", "bm-Latn-ML" },
{ "bn", "bn-Beng-BD" },
{ "bo", "bo-Tibt-CN" },
{ "br", "br-Latn-FR" },
{ "brx", "brx-Deva-IN" },
{ "bs", "bs-Latn-BA" },
{ "byn", "byn-Ethi-ER" },
{ "ca", "ca-Latn-ES" },
{ "ccp", "ccp-Cakm-BD" },
{ "ce", "ce-Cyrl-RU" },
{ "ceb", "ceb-Latn-PH" },
{ "cgg", "cgg-Latn-UG" },
{ "chr", "chr-Cher-US" },
{ "co", "co-Latn-FR" },
{ "cs", "cs-Latn-CZ" },
{ "cu", "cu-Cyrl-RU" },
{ "cu-Glag", "cu-Glag-BG" },
{ "cy", "cy-Latn-GB" },
{ "da", "da-Latn-DK" },
{ "dav", "dav-Latn-KE" },
{ "de", "de-Latn-DE" },
{ "dje", "dje-Latn-NE" },
{ "doi", "doi-Deva-IN" },
{ "dsb", "dsb-Latn-DE" },
{ "dua", "dua-Latn-CM" },
{ "dv", "dv-Thaa-MV" },
{ "dyo", "dyo-Latn-SN" },
{ "dz", "dz-Tibt-BT" },
{ "ebu", "ebu-Latn-KE" },
{ "ee", "ee-Latn-GH" },
{ "el", "el-Grek-GR" },
{ "en", "en-Latn-US" },
{ "en-Shaw", "en-Shaw-GB" },
{ "eo", "eo-Latn-001" },
{ "es", "es-Latn-ES" },
{ "et", "et-Latn-EE" },
{ "eu", "eu-Latn-ES" },
{ "ewo", "ewo-Latn-CM" },
{ "fa", "fa-Arab-IR" },
{ "ff", "ff-Latn-SN" },
{ "ff-Adlm", "ff-Adlm-GN" },
{ "fi", "fi-Latn-FI" },
{ "fil", "fil-Latn-PH" },
{ "fj", "fj-Latn-FJ" },
{ "fo", "fo-Latn-FO" },
{ "fr", "fr-Latn-FR" },
{ "fur", "fur-Latn-IT" },
{ "fy", "fy-Latn-NL" },
{ "ga", "ga-Latn-IE" },
{ "gd", "gd-Latn-GB" },
{ "gl", "gl-Latn-ES" },
{ "gn", "gn-Latn-PY" },
{ "gsw", "gsw-Latn-CH" },
{ "gu", "gu-Gujr-IN" },
{ "guz", "guz-Latn-KE" },
{ "gv", "gv-Latn-IM" },
{ "ha", "ha-Latn-NG" },
{ "ha-CM", "ha-Arab-CM" },
{ "ha-SD", "ha-Arab-SD" },
{ "haw", "haw-Latn-US" },
{ "he", "he-Hebr-IL" },
{ "hi", "hi-Deva-IN" },
{ "hr", "hr-Latn-HR" },
{ "hsb", "hsb-Latn-DE" },
{ "hu", "hu-Latn-HU" },
{ "hy", "hy-Armn-AM" },
{ "ia", "ia-Latn-001" },
{ "ibb", "ibb-Latn-NG" },
{ "id", "id-Latn-ID" },
{ "ie", "ie-Latn-EE" },
{ "ig", "ig-Latn-NG" },
{ "ii", "ii-Yiii-CN" },
{ "ik", "ik-Latn-US" },
{ "is", "is-Latn-IS" },
{ "it", "it-Latn-IT" },
{ "iu", "iu-Cans-CA" },
{ "ja", "ja-Jpan-JP" },
{ "jgo", "jgo-Latn-CM" },
{ "jmc", "jmc-Latn-TZ" },
{ "jv", "jv-Latn-ID" },
{ "ka", "ka-Geor-GE" },
{ "kab", "kab-Latn-DZ" },
{ "kam", "kam-Latn-KE" },
{ "kde", "kde-Latn-TZ" },
{ "kea", "kea-Latn-CV" },
{ "khq", "khq-Latn-ML" },
{ "ki", "ki-Latn-KE" },
{ "kk", "kk-Cyrl-KZ" },
{ "kk-AF", "kk-Arab-AF" },
{ "kk-Arab", "kk-Arab-CN" },
{ "kk-CN", "kk-Arab-CN" },
{ "kk-IR", "kk-Arab-IR" },
{ "kk-MN", "kk-Arab-MN" },
{ "kkj", "kkj-Latn-CM" },
{ "kl", "kl-Latn-GL" },
{ "kln", "kln-Latn-KE" },
{ "km", "km-Khmr-KH" },
{ "kn", "kn-Knda-IN" },
{ "ko", "ko-Kore-KR" },
{ "kok", "kok-Deva-IN" },
{ "kr", "kr-Latn-NG" },
{ "ks", "ks-Arab-IN" },
{ "ksb", "ksb-Latn-TZ" },
{ "ksf", "ksf-Latn-CM" },
{ "ksh", "ksh-Latn-DE" },
{ "ku", "ku-Latn-TR" },
{ "ku-Arab", "ku-Arab-IQ" },
{ "ku-LB", "ku-Arab-LB" },
{ "ku-Yezi", "ku-Yezi-GE" },
{ "kw", "kw-Latn-GB" },
{ "ky", "ky-Cyrl-KG" },
{ "ky-Arab", "ky-Arab-CN" },
{ "ky-CN", "ky-Arab-CN" },
{ "ky-Latn", "ky-Latn-TR" },
{ "ky-TR", "ky-Latn-TR" },
{ "la", "la-Latn-VA" },
{ "lag", "lag-Latn-TZ" },
{ "lb", "lb-Latn-LU" },
{ "lg", "lg-Latn-UG" },
{ "lkt", "lkt-Latn-US" },
{ "ln", "ln-Latn-CD" },
{ "lo", "lo-Laoo-LA" },
{ "lrc", "lrc-Arab-IR" },
{ "lt", "lt-Latn-LT" },
{ "lu", "lu-Latn-CD" },
{ "luo", "luo-Latn-KE" },
{ "luy", "luy-Latn-KE" },
{ "lv", "lv-Latn-LV" },
{ "mai", "mai-Deva-IN" },
{ "mas", "mas-Latn-KE" },
{ "mer", "mer-Latn-KE" },
{ "mfe", "mfe-Latn-MU" },
{ "mg", "mg-Latn-MG" },
{ "mgh", "mgh-Latn-MZ" },
{ "mgo", "mgo-Latn-CM" },
{ "mi", "mi-Latn-NZ" },
{ "mk", "mk-Cyrl-MK" },
{ "ml", "ml-Mlym-IN" },
{ "mn", "mn-Cyrl-MN" },
{ "mn-CN", "mn-Mong-CN" },
{ "mn-Mong", "mn-Mong-CN" },
{ "mni", "mni-Beng-IN" },
{ "mo", "mo-Latn-RO" },
{ "moh", "moh-Latn-CA" },
{ "mr", "mr-Deva-IN" },
{ "ms", "ms-Latn-MY" },
{ "ms-CC", "ms-Arab-CC" },
{ "mt", "mt-Latn-MT" },
{ "mua", "mua-Latn-CM" },
{ "my", "my-Mymr-MM" },
{ "mzn", "mzn-Arab-IR" },
{ "na", "na-Latn-NR" },
{ "naq", "naq-Latn-NA" },
{ "nb", "nb-Latn-NO" },
{ "nd", "nd-Latn-ZW" },
{ "nds", "nds-Latn-DE" },
{ "ne", "ne-Deva-NP" },
{ "nl", "nl-Latn-NL" },
{ "nmg", "nmg-Latn-CM" },
{ "nn", "nn-Latn-NO" },
{ "nnh", "nnh-Latn-CM" },
{ "no", "no-Latn-NO" },
{ "nqo", "nqo-Nkoo-GN" },
{ "nr", "nr-Latn-ZA" },
{ "nso", "nso-Latn-ZA" },
{ "nus", "nus-Latn-SS" },
{ "nyn", "nyn-Latn-UG" },
{ "oc", "oc-Latn-FR" },
{ "om", "om-Latn-ET" },
{ "or", "or-Orya-IN" },
{ "os", "os-Cyrl-GE" },
{ "pa", "pa-Guru-IN" },
{ "pa-Arab", "pa-Arab-PK" },
{ "pa-PK", "pa-Arab-PK" },
{ "pap", "pap-Latn-CW" },
{ "pcm", "pcm-Latn-NG" },
{ "pl", "pl-Latn-PL" },
{ "prg", "prg-Latn-PL" },
{ "ps", "ps-Arab-AF" },
{ "pt", "pt-Latn-BR" },
{ "qu", "qu-Latn-PE" },
{ "quc", "quc-Latn-GT" },
{ "rm", "rm-Latn-CH" },
{ "rn", "rn-Latn-BI" },
{ "ro", "ro-Latn-RO" },
{ "rof", "rof-Latn-TZ" },
{ "ru", "ru-Cyrl-RU" },
{ "rw", "rw-Latn-RW" },
{ "rwk", "rwk-Latn-TZ" },
{ "sa", "sa-Deva-IN" },
{ "sah", "sah-Cyrl-RU" },
{ "saq", "saq-Latn-KE" },
{ "sat", "sat-Olck-IN" },
{ "sbp", "sbp-Latn-TZ" },
{ "sd", "sd-Arab-PK" },
{ "sd-Deva", "sd-Deva-IN" },
{ "sd-IN", "sd-Deva-IN" },
{ "sd-Khoj", "sd-Khoj-IN" },
{ "sd-Sind", "sd-Sind-IN" },
{ "se", "se-Latn-NO" },
{ "seh", "seh-Latn-MZ" },
{ "ses", "ses-Latn-ML" },
{ "sg", "sg-Latn-CF" },
{ "shi", "shi-Tfng-MA" },
{ "si", "si-Sinh-LK" },
{ "sk", "sk-Latn-SK" },
{ "sl", "sl-Latn-SI" },
{ "sm", "sm-Latn-WS" },
{ "sma", "sma-Latn-SE" },
{ "smj", "smj-Latn-SE" },
{ "smn", "smn-Latn-FI" },
{ "sms", "sms-Latn-FI" },
{ "sn", "sn-Latn-ZW" },
{ "so", "so-Latn-SO" },
{ "sq", "sq-Latn-AL" },
{ "sr", "sr-Cyrl-RS" },
{ "sr-ME", "sr-Latn-ME" },
{ "sr-RO", "sr-Latn-RO" },
{ "sr-RU", "sr-Latn-RU" },
{ "sr-TR", "sr-Latn-TR" },
{ "ss", "ss-Latn-ZA" },
{ "ssy", "ssy-Latn-ER" },
{ "st", "st-Latn-ZA" },
{ "su", "su-Latn-ID" },
{ "sv", "sv-Latn-SE" },
{ "sw", "sw-Latn-TZ" },
{ "syr", "syr-Syrc-IQ" },
{ "ta", "ta-Taml-IN" },
{ "te", "te-Telu-IN" },
{ "teo", "teo-Latn-UG" },
{ "tg", "tg-Cyrl-TJ" },
{ "tg-Arab", "tg-Arab-PK" },
{ "tg-PK", "tg-Arab-PK" },
{ "th", "th-Thai-TH" },
{ "ti", "ti-Ethi-ET" },
{ "tig", "tig-Ethi-ER" },
{ "tk", "tk-Latn-TM" },
{ "tl", "tl-Latn-PH" },
{ "tn", "tn-Latn-ZA" },
{ "to", "to-Latn-TO" },
{ "tr", "tr-Latn-TR" },
{ "ts", "ts-Latn-ZA" },
{ "tt", "tt-Cyrl-RU" },
{ "twq", "twq-Latn-NE" },
{ "tzm", "tzm-Latn-MA" },
{ "ug", "ug-Arab-CN" },
{ "ug-Cyrl", "ug-Cyrl-KZ" },
{ "ug-KZ", "ug-Cyrl-KZ" },
{ "ug-MN", "ug-Cyrl-MN" },
{ "uk", "uk-Cyrl-UA" },
{ "ur", "ur-Arab-PK" },
{ "uz", "uz-Latn-UZ" },
{ "uz-AF", "uz-Arab-AF" },
{ "uz-Arab", "uz-Arab-AF" },
{ "uz-CN", "uz-Cyrl-CN" },
{ "vai", "vai-Vaii-LR" },
{ "ve", "ve-Latn-ZA" },
{ "vi", "vi-Latn-VN" },
{ "vo", "vo-Latn-001" },
{ "vun", "vun-Latn-TZ" },
{ "wae", "wae-Latn-CH" },
{ "wal", "wal-Ethi-ET" },
{ "wo", "wo-Latn-SN" },
{ "xh", "xh-Latn-ZA" },
{ "xog", "xog-Latn-UG" },
{ "yav", "yav-Latn-CM" },
{ "yi", "yi-Hebr-UA" },
{ "yo", "yo-Latn-NG" },
{ "za", "za-Latn-CN" },
{ "zgh", "zgh-Tfng-MA" },
{ "zh", "zh-Hans-CN" },
{ "zh-AU", "zh-Hant-AU" },
{ "zh-BN", "zh-Hant-BN" },
{ "zh-Bopo", "zh-Bopo-TW" },
{ "zh-GB", "zh-Hant-GB" },
{ "zh-GF", "zh-Hant-GF" },
{ "zh-HK", "zh-Hant-HK" },
{ "zh-Hanb", "zh-Hanb-TW" },
{ "zh-Hant", "zh-Hant-TW" },
{ "zh-ID", "zh-Hant-ID" },
{ "zh-MO", "zh-Hant-MO" },
{ "zh-PA", "zh-Hant-PA" },
{ "zh-PF", "zh-Hant-PF" },
{ "zh-PH", "zh-Hant-PH" },
{ "zh-SR", "zh-Hant-SR" },
{ "zh-TH", "zh-Hant-TH" },
{ "zh-TW", "zh-Hant-TW" },
{ "zh-US", "zh-Hant-US" },
{ "zh-VN", "zh-Hant-VN" },
{ "zu", "zu-Latn-ZA" },
{ nullptr, nullptr }
};
// --- --- --- generated code ends here --- --- ---
#endif // _WX_PRIVATE_LANG_LIKELY_H_

View File

@@ -0,0 +1,214 @@
/////////////////////////////////////////////////////////////////////////////
// Name: wx/private/lang_match.h
// Purpose: Mapping of language matchings
// Author: misc/languages/genlang.py
// Created: 2024-10-04
// Copyright: (c) 2024 wxWidgets development team <vadim@wxwidgets.org>
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
// WARNING: Parts of this file are generated. See misc/languages/README for
// details.
#ifndef _WX_PRIVATE_LANG_MATCH_H_
#define _WX_PRIVATE_LANG_MATCH_H_
// ----------------------------------------------------------------------------
// Mapping of pairs of desired and supported languages to language distances
// ----------------------------------------------------------------------------
// --- --- --- generated code begins here --- --- ---
// The following data tables are generated by misc/languages/genlang.py
// When making changes, please put them into misc/languages/matchingtabl.txt
// Data table for matching languages
static const struct matchData_t
{
const char* matchkey;
int matchval;
}
tabMatchData[] =
{
{ "aa:ssy", 4 },
{ "ab:ru", 30 },
{ "af:nl", 20 },
{ "ak:en", 30 },
{ "am:en", 30 },
{ "am-Ethi:en-Latn", 10 },
{ "ar-Latn:ar-Arab", 20 },
{ "ay:es", 20 },
{ "az:ru", 30 },
{ "az-Latn:ru-Cyrl", 10 },
{ "be:ru", 20 },
{ "bem:en", 30 },
{ "bh:hi", 30 },
{ "bn:en", 30 },
{ "bn-Beng:en-Latn", 10 },
{ "bn-Latn:bn-Beng", 20 },
{ "bo:zh", 20 },
{ "bo-Tibt:zh-Hans", 10 },
{ "br:fr", 20 },
{ "bs:hr", 4 },
{ "bs:sh", 4 },
{ "ca:es", 20 },
{ "ceb:fil", 30 },
{ "chr:en", 20 },
{ "co:fr", 20 },
{ "cs:sk", 20 },
{ "cy:en", 20 },
{ "da:nb", 8 },
{ "da:no", 8 },
{ "ee:en", 30 },
{ "eo:en", 30 },
{ "eu:es", 20 },
{ "fo:da", 20 },
{ "fy:nl", 20 },
{ "ga:en", 20 },
{ "gd:en", 20 },
{ "gl:es", 20 },
{ "gn:es", 20 },
{ "gsw:de", 4 },
{ "gu:hi", 30 },
{ "gu-Latn:gu-Gujr", 20 },
{ "ha:en", 30 },
{ "haw:en", 20 },
{ "hi-Latn:hi-Deva", 20 },
{ "hr:bs", 4 },
{ "hr:sh", 4 },
{ "hy:ru", 30 },
{ "hy-Armn:ru-Cyrl", 10 },
{ "ia:en", 30 },
{ "id:ms", 10 },
{ "ig:en", 30 },
{ "is:en", 20 },
{ "ja-Hani:ja-Jpan", 5 },
{ "ja-Hira:ja-Hrkt", 5 },
{ "ja-Hira:ja-Jpan", 5 },
{ "ja-Hrkt:ja-Jpan", 5 },
{ "ja-Kana:ja-Hrkt", 5 },
{ "ja-Kana:ja-Jpan", 5 },
{ "ja-Latn:ja-Jpan", 5 },
{ "jv:id", 20 },
{ "ka:en", 30 },
{ "ka-Geor:en-Latn", 10 },
{ "kk:ru", 30 },
{ "km:en", 30 },
{ "km-Khmr:en-Latn", 10 },
{ "kn:en", 30 },
{ "kn-Knda:en-Latn", 10 },
{ "kn-Latn:kn-Knda", 20 },
{ "ko-Hang:ko-Kore", 5 },
{ "ko-Hani:ko-Kore", 5 },
{ "ko-Jamo:ko-Hang", 5 },
{ "ko-Jamo:ko-Kore", 5 },
{ "ku:tr", 30 },
{ "ky:ru", 30 },
{ "la:it", 20 },
{ "lb:de", 4 },
{ "lg:en", 30 },
{ "ln:fr", 30 },
{ "lo:en", 30 },
{ "lo-Laoo:en-Latn", 10 },
{ "mai:hi", 20 },
{ "mfe:en", 30 },
{ "mg:fr", 30 },
{ "mi:en", 20 },
{ "ml:en", 30 },
{ "ml-Latn:ml-Mlym", 20 },
{ "ml-Mlym:en-Latn", 10 },
{ "mn:ru", 30 },
{ "mr:hi", 30 },
{ "mr-Latn:mr-Deva", 20 },
{ "ms:id", 30 },
{ "mt:en", 30 },
{ "my:en", 30 },
{ "my-Mymr:en-Latn", 10 },
{ "nb:da", 8 },
{ "nb:nn", 20 },
{ "nb:no", 1 },
{ "ne:en", 30 },
{ "ne-Deva:en-Latn", 10 },
{ "nn:nb", 20 },
{ "nn:no", 20 },
{ "no:da", 8 },
{ "no:nb", 1 },
{ "no:nn", 20 },
{ "nso:en", 30 },
{ "nyn:en", 30 },
{ "oc:fr", 20 },
{ "om:en", 30 },
{ "or:en", 30 },
{ "or-Orya:en-Latn", 10 },
{ "pa:en", 30 },
{ "pa-Guru:en-Latn", 10 },
{ "pcm:en", 20 },
{ "ps:en", 30 },
{ "ps-Arab:en-Latn", 10 },
{ "qu:es", 30 },
{ "rm:de", 20 },
{ "rn:en", 30 },
{ "rw:fr", 30 },
{ "sa:hi", 30 },
{ "sd:en", 30 },
{ "sd-Arab:en-Latn", 10 },
{ "sh:bs", 4 },
{ "sh:hr", 4 },
{ "sh:sr", 4 },
{ "si:en", 30 },
{ "si-Sinh:en-Latn", 10 },
{ "sk:cs", 20 },
{ "sn:en", 30 },
{ "so:en", 30 },
{ "sq:en", 30 },
{ "sr:sh", 4 },
{ "sr-Cyrl:sr-Latn", 5 },
{ "sr-Latn:sr-Cyrl", 5 },
{ "ssy:aa", 4 },
{ "st:en", 30 },
{ "su:id", 20 },
{ "sw:en", 30 },
{ "ta:en", 30 },
{ "ta-Latn:ta-Taml", 20 },
{ "ta-Taml:en-Latn", 10 },
{ "te:en", 30 },
{ "te-Latn:te-Telu", 20 },
{ "te-Telu:en-Latn", 10 },
{ "tg:ru", 30 },
{ "ti:en", 30 },
{ "ti-Ethi:en-Latn", 10 },
{ "tk:ru", 30 },
{ "tk-Latn:ru-Cyrl", 10 },
{ "tn:en", 30 },
{ "to:en", 30 },
{ "tt:ru", 30 },
{ "ug:zh", 20 },
{ "ur:en", 30 },
{ "ur-Arab:en-Latn", 10 },
{ "uz:ru", 30 },
{ "uz-Latn:ru-Cyrl", 10 },
{ "wo:fr", 30 },
{ "xh:en", 30 },
{ "yi:en", 30 },
{ "yi-Hebr:en-Latn", 10 },
{ "yo:en", 30 },
{ "za:zh", 20 },
{ "za-Latn:zh-Hans", 10 },
{ "zh-Hani:zh-Hans", 20 },
{ "zh-Hani:zh-Hant", 20 },
{ "zh-Latn:zh-Hans", 20 },
{ "zu:en", 30 },
{ "*:*", 80 },
{ "*-*:*-*", 50 },
{ "*-*-*:*-*-*", 4 },
{ "ar-*-*:ar-*-*", 5 },
{ "en-*-*:en-*-*", 5 },
{ "es-*-*:es-*-*", 5 },
{ "pt-*-*:pt-*-*", 5 },
{ "zh-Hant-*:zh-Hant-*", 5 },
{ nullptr, 0 }
};
// --- --- --- generated code ends here --- --- ---
#endif // _WX_PRIVATE_LANG_MATCH_H_

View File

@@ -0,0 +1,170 @@
/////////////////////////////////////////////////////////////////////////////
// Name: wx/private/lang_regions.h
// Purpose: Mapping of region groups for selected languages
// Author: misc/languages/genlang.py
// Created: 2024-10-04
// Copyright: (c) 2024 wxWidgets development team <vadim@wxwidgets.org>
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
// WARNING: Parts of this file are generated. See misc/languages/README for
// details.
#ifndef _WX_PRIVATE_LANG_REGIONS_H_
#define _WX_PRIVATE_LANG_REGIONS_H_
// ----------------------------------------------------------------------------
// Mapping of region groups
// ----------------------------------------------------------------------------
// --- --- --- generated code begins here --- --- ---
// The following data tables are generated by misc/languages/genlang.py
// When making changes, please put them into misc/languages/regiongrouptabl.txt
// Data table for region groups
static const struct regionGroupData_t
{
const char* language;
const char* country;
}
regionGroupData[] =
{
{ "ar", "DZ" },
{ "ar", "EH" },
{ "ar", "LY" },
{ "ar", "MA" },
{ "ar", "MR" },
{ "ar", "TN" },
{ "en", "AS" },
{ "en", "CA" },
{ "en", "GU" },
{ "en", "MH" },
{ "en", "MP" },
{ "en", "PH" },
{ "en", "PR" },
{ "en", "UM" },
{ "en", "US" },
{ "en", "VI" },
{ "es", "AG" },
{ "es", "AI" },
{ "es", "AR" },
{ "es", "AW" },
{ "es", "BB" },
{ "es", "BL" },
{ "es", "BM" },
{ "es", "BO" },
{ "es", "BQ" },
{ "es", "BR" },
{ "es", "BS" },
{ "es", "BV" },
{ "es", "BZ" },
{ "es", "CA" },
{ "es", "CL" },
{ "es", "CO" },
{ "es", "CR" },
{ "es", "CU" },
{ "es", "CW" },
{ "es", "DM" },
{ "es", "DO" },
{ "es", "EC" },
{ "es", "FK" },
{ "es", "GD" },
{ "es", "GF" },
{ "es", "GL" },
{ "es", "GP" },
{ "es", "GS" },
{ "es", "GT" },
{ "es", "GY" },
{ "es", "HN" },
{ "es", "HT" },
{ "es", "JM" },
{ "es", "KN" },
{ "es", "KY" },
{ "es", "LC" },
{ "es", "MF" },
{ "es", "MQ" },
{ "es", "MS" },
{ "es", "MX" },
{ "es", "NI" },
{ "es", "PA" },
{ "es", "PE" },
{ "es", "PM" },
{ "es", "PR" },
{ "es", "PY" },
{ "es", "SR" },
{ "es", "SV" },
{ "es", "SX" },
{ "es", "TC" },
{ "es", "TT" },
{ "es", "US" },
{ "es", "UY" },
{ "es", "VC" },
{ "es", "VE" },
{ "es", "VG" },
{ "es", "VI" },
{ "pt", "AG" },
{ "pt", "AI" },
{ "pt", "AR" },
{ "pt", "AW" },
{ "pt", "BB" },
{ "pt", "BL" },
{ "pt", "BM" },
{ "pt", "BO" },
{ "pt", "BQ" },
{ "pt", "BR" },
{ "pt", "BS" },
{ "pt", "BV" },
{ "pt", "BZ" },
{ "pt", "CA" },
{ "pt", "CL" },
{ "pt", "CO" },
{ "pt", "CR" },
{ "pt", "CU" },
{ "pt", "CW" },
{ "pt", "DM" },
{ "pt", "DO" },
{ "pt", "EC" },
{ "pt", "FK" },
{ "pt", "GD" },
{ "pt", "GF" },
{ "pt", "GL" },
{ "pt", "GP" },
{ "pt", "GS" },
{ "pt", "GT" },
{ "pt", "GY" },
{ "pt", "HN" },
{ "pt", "HT" },
{ "pt", "JM" },
{ "pt", "KN" },
{ "pt", "KY" },
{ "pt", "LC" },
{ "pt", "MF" },
{ "pt", "MQ" },
{ "pt", "MS" },
{ "pt", "MX" },
{ "pt", "NI" },
{ "pt", "PA" },
{ "pt", "PE" },
{ "pt", "PM" },
{ "pt", "PR" },
{ "pt", "PY" },
{ "pt", "SR" },
{ "pt", "SV" },
{ "pt", "SX" },
{ "pt", "TC" },
{ "pt", "TT" },
{ "pt", "US" },
{ "pt", "UY" },
{ "pt", "VC" },
{ "pt", "VE" },
{ "pt", "VG" },
{ "pt", "VI" },
{ "zh-Hant", "HK" },
{ "zh-Hant", "MO" },
{ nullptr, nullptr }
};
// --- --- --- generated code ends here --- --- ---
#endif // _WX_PRIVATE_LANG_REGIONS_H_

View File

@@ -0,0 +1,206 @@
/////////////////////////////////////////////////////////////////////////////
// Name: wx/private/lang_scripts.h
// Purpose: Mapping of language script ids
// Author: misc/languages/genlang.py
// Created: 2024-10-04
// Copyright: (c) 2024 wxWidgets development team <vadim@wxwidgets.org>
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
// WARNING: Parts of this file are generated. See misc/languages/README for
// details.
#ifndef _WX_PRIVATE_LANG_SCRIPTS_H_
#define _WX_PRIVATE_LANG_SCRIPTS_H_
// ----------------------------------------------------------------------------
// Mapping of known script ids to POSIX modifiers
// ----------------------------------------------------------------------------
// --- --- --- generated code begins here --- --- ---
// The following data tables are generated by misc/languages/genlang.py
// When making changes, please put them into misc/languages/scripttabl.txt
// Data table for known language scripts
static const struct scriptData_t
{
const char* scname;
const char* scalias;
}
tabScriptData[] =
{
{ "Adlm", "adlam" },
{ "Aghb", "caucasian_albanian" },
{ "Ahom", "ahom" },
{ "Arab", "arabic" },
{ "Armi", "imperial_aramaic" },
{ "Armn", "armenian" },
{ "Avst", "avestan" },
{ "Bali", "balinese" },
{ "Bamu", "bamum" },
{ "Bass", "bassa_vah" },
{ "Batk", "batak" },
{ "Beng", "bengali" },
{ "Bhks", "bhaiksuki" },
{ "Bopo", "bopomofo" },
{ "Brah", "brahmi" },
{ "Brai", "braille" },
{ "Bugi", "buginese" },
{ "Buhd", "buhid" },
{ "Cakm", "chakma" },
{ "Cans", "canadian_aboriginal" },
{ "Cari", "carian" },
{ "Cham", "cham" },
{ "Cher", "cherokee" },
{ "Chrs", "chorasmian" },
{ "Copt", "coptic" },
{ "Cpmn", "cypro_minoan" },
{ "Cprt", "cypriot" },
{ "Cyrl", "cyrillic" },
{ "Deva", "devanagari" },
{ "Diak", "dives_akuru" },
{ "Dogr", "dogra" },
{ "Dsrt", "deseret" },
{ "Dupl", "duployan" },
{ "Egyp", "egyptian_hieroglyphs" },
{ "Elba", "elbasan" },
{ "Elym", "elymaic" },
{ "Ethi", "ethiopic" },
{ "Geok", "georgian" },
{ "Geor", "georgian" },
{ "Glag", "glagolitic" },
{ "Gong", "gunjala_gondi" },
{ "Gonm", "masaram_gondi" },
{ "Goth", "gothic" },
{ "Gran", "grantha" },
{ "Grek", "greek" },
{ "Gujr", "gujarati" },
{ "Guru", "gurmukhi" },
{ "Hang", "hangul" },
{ "Hani", "han" },
{ "Hano", "hanunoo" },
{ "Hans", "Hans" },
{ "Hant", "Hant" },
{ "Hatr", "hatran" },
{ "Hebr", "hebrew" },
{ "Hira", "hiragana" },
{ "Hluw", "anatolian_hieroglyphs" },
{ "Hmng", "pahawh_hmong" },
{ "Hmnp", "nyiakeng_puachue_hmong" },
{ "Hrkt", "katakana_or_hiragana" },
{ "Hung", "old_hungarian" },
{ "Ital", "old_italic" },
{ "Java", "javanese" },
{ "Kali", "kayah_li" },
{ "Kana", "katakana" },
{ "Kawi", "kawi" },
{ "Khar", "kharoshthi" },
{ "Khmr", "khmer" },
{ "Khoj", "khojki" },
{ "Kits", "khitan_small_script" },
{ "Knda", "kannada" },
{ "Kthi", "kaithi" },
{ "Lana", "tai_tham" },
{ "Laoo", "lao" },
{ "Latn", "latin" },
{ "Lepc", "lepcha" },
{ "Limb", "limbu" },
{ "Lina", "linear_a" },
{ "Linb", "linear_b" },
{ "Lisu", "lisu" },
{ "Lyci", "lycian" },
{ "Lydi", "lydian" },
{ "Mahj", "mahajani" },
{ "Maka", "makasar" },
{ "Mand", "mandaic" },
{ "Mani", "manichaean" },
{ "Marc", "marchen" },
{ "Medf", "medefaidrin" },
{ "Mend", "mende_kikakui" },
{ "Merc", "meroitic_cursive" },
{ "Mero", "meroitic_hieroglyphs" },
{ "Mlym", "malayalam" },
{ "Modi", "modi" },
{ "Mong", "mongolian" },
{ "Mroo", "mro" },
{ "Mtei", "meetei_mayek" },
{ "Mult", "multani" },
{ "Mymr", "myanmar" },
{ "Nagm", "nag_mundari" },
{ "Nand", "nandinagari" },
{ "Narb", "old_north_arabian" },
{ "Nbat", "nabataean" },
{ "Newa", "newa" },
{ "Nkoo", "nko" },
{ "Nshu", "nushu" },
{ "Ogam", "ogham" },
{ "Olck", "ol_chiki" },
{ "Orkh", "old_turkic" },
{ "Orya", "oriya" },
{ "Osge", "osage" },
{ "Osma", "osmanya" },
{ "Ougr", "old_uyghur" },
{ "Palm", "palmyrene" },
{ "Pauc", "pau_cin_hau" },
{ "Perm", "old_permic" },
{ "Phag", "phags_pa" },
{ "Phli", "inscriptional_pahlavi" },
{ "Phlp", "psalter_pahlavi" },
{ "Phnx", "phoenician" },
{ "Plrd", "miao" },
{ "Prti", "inscriptional_parthian" },
{ "Rjng", "rejang" },
{ "Rohg", "hanifi_rohingya" },
{ "Runr", "runic" },
{ "Samr", "samaritan" },
{ "Sarb", "old_south_arabian" },
{ "Saur", "saurashtra" },
{ "Sgnw", "signwriting" },
{ "Shaw", "shavian" },
{ "Shrd", "sharada" },
{ "Sidd", "siddham" },
{ "Sind", "khudawadi" },
{ "Sinh", "sinhala" },
{ "Sogd", "sogdian" },
{ "Sogo", "old_sogdian" },
{ "Sora", "sora_sompeng" },
{ "Soyo", "soyombo" },
{ "Sund", "sundanese" },
{ "Sylo", "syloti_nagri" },
{ "Syrc", "syriac" },
{ "Tagb", "tagbanwa" },
{ "Takr", "takri" },
{ "Tale", "tai_le" },
{ "Talu", "new_tai_lue" },
{ "Taml", "tamil" },
{ "Tang", "tangut" },
{ "Tavt", "tai_viet" },
{ "Telu", "telugu" },
{ "Tfng", "tifinagh" },
{ "Tglg", "tagalog" },
{ "Thaa", "thaana" },
{ "Thai", "thai" },
{ "Tibt", "tibetan" },
{ "Tirh", "tirhuta" },
{ "Tnsa", "tangsa" },
{ "Toto", "toto" },
{ "Ugar", "ugaritic" },
{ "Vaii", "vai" },
{ "Vith", "vithkuqi" },
{ "Wara", "warang_citi" },
{ "Wcho", "wancho" },
{ "Xpeo", "old_persian" },
{ "Xsux", "cuneiform" },
{ "Yezi", "yezidi" },
{ "Yiii", "yi" },
{ "Zanb", "zanabazar_square" },
{ "Zinh", "inherited" },
{ "Zyyy", "common" },
{ "Zzzz", "unknown" },
{ nullptr, nullptr }
};
// --- --- --- generated code ends here --- --- ---
#endif // _WX_PRIVATE_LANG_SCRIPTS_H_

View File

@@ -0,0 +1,43 @@
///////////////////////////////////////////////////////////////////////////////
// Name: wx/private/launchbrowser.h
// Purpose: Helpers for wxLaunchDefaultBrowser() implementation.
// Author: Vadim Zeitlin
// Created: 2016-02-07
// Copyright: (c) 2016 Vadim Zeitlin <vadim@wxwidgets.org>
// Licence: wxWindows licence
///////////////////////////////////////////////////////////////////////////////
#ifndef _WX_PRIVATE_LAUNCHBROWSER_H_
#define _WX_PRIVATE_LAUNCHBROWSER_H_
// ----------------------------------------------------------------------------
// wxLaunchBrowserParams: passed to wxDoLaunchDefaultBrowser()
// ----------------------------------------------------------------------------
struct wxLaunchBrowserParams
{
explicit wxLaunchBrowserParams(int f) : flags(f) { }
// Return either the URL or the file depending on our scheme.
const wxString& GetPathOrURL() const
{
return scheme == wxS("file") ? path : url;
}
// The URL is always specified and is the real URL, always with the scheme
// part, which can be "file://".
wxString url;
// The path is a local path which is only non-empty if the URL uses the
// "file://" scheme.
wxString path;
// The scheme of the URL, e.g. "file" or "http".
wxString scheme;
// The flags passed to wxLaunchDefaultBrowser().
int flags;
};
#endif // _WX_PRIVATE_LAUNCHBROWSER_H_

View File

@@ -0,0 +1,67 @@
///////////////////////////////////////////////////////////////////////////////
// Name: wx/private/localeset.h
// Purpose: Define helper wxLocaleSetter class.
// Author: Vadim Zeitlin
// Created: 2021-08-03 (extracted from tests/testprec.h)
// Copyright: (c) 2021 Vadim Zeitlin <vadim@wxwidgets.org>
// Licence: wxWindows licence
///////////////////////////////////////////////////////////////////////////////
#ifndef _WX_PRIVATE_LOCALESET_H_
#define _WX_PRIVATE_LOCALESET_H_
#include "wx/crt.h" // wxStrdupA()
#include <locale.h>
// Helper class setting the locale to the given one for its lifetime.
class wxLocaleSetter
{
public:
wxLocaleSetter(const char *loc)
: m_locOld(wxStrdupA(setlocale(LC_ALL, nullptr)))
{
setlocale(LC_ALL, loc);
}
~wxLocaleSetter()
{
setlocale(LC_ALL, m_locOld);
free(m_locOld);
}
private:
char * const m_locOld;
wxDECLARE_NO_COPY_CLASS(wxLocaleSetter);
};
// An even simpler helper for setting the locale to "C" one during its lifetime.
class wxCLocaleSetter : private wxLocaleSetter
{
public:
wxCLocaleSetter() : wxLocaleSetter("C") { }
private:
wxDECLARE_NO_COPY_CLASS(wxCLocaleSetter);
};
// This function must be called on program startup and after changing
// locale to ensure LC_CTYPE is set correctly under macOS (it does nothing
// under the other platforms currently).
inline void wxEnsureLocaleIsCompatibleWithCRT()
{
#if defined(__DARWIN__)
// In OS X and iOS, wchar_t CRT functions convert to char* and fail under
// some locales. The safest fix is to set LC_CTYPE to UTF-8 to ensure that
// they can handle any input.
//
// Note that this must be done for any app, Cocoa or console, whether or
// not it uses wxLocale.
//
// See https://stackoverflow.com/questions/11713745/why-does-the-printf-family-of-functions-care-about-locale
setlocale(LC_CTYPE, "UTF-8");
#endif // defined(__DARWIN__)
}
#endif // _WX_PRIVATE_LOCALESET_H_

View File

@@ -0,0 +1,35 @@
///////////////////////////////////////////////////////////////////////////////
// Name: wx/private/log.h
// Purpose: Private wxLog-related declarations.
// Author: Vadim Zeitlin
// Created: 2025-01-19 (extracted from log.cpp)
// Copyright: (c) 2025 Vadim Zeitlin <vadim@wxwidgets.org>
// Licence: wxWindows licence
///////////////////////////////////////////////////////////////////////////////
#ifndef _WX_PRIVATE_LOG_H_
#define _WX_PRIVATE_LOG_H_
#include "wx/log.h"
#include "wx/msgout.h"
// ----------------------------------------------------------------------------
// wxLogOutputBest: wxLog wrapper around wxMessageOutputBest
// ----------------------------------------------------------------------------
class wxLogOutputBest : public wxLog
{
public:
wxLogOutputBest() = default;
protected:
virtual void DoLogText(const wxString& msg) override
{
wxMessageOutputBest().Output(msg);
}
private:
wxDECLARE_NO_COPY_CLASS(wxLogOutputBest);
};
#endif // _WX_PRIVATE_LOG_H_

View File

@@ -0,0 +1,176 @@
///////////////////////////////////////////////////////////////////////////////
// Name: wx/private/markupparser.h
// Purpose: Classes for parsing simple markup.
// Author: Vadim Zeitlin
// Created: 2011-02-16
// Copyright: (c) 2011 Vadim Zeitlin <vadim@wxwidgets.org>
// Licence: wxWindows licence
///////////////////////////////////////////////////////////////////////////////
#ifndef _WX_PRIVATE_MARKUPPARSER_H_
#define _WX_PRIVATE_MARKUPPARSER_H_
#include "wx/string.h"
// ----------------------------------------------------------------------------
// wxMarkupSpanAttributes: information about attributes for a markup span.
// ----------------------------------------------------------------------------
struct wxMarkupSpanAttributes
{
enum OptionalBool
{
Unspecified = -1,
No,
Yes
};
wxMarkupSpanAttributes()
{
m_sizeKind = Size_Unspecified;
m_isBold =
m_isItalic =
m_isUnderlined =
m_isStrikethrough = Unspecified;
}
// If a string is empty, it means that the corresponding attribute is not
// set.
wxString m_fgCol,
m_bgCol,
m_fontFace;
// There are many ways of specifying the size. First of all, the size may
// be relative in which case m_fontSize is either -1 or +1 meaning that
// it's one step smaller or larger than the current font. Second, it may be
// absolute in which case m_fontSize contains either the size in 1024th of
// a point (Pango convention) or its values are in [-3, 3] interval and map
// to [xx-small, xx-large] CSS-like font size specification. And finally it
// may be not specified at all, of course, in which case the value of
// m_fontSize doesn't matter and it shouldn't be used.
enum
{
Size_Unspecified,
Size_Relative,
Size_Symbolic,
Size_PointParts
} m_sizeKind;
int m_fontSize;
// If the value is Unspecified, the attribute wasn't given.
OptionalBool m_isBold,
m_isItalic,
m_isUnderlined,
m_isStrikethrough;
};
// ----------------------------------------------------------------------------
// wxMarkupParserOutput: gathers the results of parsing markup.
// ----------------------------------------------------------------------------
// A class deriving directly from this one needs to implement all the pure
// virtual functions below but as the handling of all simple tags (bold, italic
// &c) is often very similar, it is usually more convenient to inherit from
// wxMarkupParserFontOutput defined in wx/private/markupparserfont.h instead.
class wxMarkupParserOutput
{
public:
wxMarkupParserOutput() = default;
virtual ~wxMarkupParserOutput() = default;
// Virtual functions called by wxMarkupParser while parsing the markup.
// Called for a run of normal text.
virtual void OnText(const wxString& text) = 0;
// These functions correspond to the simple tags without parameters.
virtual void OnBoldStart() = 0;
virtual void OnBoldEnd() = 0;
virtual void OnItalicStart() = 0;
virtual void OnItalicEnd() = 0;
virtual void OnUnderlinedStart() = 0;
virtual void OnUnderlinedEnd() = 0;
virtual void OnStrikethroughStart() = 0;
virtual void OnStrikethroughEnd() = 0;
virtual void OnBigStart() = 0;
virtual void OnBigEnd() = 0;
virtual void OnSmallStart() = 0;
virtual void OnSmallEnd() = 0;
virtual void OnTeletypeStart() = 0;
virtual void OnTeletypeEnd() = 0;
// The generic span start and end functions.
virtual void OnSpanStart(const wxMarkupSpanAttributes& attrs) = 0;
virtual void OnSpanEnd(const wxMarkupSpanAttributes& attrs) = 0;
private:
wxDECLARE_NO_COPY_CLASS(wxMarkupParserOutput);
};
// ----------------------------------------------------------------------------
// wxMarkupParser: parses the given markup text into wxMarkupParserOutput.
// ----------------------------------------------------------------------------
class WXDLLIMPEXP_CORE wxMarkupParser
{
public:
// Initialize the parser with the object that will receive parsing results.
// This object lifetime must be greater than ours.
explicit wxMarkupParser(wxMarkupParserOutput& output)
: m_output(output)
{
}
// Parse the entire string and call wxMarkupParserOutput methods.
//
// Return true if the string was successfully parsed or false if it failed
// (presumably because of syntax errors in the markup).
bool Parse(const wxString& text);
// Quote a normal string, not meant to be interpreted as markup, so that it
// produces the same string when parsed as markup. This means, for example,
// replacing '<' in the input string with "&lt;" to prevent them from being
// interpreted as tag opening characters.
static wxString Quote(const wxString& text);
// Strip markup from a string, i.e. simply remove all tags and replace
// XML entities with their values (or with "&&" in case of "&amp;" to
// prevent it from being interpreted as mnemonic marker).
static wxString Strip(const wxString& text);
private:
// Simple struct combining the name of a tag and its attributes.
struct TagAndAttrs
{
TagAndAttrs(const wxString& name_) : name(name_) { }
wxString name;
wxMarkupSpanAttributes attrs;
};
// Call the wxMarkupParserOutput method corresponding to the given tag.
//
// Return false if the tag doesn't match any of the known ones.
bool OutputTag(const TagAndAttrs& tagAndAttrs, bool start);
// Parse the attributes and fill the provided TagAndAttrs object with the
// information about them. Does nothing if attrs string is empty.
//
// Returns empty string on success of a [fragment of an] error message if
// we failed to parse the attributes.
wxString ParseAttrs(wxString attrs, TagAndAttrs& tagAndAttrs);
wxMarkupParserOutput& m_output;
wxDECLARE_NO_COPY_CLASS(wxMarkupParser);
};
#endif // _WX_PRIVATE_MARKUPPARSER_H_

View File

@@ -0,0 +1,256 @@
///////////////////////////////////////////////////////////////////////////////
// Name: wx/private/markupparserattr.h
// Purpose: Classes mapping markup attributes to wxFont/wxColour.
// Author: Vadim Zeitlin
// Created: 2011-02-18
// Copyright: (c) 2011 Vadim Zeitlin <vadim@wxwidgets.org>
// Licence: wxWindows licence
///////////////////////////////////////////////////////////////////////////////
#ifndef _WX_PRIVATE_MARKUPPARSERATTR_H_
#define _WX_PRIVATE_MARKUPPARSERATTR_H_
#include "wx/private/markupparser.h"
#include "wx/stack.h"
#include "wx/colour.h"
#include "wx/font.h"
// ----------------------------------------------------------------------------
// wxMarkupParserAttrOutput: simplified wxFont-using version of the above.
// ----------------------------------------------------------------------------
// This class assumes that wxFont and wxColour are used to perform all the
// markup tags and implements the base class virtual functions in terms of
// OnAttr{Start,End}() only.
//
// Notice that you still must implement OnText() inherited from the base class
// when deriving from this one.
class wxMarkupParserAttrOutput : public wxMarkupParserOutput
{
public:
// A container of font and colours with inheritance support. It holds two
// sets of attributes:
// 1. The currently specified ones from parsed tags that contain
// information on what should change in the output; some of them
// may be invalid if only the others are affected by a change.
// 2. The _effective_ attributes that are always valid and accumulate
// all past changes as the markup is being parser; these are used
// to restore state when unwinding nested attributes.
struct Attr
{
Attr(const Attr *attrInEffect,
const wxFont& font_,
const wxColour& foreground_ = wxColour(),
const wxColour& background_ = wxColour())
: font(font_), foreground(foreground_), background(background_)
{
if (attrInEffect)
{
effectiveFont = font.IsOk() ? font : attrInEffect->effectiveFont;
effectiveForeground = foreground_.IsOk() ? foreground_ : attrInEffect->effectiveForeground;
effectiveBackground = background.IsOk() ? background : attrInEffect->effectiveBackground;
}
else
{
effectiveFont = font;
effectiveForeground = foreground;
effectiveBackground = background;
}
}
wxFont font;
wxColour foreground,
background;
wxFont effectiveFont;
wxColour effectiveForeground,
effectiveBackground;
};
// This object must be initialized with the font and colours to use
// initially, i.e. the ones used before any tags in the string.
wxMarkupParserAttrOutput(const wxFont& font,
const wxColour& foreground,
const wxColour& background)
{
m_attrs.push(Attr(nullptr, font, foreground, background));
}
// Indicates the change of the font and/or colours used. Any of the
// fields of the argument may be invalid indicating that the corresponding
// attribute didn't actually change.
virtual void OnAttrStart(const Attr& attr) = 0;
// Indicates the end of the region affected by the given attributes
// (the same ones that were passed to the matching OnAttrStart(), use
// GetAttr() to get the ones that will be used from now on).
virtual void OnAttrEnd(const Attr& attr) = 0;
// Implement all pure virtual methods inherited from the base class in
// terms of our own ones.
virtual void OnBoldStart() override { DoChangeFont(&wxFont::Bold); }
virtual void OnBoldEnd() override { DoEndAttr(); }
virtual void OnItalicStart() override { DoChangeFont(&wxFont::Italic); }
virtual void OnItalicEnd() override { DoEndAttr(); }
virtual void OnUnderlinedStart() override { DoChangeFont(&wxFont::Underlined); }
virtual void OnUnderlinedEnd() override { DoEndAttr(); }
virtual void OnStrikethroughStart() override { DoChangeFont(&wxFont::Strikethrough); }
virtual void OnStrikethroughEnd() override { DoEndAttr(); }
virtual void OnBigStart() override { DoChangeFont(&wxFont::Larger); }
virtual void OnBigEnd() override { DoEndAttr(); }
virtual void OnSmallStart() override { DoChangeFont(&wxFont::Smaller); }
virtual void OnSmallEnd() override { DoEndAttr(); }
virtual void OnTeletypeStart() override
{
wxFont font(GetFont());
font.SetFamily(wxFONTFAMILY_TELETYPE);
DoSetFont(font);
}
virtual void OnTeletypeEnd() override { DoEndAttr(); }
virtual void OnSpanStart(const wxMarkupSpanAttributes& spanAttr) override
{
wxFont font(GetFont());
if ( !spanAttr.m_fontFace.empty() )
font.SetFaceName(spanAttr.m_fontFace);
FontModifier<wxFontWeight>()(spanAttr.m_isBold,
font, &wxFont::SetWeight,
wxFONTWEIGHT_NORMAL, wxFONTWEIGHT_BOLD);
FontModifier<wxFontStyle>()(spanAttr.m_isItalic,
font, &wxFont::SetStyle,
wxFONTSTYLE_NORMAL, wxFONTSTYLE_ITALIC);
FontModifier<bool>()(spanAttr.m_isUnderlined,
font, &wxFont::SetUnderlined,
false, true);
FontModifier<bool>()(spanAttr.m_isStrikethrough,
font, &wxFont::SetStrikethrough,
false, true);
switch ( spanAttr.m_sizeKind )
{
case wxMarkupSpanAttributes::Size_Unspecified:
break;
case wxMarkupSpanAttributes::Size_Relative:
if ( spanAttr.m_fontSize > 0 )
font.MakeLarger();
else
font.MakeSmaller();
break;
case wxMarkupSpanAttributes::Size_Symbolic:
// The values of font size intentionally coincide with the
// values of wxFontSymbolicSize enum elements so simply cast
// one to the other.
font.SetSymbolicSize(
static_cast<wxFontSymbolicSize>(spanAttr.m_fontSize)
);
break;
case wxMarkupSpanAttributes::Size_PointParts:
font.SetFractionalPointSize(spanAttr.m_fontSize/1024.);
break;
}
const Attr attr(&m_attrs.top(), font, spanAttr.m_fgCol, spanAttr.m_bgCol);
OnAttrStart(attr);
m_attrs.push(attr);
}
virtual void OnSpanEnd(const wxMarkupSpanAttributes& WXUNUSED(spanAttr)) override
{
DoEndAttr();
}
protected:
// Get the current attributes, i.e. the ones that should be used for
// rendering (or measuring or whatever) the text at the current position in
// the string.
//
// It may be called from OnAttrStart() to get the old attributes used
// before and from OnAttrEnd() to get the new attributes that will be used
// from now on but is mostly meant to be used from overridden OnText()
// implementations.
const Attr& GetAttr() const { return m_attrs.top(); }
// A shortcut for accessing the font of the current attribute.
const wxFont& GetFont() const { return GetAttr().font; }
private:
// Change only the font to the given one. Call OnAttrStart() to notify
// about the change and update the attributes stack.
void DoSetFont(const wxFont& font)
{
const Attr attr(&m_attrs.top(), font);
OnAttrStart(attr);
m_attrs.push(attr);
}
// Apply the given function to the font currently on top of the font stack,
// push the new font on the stack and call OnAttrStart() with it.
void DoChangeFont(wxFont (wxFont::*func)() const)
{
DoSetFont((GetFont().*func)());
}
void DoEndAttr()
{
const Attr attr(m_attrs.top());
m_attrs.pop();
OnAttrEnd(attr);
}
// A helper class used to apply the given function to a wxFont object
// depending on the value of an OptionalBool.
template <typename T>
struct FontModifier
{
FontModifier() = default;
void operator()(wxMarkupSpanAttributes::OptionalBool isIt,
wxFont& font,
void (wxFont::*func)(T),
T noValue,
T yesValue)
{
switch ( isIt )
{
case wxMarkupSpanAttributes::Unspecified:
break;
case wxMarkupSpanAttributes::No:
(font.*func)(noValue);
break;
case wxMarkupSpanAttributes::Yes:
(font.*func)(yesValue);
break;
}
}
};
wxStack<Attr> m_attrs;
wxDECLARE_NO_COPY_CLASS(wxMarkupParserAttrOutput);
};
#endif // _WX_PRIVATE_MARKUPPARSERATTR_H_

View File

@@ -0,0 +1,216 @@
/////////////////////////////////////////////////////////////////////////////
// Name: wx/private/menuradio.h
// Purpose: wxMenuRadioItemsData implementation
// Author: Vadim Zeitlin
// Modified: Artur Wieczorek: added UpdateOnInsertNonRadio()
// Created: 2017-08-12
// Copyright: (c) 2011 Vadim Zeitlin et al
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
#ifndef WX_PRIVATE_MENURADIO_H_
#define WX_PRIVATE_MENURADIO_H_
#include "wx/vector.h"
// Contains the data about the radio items groups in the given menu.
class wxMenuRadioItemsData
{
public:
wxMenuRadioItemsData() = default;
// Default copy ctor, assignment operator and dtor are all ok.
// Find the start and end of the group containing the given position or
// return false if it's not inside any range.
bool GetGroupRange(int pos, int *start, int *end) const
{
// We use a simple linear search here because there are not that many
// items in a menu and hence even fewer radio items ranges anyhow, so
// normally there is no need to do anything fancy (like keeping the
// array sorted and using binary search).
for ( Ranges::const_iterator it = m_ranges.begin();
it != m_ranges.end();
++it )
{
const Range& r = *it;
if ( r.start <= pos && pos <= r.end )
{
if ( start )
*start = r.start;
if ( end )
*end = r.end;
return true;
}
}
return false;
}
// Take into account the new radio item about to be added at the given
// position. The are two cases to handle:
// - If item precedes the range, the range indices have to be updated.
// - If item falls inside the range, this range is extended to include
// the item.
// Returns true if this item starts a new radio group, false if it extends
// an existing one.
bool UpdateOnInsertRadio(int pos)
{
bool inExistingGroup = false;
for ( Ranges::iterator it = m_ranges.begin();
it != m_ranges.end();
++it )
{
Range& r = *it;
if ( pos < r.start )
{
// Item is inserted before this range, update its indices.
r.start++;
r.end++;
}
else if ( pos <= r.end + 1 )
{
wxASSERT_MSG(!inExistingGroup,
wxS("Item already inserted inside another range"));
// Item is inserted in the middle of this range or immediately
// after it in which case it extends this range so make it span
// one more item in any case.
r.end++;
inExistingGroup = true;
}
//else: Item is inserted after this range, nothing to do for it.
}
if ( inExistingGroup )
return false;
// Make a new range for the group this item will belong to.
Range r;
r.start = pos;
r.end = pos;
m_ranges.push_back(r);
return true;
}
// Take into account the new non-radio item about to be added at the given
// position. The are two cases to handle:
// - If item precedes the range, the range indices have to be updated.
// - If item falls inside the range, this range has to be split into
// two new ranges.
// Returns true if existing group has been split into two subgroups.
bool UpdateOnInsertNonRadio(int pos)
{
bool wasSplit = false;
Range newRange;
for ( Ranges::iterator it = m_ranges.begin();
it != m_ranges.end();
++it )
{
Range& r = *it;
if ( pos <= r.start )
{
// Item is inserted before this range or just at its start,
// update its indices.
r.start++;
r.end++;
}
else if ( pos <= r.end )
{
wxASSERT_MSG(!wasSplit,
wxS("Item already inserted inside another range"));
// Item is inserted inside this range in which case
// it breaks the range into two parts: one ending before
// the item and one started after it.
// The new range after the item has to be stored and added to the list
// after finishing the iteration through the ranges.
newRange.start = pos + 1; // start after the item
newRange.end = r.end + 1; // inherits current end "moved up" by one item
wasSplit = true;
// Current range ends just before the item position.
r.end = pos - 1;
}
//else: Item is inserted after this range, nothing to do for it.
}
if ( !wasSplit )
return false;
// Add a split range to the list.
m_ranges.push_back(newRange);
return true;
}
// Update the ranges of the existing radio groups after removing the menu
// item at the given position.
//
// The item being removed can be the item of any kind, not only the radio
// button belonging to the radio group, and this function checks for it
// and, as a side effect, returns true if this item was found inside an
// existing radio group.
bool UpdateOnRemoveItem(int pos)
{
bool inExistingGroup = false;
// Pointer to (necessarily unique) empty group which could be left
// after removing the last radio button from it.
Ranges::iterator itEmptyGroup = m_ranges.end();
for ( Ranges::iterator it = m_ranges.begin();
it != m_ranges.end();
++it )
{
Range& r = *it;
if ( pos < r.start )
{
// Removed item was positioned before this range, update its
// indices.
r.start--;
r.end--;
}
else if ( pos <= r.end )
{
// Removed item belongs to this radio group (it is a radio
// button), update index of its end.
r.end--;
// Check if empty group left after removal.
// If so, it will be deleted later on.
if ( r.end < r.start )
itEmptyGroup = it;
inExistingGroup = true;
}
//else: Removed item was after this range, nothing to do for it.
}
// Remove empty group from the list.
if ( itEmptyGroup != m_ranges.end() )
m_ranges.erase(itEmptyGroup);
return inExistingGroup;
}
private:
// Contains the inclusive positions of the range start and end.
struct Range
{
int start;
int end;
};
typedef wxVector<Range> Ranges;
Ranges m_ranges;
};
#endif // WX_PRIVATE_MENURADIO_H_

View File

@@ -0,0 +1,54 @@
///////////////////////////////////////////////////////////////////////////////
// Name: wx/private/notifmsg.h
// Purpose: wxNotificationMessage declarations
// Author: Tobias Taschner
// Created: 2015-08-04
// Copyright: (c) 2015 wxWidgets development team
// Licence: wxWindows licence
///////////////////////////////////////////////////////////////////////////////
#ifndef _WX_PRIVATE_NOTIFMSG_H_
#define _WX_PRIVATE_NOTIFMSG_H_
class wxNotificationMessageImpl
{
public:
wxNotificationMessageImpl(wxNotificationMessageBase* notification):
m_notification(notification)
{
}
virtual ~wxNotificationMessageImpl() = default;
virtual bool Show(int timeout) = 0;
virtual bool Close() = 0;
virtual void SetTitle(const wxString& title) = 0;
virtual void SetMessage(const wxString& message) = 0;
virtual void SetParent(wxWindow *parent) = 0;
virtual void SetFlags(int flags) = 0;
virtual void SetIcon(const wxIcon& icon) = 0;
virtual bool AddAction(wxWindowID actionid, const wxString &label) = 0;
bool ProcessNotificationEvent(wxEvent& event)
{
return m_notification->ProcessEvent(event);
}
wxNotificationMessageBase* GetNotification() const
{
return m_notification;
}
protected:
wxNotificationMessageBase* m_notification;
};
#endif // _WX_PRIVATE_NOTIFMSG_H_

View File

@@ -0,0 +1,44 @@
/////////////////////////////////////////////////////////////////////////////
// Name: wx/private/overlay.h
// Purpose: wxOverlayImpl declaration
// Author: Stefan Csomor
// Created: 2006-10-20
// Copyright: (c) wxWidgets team
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
#ifndef _WX_PRIVATE_OVERLAY_H_
#define _WX_PRIVATE_OVERLAY_H_
#include "wx/overlay.h"
#if defined(__WXDFB__)
#define wxHAS_NATIVE_OVERLAY 1
#elif defined(__WXOSX__) && wxOSX_USE_COCOA
#define wxHAS_NATIVE_OVERLAY 1
#elif defined(__WXMSW__)
#define wxHAS_NATIVE_OVERLAY 1
#elif defined(__WXGTK3__)
#define wxHAS_NATIVE_OVERLAY 1
#define wxHAS_GENERIC_OVERLAY 1
#elif defined(__WXQT__)
#define wxHAS_NATIVE_OVERLAY 1
#else
#define wxHAS_GENERIC_OVERLAY 1
#endif
class wxOverlay::Impl
{
public:
virtual ~Impl();
virtual bool IsNative() const;
virtual bool IsOk() = 0;
virtual void Init(wxDC* dc, int x, int y, int width, int height) = 0;
virtual void BeginDrawing(wxDC* dc) = 0;
virtual void EndDrawing(wxDC* dc) = 0;
virtual void Clear(wxDC* dc) = 0;
virtual void Reset() = 0;
virtual void SetOpacity(int WXUNUSED(alpha)) { }
};
#endif // _WX_PRIVATE_OVERLAY_H_

View File

@@ -0,0 +1,29 @@
///////////////////////////////////////////////////////////////////////////////
// Name: wx/private/pipestream.h
// Purpose: Declares wxPipeInputStream and wxPipeOutputStream.
// Author: Vadim Zeitlin
// Modified by: Rob Bresalier
// Created: 2013-04-27
// Copyright: (c) 2003 Vadim Zeitlin <vadim@wxwidgets.org>
// (c) 2013 Rob Bresalier
// Licence: wxWindows licence
///////////////////////////////////////////////////////////////////////////////
#ifndef _WX_PRIVATE_PIPESTREAM_H_
#define _WX_PRIVATE_PIPESTREAM_H_
#include "wx/platform.h"
// wxPipeInputStream is a platform-dependent input stream class (i.e. deriving,
// possible indirectly, from wxInputStream) for reading from a pipe, i.e. a
// pipe FD under Unix or a pipe HANDLE under MSW. It provides a single extra
// IsOpened() method.
//
// wxPipeOutputStream is similar but has no additional methods at all.
#if defined(__UNIX__) && !defined(__WINDOWS__)
#include "wx/unix/private/pipestream.h"
#elif defined(__WINDOWS__)
#include "wx/msw/private/pipestream.h"
#endif
#endif // _WX_PRIVATE_PIPESTREAM_H_

View File

@@ -0,0 +1,40 @@
///////////////////////////////////////////////////////////////////////////////
// Name: wx/private/preferences.h
// Purpose: wxPreferencesEditorImpl declaration.
// Author: Vaclav Slavik
// Created: 2013-02-19
// Copyright: (c) 2013 Vaclav Slavik <vslavik@fastmail.fm>
// Licence: wxWindows licence
///////////////////////////////////////////////////////////////////////////////
#ifndef _WX_PRIVATE_PREFERENCES_H_
#define _WX_PRIVATE_PREFERENCES_H_
#include "wx/preferences.h"
#if wxUSE_TOOLBAR && defined(__WXOSX_COCOA__) && wxOSX_USE_NATIVE_TOOLBAR
#define wxHAS_PREF_EDITOR_NATIVE
#endif
// ----------------------------------------------------------------------------
// wxPreferencesEditorImpl: defines wxPreferencesEditor implementation.
// ----------------------------------------------------------------------------
class wxPreferencesEditorImpl
{
public:
// This is implemented in a platform-specific way.
static wxPreferencesEditorImpl* Create(const wxString& title);
// These methods simply mirror the public wxPreferencesEditor ones.
virtual void AddPage(wxPreferencesPage* page) = 0;
virtual void Show(wxWindow* parent) = 0;
virtual void Dismiss() = 0;
virtual ~wxPreferencesEditorImpl() = default;
protected:
wxPreferencesEditorImpl() = default;
};
#endif // _WX_PRIVATE_PREFERENCES_H_

View File

@@ -0,0 +1,61 @@
///////////////////////////////////////////////////////////////////////////////
// Name: wx/private/print.h
// Purpose: Private printing-related helpers.
// Author: Vadim Zeitlin
// Created: 2024-12-28
// Copyright: (c) 2024 Vadim Zeitlin <vadim@wxwidgets.org>
// Licence: wxWindows licence
///////////////////////////////////////////////////////////////////////////////
#ifndef _WX_PRIVATE_PRINT_H_
#define _WX_PRIVATE_PRINT_H_
// ----------------------------------------------------------------------------
// RAII helper ensuring OnEndPrinting() is called on scope exit
// ----------------------------------------------------------------------------
class wxPrintingGuard
{
public:
explicit wxPrintingGuard(wxPrintout *printout)
: m_printout(printout)
{
m_printout->OnBeginPrinting();
}
~wxPrintingGuard()
{
m_printout->OnEndPrinting();
}
private:
wxPrintout * const m_printout;
wxDECLARE_NO_COPY_CLASS(wxPrintingGuard);
};
// ----------------------------------------------------------------------------
// Another helper ensuring EndPage() is called on scope exit
// ----------------------------------------------------------------------------
class wxPrintingPageGuard
{
public:
explicit wxPrintingPageGuard(wxDC& dc)
: m_dc(dc)
{
m_dc.StartPage();
}
~wxPrintingPageGuard()
{
m_dc.EndPage();
}
private:
wxDC& m_dc;
wxDECLARE_NO_COPY_CLASS(wxPrintingPageGuard);
};
#endif // _WX_PRIVATE_PRINT_H_

View File

@@ -0,0 +1,42 @@
///////////////////////////////////////////////////////////////////////////////
// Name: wx/private/refcountermt.h
// Purpose: wxRefCounterMT class: MT-safe version of wxRefCounter
// Author: Vadim Zeitlin
// Created: 2021-01-11
// Copyright: (c) 2021 Vadim Zeitlin <vadim@wxwidgets.org>
// Licence: wxWindows licence
///////////////////////////////////////////////////////////////////////////////
#ifndef _WX_PRIVATE_REFCOUNTERMT_H_
#define _WX_PRIVATE_REFCOUNTERMT_H_
#include "wx/atomic.h"
// ----------------------------------------------------------------------------
// Version of wxRefCounter with MT-safe count
// ----------------------------------------------------------------------------
class wxRefCounterMT
{
public:
wxRefCounterMT() { m_count = 1; }
void IncRef() { wxAtomicInc(m_count); }
void DecRef()
{
if ( wxAtomicDec(m_count) == 0 )
delete this;
}
protected:
virtual ~wxRefCounterMT() = default;
private:
// Ref count is atomic to allow IncRef() and DecRef() to be concurrently
// called from different threads.
wxAtomicInt m_count;
wxDECLARE_NO_COPY_CLASS(wxRefCounterMT);
};
#endif // _WX_PRIVATE_REFCOUNTERMT_H_

View File

@@ -0,0 +1,146 @@
///////////////////////////////////////////////////////////////////////////////
// Name: wx/private/rescale.h
// Purpose: Helpers for rescaling coordinates
// Author: Vadim Zeitlin
// Created: 2021-07-13
// Copyright: (c) 2021 Vadim Zeitlin <vadim@wxwidgets.org>
// Licence: wxWindows licence
///////////////////////////////////////////////////////////////////////////////
#ifndef _WX_PRIVATE_RESCALE_H_
#define _WX_PRIVATE_RESCALE_H_
#include "wx/gdicmn.h"
#include "wx/math.h"
#ifdef __WINDOWS__
// Required in order to use wxMulDivInt32().
#include "wx/msw/wrapwin.h"
#endif
// wxRescaleCoord is used to scale the components of the given wxSize by the
// ratio between 2 scales, with rounding. It doesn't scale the components
// if they're set to -1 (wxDefaultCoord), as this value is special in wxSize.
//
// The way it's used is special because we want to ensure there is no confusion
// between the scale being converted from and the scale being converted to, so
// instead of just using a single function, we use an intermediate object,
// which is not supposed to be used directly, but is only returned by From() in
// order to allow calling To() on it.
//
// Another complication is that we want this to work for both wxSize and
// wxPoint, as well as for just plain coordinate values, so wxRescaleCoord() is
// an overloaded function and the helper classes are templates, with their
// template parameter being either wxSize, wxPoint or int.
namespace wxPrivate
{
template <typename T> class wxRescaleCoordWithValue;
template <typename T>
class wxRescaleCoordWithFrom
{
public:
T To(wxSize newScale) const
{
T value(m_value);
if ( value.x != wxDefaultCoord )
value.x = wxMulDivInt32(value.x, newScale.x, m_oldScale.x);
if ( value.y != wxDefaultCoord )
value.y = wxMulDivInt32(value.y, newScale.y, m_oldScale.y);
return value;
}
T To(int newScaleX, int newScaleY) const
{
return To(wxSize(newScaleX, newScaleY));
}
private:
wxRescaleCoordWithFrom(T value, wxSize oldScale)
: m_value(value), m_oldScale(oldScale)
{
}
const T m_value;
const wxSize m_oldScale;
// Only it can create objects of this class.
friend class wxRescaleCoordWithValue<T>;
};
// Specialization for just a single value.
template <>
class wxRescaleCoordWithFrom<int>
{
public:
int To(wxSize newScale) const
{
return m_value == wxDefaultCoord
? wxDefaultCoord
: wxMulDivInt32(m_value, newScale.x, m_oldScale.x);
}
private:
wxRescaleCoordWithFrom(int value, wxSize oldScale)
: m_value(value), m_oldScale(oldScale)
{
}
const int m_value;
const wxSize m_oldScale;
// Only it can create objects of this class.
friend class wxRescaleCoordWithValue<int>;
};
template <typename T>
class wxRescaleCoordWithValue
{
public:
explicit wxRescaleCoordWithValue(T value)
: m_value(value)
{
}
wxRescaleCoordWithFrom<T> From(wxSize oldScale)
{
return wxRescaleCoordWithFrom<T>(m_value, oldScale);
}
wxRescaleCoordWithFrom<T> From(int oldScaleX, int oldScaleY)
{
return From(wxSize(oldScaleX, oldScaleY));
}
private:
const T m_value;
};
} // namespace wxPrivate
inline wxPrivate::wxRescaleCoordWithValue<int> wxRescaleCoord(int coord)
{
return wxPrivate::wxRescaleCoordWithValue<int>(coord);
}
inline wxPrivate::wxRescaleCoordWithValue<wxSize> wxRescaleCoord(wxSize sz)
{
return wxPrivate::wxRescaleCoordWithValue<wxSize>(sz);
}
inline wxPrivate::wxRescaleCoordWithValue<wxSize> wxRescaleCoord(int x, int y)
{
return wxPrivate::wxRescaleCoordWithValue<wxSize>(wxSize(x, y));
}
inline wxPrivate::wxRescaleCoordWithValue<wxPoint> wxRescaleCoord(wxPoint pt)
{
return wxPrivate::wxRescaleCoordWithValue<wxPoint>(pt);
}
#endif // _WX_PRIVATE_RESCALE_H_

View File

@@ -0,0 +1,44 @@
///////////////////////////////////////////////////////////////////////////////
// Name: wx/private/richtooltip.h
// Purpose: wxRichToolTipImpl declaration.
// Author: Vadim Zeitlin
// Created: 2011-10-18
// Copyright: (c) 2011 Vadim Zeitlin <vadim@wxwidgets.org>
// Licence: wxWindows licence
///////////////////////////////////////////////////////////////////////////////
#ifndef _WX_PRIVATE_RICHTOOLTIP_H_
#define _WX_PRIVATE_RICHTOOLTIP_H_
#include "wx/richtooltip.h"
// ----------------------------------------------------------------------------
// wxRichToolTipImpl: defines wxRichToolTip implementation.
// ----------------------------------------------------------------------------
class wxRichToolTipImpl
{
public:
// This is implemented in a platform-specific way.
static wxRichToolTipImpl* Create(const wxString& title,
const wxString& message);
// These methods simply mirror the public wxRichToolTip ones.
virtual void SetBackgroundColour(const wxColour& col,
const wxColour& colEnd) = 0;
virtual void SetCustomIcon(const wxBitmapBundle& icon) = 0;
virtual void SetStandardIcon(int icon) = 0;
virtual void SetTimeout(unsigned milliseconds,
unsigned millisecondsShowdelay = 0) = 0;
virtual void SetTipKind(wxTipKind tipKind) = 0;
virtual void SetTitleFont(const wxFont& font) = 0;
virtual void ShowFor(wxWindow* win, const wxRect* rect = nullptr) = 0;
virtual ~wxRichToolTipImpl() = default;
protected:
wxRichToolTipImpl() = default;
};
#endif // _WX_PRIVATE_RICHTOOLTIP_H_

View File

@@ -0,0 +1,73 @@
///////////////////////////////////////////////////////////////////////////////
// Name: wx/private/safecall.h
// Purpose: Call a function "safely", i.e. potentially catching exceptions.
// Author: Vadim Zeitlin
// Created: 2025-03-20
// Copyright: (c) 2025 Vadim Zeitlin <vadim@wxwidgets.org>
// Licence: wxWindows licence
///////////////////////////////////////////////////////////////////////////////
#ifndef _WX_PRIVATE_SAFECALL_H_
#define _WX_PRIVATE_SAFECALL_H_
#include "wx/app.h"
#if wxUSE_EXCEPTIONS
// Returns true if a special system option disabling catching unhandled
// exceptions is set.
//
// This function is implemented in sysopt.cpp.
extern bool WXDLLIMPEXP_BASE wxIsCatchUnhandledExceptionsDisabled();
// General version calls the given function or function-like object and
// executes the provided handler if an exception is thrown.
//
// Both the function and the handler must return the value of the same type R,
// possibly void.
template <typename R, typename T1, typename T2>
inline R wxSafeCall(const T1& func, const T2& handler)
{
#if wxUSE_SYSTEM_OPTIONS
if ( wxIsCatchUnhandledExceptionsDisabled() )
{
return func();
}
#endif // wxUSE_SYSTEM_OPTIONS
try
{
return func();
}
catch ( ... )
{
return handler();
}
}
// Simplified version for the common case when the function doesn't return
// anything and we just want to call wxApp::OnUnhandledException() if it
// throws.
template <typename T>
inline void wxSafeCall(const T& func)
{
wxSafeCall<void>(func, wxApp::CallOnUnhandledException);
}
#else // !wxUSE_EXCEPTIONS
template <typename R, typename T1, typename T2>
inline R wxSafeCall(const T1& func, const T2& WXUNUSED(handler))
{
return func();
}
template <typename T>
inline void wxSafeCall(const T& func)
{
func();
}
#endif // wxUSE_EXCEPTIONS/!wxUSE_EXCEPTIONS
#endif // _WX_PRIVATE_SAFECALL_H_

View File

@@ -0,0 +1,316 @@
///////////////////////////////////////////////////////////////////////////////
// Name: wx/private/sckaddr.h
// Purpose: wxSockAddressImpl
// Author: Vadim Zeitlin
// Created: 2008-12-28
// Copyright: (c) 2008 Vadim Zeitlin <vadim@wxwidgets.org>
// Licence: wxWindows licence
///////////////////////////////////////////////////////////////////////////////
#ifndef _WX_PRIVATE_SOCKADDR_H_
#define _WX_PRIVATE_SOCKADDR_H_
#ifdef __WINDOWS__
#include "wx/msw/wrapwin.h"
#if wxUSE_IPV6
#include <ws2tcpip.h>
#endif
#elif defined(__VMS__)
#include <socket.h>
struct sockaddr_un
{
u_char sun_len; /* sockaddr len including null */
u_char sun_family; /* AF_UNIX */
char sun_path[108]; /* path name (gag) */
};
#include <in.h>
#else // generic Unix
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <sys/un.h>
#endif // platform
#include <stdlib.h> // for calloc()
// this is a wrapper for sockaddr_storage if it's available or just sockaddr
// otherwise
union wxSockAddressStorage
{
#if wxUSE_IPV6
sockaddr_storage addr_storage;
#endif
sockaddr addr;
};
// ----------------------------------------------------------------------------
// helpers for wxSockAddressImpl
// ----------------------------------------------------------------------------
// helper class mapping sockaddr_xxx types to corresponding AF_XXX values
template <class T> struct AddressFamily;
template <> struct AddressFamily<sockaddr_in> { enum { value = AF_INET }; };
#if wxUSE_IPV6
template <> struct AddressFamily<sockaddr_in6> { enum { value = AF_INET6 }; };
#endif // wxUSE_IPV6
#ifdef wxHAS_UNIX_DOMAIN_SOCKETS
template <> struct AddressFamily<sockaddr_un> { enum { value = AF_UNIX }; };
#endif // wxHAS_UNIX_DOMAIN_SOCKETS
// ----------------------------------------------------------------------------
// wxSockAddressImpl
// ----------------------------------------------------------------------------
// Represents a socket endpoint, e.g. an (address, port) pair for PF_INET
// sockets. It can be initialized from an existing sockaddr struct and also
// provides access to sockaddr stored internally so that it can be easily used
// with e.g. connect(2).
//
// This class also performs (synchronous, hence potentially long) name lookups
// if necessary, i.e. if the host name strings don't contain addresses in
// numerical form (quad dotted for IPv4 or standard hexadecimal for IPv6).
// Notice that internally the potentially Unicode host names are encoded as
// UTF-8 before being passed to the lookup function but the host names should
// really be ASCII anyhow.
class wxSockAddressImpl
{
public:
// as this is passed to socket() it should be a PF_XXX and not AF_XXX (even
// though they're the same in practice)
enum Family
{
FAMILY_INET = PF_INET,
#if wxUSE_IPV6
FAMILY_INET6 = PF_INET6,
#endif
#ifdef wxHAS_UNIX_DOMAIN_SOCKETS
FAMILY_UNIX = PF_UNIX,
#endif
FAMILY_UNSPEC = PF_UNSPEC
};
// default ctor creates uninitialized object, use one of CreateXXX() below
wxSockAddressImpl()
{
InitUnspec();
}
// ctor from an existing sockaddr
wxSockAddressImpl(const sockaddr& addr, int len)
{
switch ( addr.sa_family )
{
case PF_INET:
#if wxUSE_IPV6
case PF_INET6:
#endif
#ifdef wxHAS_UNIX_DOMAIN_SOCKETS
case PF_UNIX:
#endif
m_family = static_cast<Family>(addr.sa_family);
break;
default:
wxFAIL_MSG( "unsupported socket address family" );
InitUnspec();
return;
}
InitFromSockaddr(addr, len);
}
// copy ctor and assignment operators
wxSockAddressImpl(const wxSockAddressImpl& other)
{
InitFromOther(other);
}
wxSockAddressImpl& operator=(const wxSockAddressImpl& other)
{
if (this != &other)
{
free(m_addr);
InitFromOther(other);
}
return *this;
}
// dtor frees the memory used by m_addr
~wxSockAddressImpl()
{
free(m_addr);
}
// reset the address to the initial uninitialized state
void Clear()
{
free(m_addr);
InitUnspec();
}
// initialize the address to be of specific address family, it must be
// currently uninitialized (you may call Clear() to achieve this)
void CreateINET();
void CreateINET6();
#ifdef wxHAS_UNIX_DOMAIN_SOCKETS
void CreateUnix();
#endif // wxHAS_UNIX_DOMAIN_SOCKETS
void Create(Family family)
{
switch ( family )
{
case FAMILY_INET:
CreateINET();
break;
#if wxUSE_IPV6
case FAMILY_INET6:
CreateINET6();
break;
#endif // wxUSE_IPV6
#ifdef wxHAS_UNIX_DOMAIN_SOCKETS
case FAMILY_UNIX:
CreateUnix();
break;
#endif // wxHAS_UNIX_DOMAIN_SOCKETS
default:
wxFAIL_MSG( "unsupported socket address family" );
}
}
// simple accessors
Family GetFamily() const { return m_family; }
bool Is(Family family) const { return m_family == family; }
bool IsOk() const { return m_family != FAMILY_UNSPEC; }
const sockaddr *GetAddr() const { return m_addr; }
sockaddr *GetWritableAddr() { return m_addr; }
int GetLen() const { return m_len; }
// accessors for INET or INET6 address families
#if wxUSE_IPV6
#define CALL_IPV4_OR_6(func, args) \
Is(FAMILY_INET6) ? func##6(args) : func##4(args)
#define CALL_IPV4_OR_6_VOID(func) \
Is(FAMILY_INET6) ? func##6() : func##4()
#else
#define CALL_IPV4_OR_6(func, args) func##4(args)
#define CALL_IPV4_OR_6_VOID(func) func##4()
#endif // IPv6 support on/off
wxString GetHostName() const;
bool SetHostName(const wxString& name)
{
return CALL_IPV4_OR_6(SetHostName, (name));
}
wxUint16 GetPort() const { return CALL_IPV4_OR_6_VOID(GetPort); }
bool SetPort(wxUint16 port) { return CALL_IPV4_OR_6(SetPort, (port)); }
bool SetPortName(const wxString& name, const char *protocol);
bool SetToAnyAddress() { return CALL_IPV4_OR_6_VOID(SetToAnyAddress); }
#undef CALL_IPV4_OR_6
// accessors for INET addresses only
bool GetHostAddress(wxUint32 *address) const;
bool SetHostAddress(wxUint32 address);
bool SetToBroadcastAddress() { return SetHostAddress(INADDR_BROADCAST); }
// accessors for INET6 addresses only
#if wxUSE_IPV6
bool GetHostAddress(in6_addr *address) const;
bool SetHostAddress(const in6_addr& address);
#endif // wxUSE_IPV6
#ifdef wxHAS_UNIX_DOMAIN_SOCKETS
// methods valid for Unix address family addresses only
bool SetPath(const wxString& path);
wxString GetPath() const;
#endif // wxHAS_UNIX_DOMAIN_SOCKETS
private:
void DoAlloc(int len)
{
m_addr = static_cast<sockaddr *>(calloc(1, len));
m_len = len;
}
template <class T>
T *Alloc()
{
DoAlloc(sizeof(T));
return reinterpret_cast<T *>(m_addr);
}
template <class T>
T *Get() const
{
wxCHECK_MSG( static_cast<int>(m_family) == AddressFamily<T>::value,
nullptr,
"socket address family mismatch" );
return reinterpret_cast<T *>(m_addr);
}
void InitUnspec()
{
m_family = FAMILY_UNSPEC;
m_addr = nullptr;
m_len = 0;
}
void InitFromSockaddr(const sockaddr& addr, int len)
{
DoAlloc(len);
memcpy(m_addr, &addr, len);
}
void InitFromOther(const wxSockAddressImpl& other)
{
m_family = other.m_family;
if ( other.m_addr )
{
InitFromSockaddr(*other.m_addr, other.m_len);
}
else // no address to copy
{
m_addr = nullptr;
m_len = 0;
}
}
// IPv4/6 implementations of public functions
bool SetHostName4(const wxString& name);
bool SetPort4(wxUint16 port);
wxUint16 GetPort4() const;
bool SetToAnyAddress4() { return SetHostAddress(INADDR_ANY); }
#if wxUSE_IPV6
bool SetHostName6(const wxString& name);
bool SetPort6(wxUint16 port);
wxUint16 GetPort6() const;
bool SetToAnyAddress6();
#endif // wxUSE_IPV6
Family m_family;
sockaddr *m_addr;
int m_len;
};
#endif // _WX_PRIVATE_SOCKADDR_H_

View File

@@ -0,0 +1,95 @@
///////////////////////////////////////////////////////////////////////////////
// Name: wx/private/secretstore.h
// Purpose: Classes used in wxSecretStore implementation only.
// Author: Vadim Zeitlin
// Created: 2016-05-27
// Copyright: (c) 2016 Vadim Zeitlin <vadim@wxwidgets.org>
// Licence: wxWindows licence
///////////////////////////////////////////////////////////////////////////////
#ifndef _WX_PRIVATE_SECRETSTORE_H_
#define _WX_PRIVATE_SECRETSTORE_H_
#include "wx/object.h" // wxRefCounter
// Both of the implementation classes here are ref-counted so that the
// corresponding public objects could be copied cheaply and, in the case of
// wxSecretValue, also to avoid having the secret in more than one place in
// memory at a time.
// ----------------------------------------------------------------------------
// Class holding wxSecretValue data
// ----------------------------------------------------------------------------
// This is a common base class for our own and libsecret-based implementations.
class wxSecretValueImpl : public wxRefCounter
{
public:
wxSecretValueImpl()
{
}
virtual size_t GetSize() const = 0;
virtual const void *GetData() const = 0;
};
// Trivial common implementation of wxSecretValueImpl used under MSW and OS X.
#if defined(__WINDOWS__) || defined(__DARWIN__)
class wxSecretValueGenericImpl : public wxSecretValueImpl
{
public:
wxSecretValueGenericImpl(size_t size, const void *data)
: m_size(size),
m_data(new char[size])
{
memcpy(m_data, data, size);
}
virtual ~wxSecretValueGenericImpl()
{
if ( m_data )
{
wxSecretValue::Wipe(m_size, m_data);
delete [] m_data;
}
}
virtual size_t GetSize() const override { return m_size; }
virtual const void *GetData() const override { return m_data; }
private:
const size_t m_size;
char* const m_data;
};
#endif // MSW or OSX
// ----------------------------------------------------------------------------
// Base class for wxSecretStore implementations
// ----------------------------------------------------------------------------
// All its methods are similar to the methods of the public class except that
// they work with the implementation rather than public objects and they all
// take an extra "wxString&" output parameter which is filled with the low
// level error message in case of an error. This message will be logged by
// wxSecretStore itself, wxSecretStoreImpl methods shouldn't do any logging on
// their own.
class wxSecretStoreImpl : public wxRefCounter
{
public:
virtual bool IsOk(wxString* WXUNUSED(errmsg)) const { return true; }
virtual bool Save(const wxString& service,
const wxString& username,
const wxSecretValueImpl& password,
wxString& errmsg) = 0;
virtual bool Load(const wxString& service,
wxString* username,
wxSecretValueImpl** password,
wxString& errmsg) const = 0;
virtual bool Delete(const wxString& service,
wxString& errmsg) = 0;
};
#endif // _WX_PRIVATE_SECRETSTORE_H_

View File

@@ -0,0 +1,125 @@
/////////////////////////////////////////////////////////////////////////////
// Name: wx/private/selectdispatcher.h
// Purpose: wxSelectDispatcher class
// Authors: Lukasz Michalski and Vadim Zeitlin
// Created: December 2006
// Copyright: (c) Lukasz Michalski
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
#ifndef _WX_PRIVATE_SELECTDISPATCHER_H_
#define _WX_PRIVATE_SELECTDISPATCHER_H_
#include "wx/defs.h"
#if wxUSE_SELECT_DISPATCHER
#if defined(HAVE_SYS_SELECT_H)
#include <sys/time.h>
#include <sys/select.h>
#endif
#include <sys/types.h>
#include "wx/thread.h"
#include "wx/private/fdiodispatcher.h"
// helper class storing all the select() fd sets
class WXDLLIMPEXP_BASE wxSelectSets
{
public:
// ctor zeroes out all fd_sets
wxSelectSets();
// default copy ctor, assignment operator and dtor are ok
// return true if fd appears in any of the sets
bool HasFD(int fd) const;
// add or remove FD to our sets depending on whether flags contains
// wxFDIO_INPUT/OUTPUT/EXCEPTION bits
bool SetFD(int fd, int flags);
// same as SetFD() except it unsets the bits set in the flags for the given
// fd
bool ClearFD(int fd)
{
return SetFD(fd, 0);
}
// call select() with our sets: the other parameters are the same as for
// select() itself
int Select(int nfds, struct timeval *tv);
// call the handler methods corresponding to the sets having this fd if it
// is present in any set and return true if it is
bool Handle(int fd, wxFDIOHandler& handler) const;
private:
typedef void (wxFDIOHandler::*Callback)();
// the FD sets indices
enum
{
Read,
Write,
Except,
Max
};
// the sets used with select()
fd_set m_fds[Max];
// the wxFDIO_XXX flags, functions and names (used for debug messages only)
// corresponding to the FD sets above
static int ms_flags[Max];
static const char *ms_names[Max];
static Callback ms_handlers[Max];
};
class WXDLLIMPEXP_BASE wxSelectDispatcher : public wxMappedFDIODispatcher
{
public:
// default ctor
wxSelectDispatcher() { m_maxFD = -1; }
// implement pure virtual methods of the base class
virtual bool RegisterFD(int fd, wxFDIOHandler *handler, int flags = wxFDIO_ALL) override;
virtual bool ModifyFD(int fd, wxFDIOHandler *handler, int flags = wxFDIO_ALL) override;
virtual bool UnregisterFD(int fd) override;
virtual bool HasPending() const override;
virtual int Dispatch(int timeout = TIMEOUT_INFINITE) override;
private:
// common part of RegisterFD() and ModifyFD()
bool DoUpdateFDAndHandler(int fd, wxFDIOHandler *handler, int flags);
// call the handlers for the fds present in the given sets, return the
// number of handlers we called
int ProcessSets(const wxSelectSets& sets);
// helper of ProcessSets(): call the handler if its fd is in the set
void DoProcessFD(int fd, const fd_set& fds, wxFDIOHandler *handler,
const char *name);
// common part of HasPending() and Dispatch(): calls select() with the
// specified timeout
int DoSelect(wxSelectSets& sets, int timeout) const;
#if wxUSE_THREADS
wxCriticalSection m_cs;
#endif // wxUSE_THREADS
// the select sets containing all the registered fds
wxSelectSets m_sets;
// the highest registered fd value or -1 if none
int m_maxFD;
};
#endif // wxUSE_SELECT_DISPATCHER
#endif // _WX_PRIVATE_SOCKETEVTDISPATCH_H_

View File

@@ -0,0 +1,387 @@
/////////////////////////////////////////////////////////////////////////////
// Name: wx/private/socket.h
// Purpose: wxSocketImpl and related declarations
// Authors: Guilhem Lavaux, Vadim Zeitlin
// Created: April 1997
// Copyright: (c) 1997 Guilhem Lavaux
// (c) 2008 Vadim Zeitlin
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
/*
Brief overview of different socket classes:
- wxSocketBase is the public class representing a socket ("Base" here
refers to the fact that wxSocketClient and wxSocketServer are derived
from it and predates the convention of using "Base" for common base
classes for platform-specific classes in wxWidgets) with implementation
common to all platforms and forwarding methods whose implementation
differs between platforms to wxSocketImpl which it contains.
- wxSocketImpl is actually just an abstract base class having only code
common to all platforms, the concrete implementation classes derive from
it and are created by wxSocketImpl::Create().
- Some socket operations have different implementations in console-mode and
GUI applications. wxSocketManager class exists to abstract this in such
way that console applications (using wxBase) don't depend on wxNet. An
object of this class is made available via wxApp and GUI applications set
up a different kind of global socket manager from console ones.
TODO: it looks like wxSocketManager could be eliminated by providing
methods for registering/unregistering sockets directly in
wxEventLoop.
*/
#ifndef _WX_PRIVATE_SOCKET_H_
#define _WX_PRIVATE_SOCKET_H_
#include "wx/defs.h"
#if wxUSE_SOCKETS
#include "wx/socket.h"
#include "wx/private/sckaddr.h"
#include <stddef.h>
/*
Including sys/types.h under Cygwin results in the warnings about "fd_set
having been defined in sys/types.h" when winsock.h is included later and
doesn't seem to be necessary anyhow. It's not needed under Mac either.
*/
#if !defined(__WXMAC__) && !defined(__WXMSW__)
#include <sys/types.h>
#endif
// include the header defining timeval: under Windows this struct is used only
// with sockets so we need to include winsock.h which we do via windows.h
#ifdef __WINDOWS__
#include "wx/msw/wrapwin.h"
#else
#include <sys/time.h> // for timeval
#endif
// 64 bit Cygwin can't use the standard struct timeval because it has long
// fields, which are supposed to be 32 bits in Win64 API, but long is 64 bits
// in 64 bit Cygwin, so we need to use its special __ms_timeval instead.
#if defined(__CYGWIN__) && defined(__LP64__) && defined(__WINDOWS__)
typedef __ms_timeval wxTimeVal_t;
#else
typedef timeval wxTimeVal_t;
#endif
// these definitions are for MSW when we don't use configure, otherwise these
// symbols are defined by configure
#ifndef WX_SOCKLEN_T
#define WX_SOCKLEN_T int
#endif
#ifndef SOCKOPTLEN_T
#define SOCKOPTLEN_T int
#endif
// define some symbols which winsock.h defines but traditional BSD headers
// don't
#ifndef INVALID_SOCKET
#define INVALID_SOCKET (-1)
#endif
#ifndef SOCKET_ERROR
#define SOCKET_ERROR (-1)
#endif
typedef int wxSocketEventFlags;
class wxSocketImpl;
/*
Class providing hooks abstracting the differences between console and GUI
applications for socket code.
We also have different implementations of this class for different platforms
allowing us to keep more things in the common code but the main reason for
its existence is that we want the same socket code work differently
depending on whether it's used from a console or a GUI program. This is
achieved by implementing the virtual methods of this class differently in
the objects returned by wxConsoleAppTraits::GetSocketManager() and the same
method in wxGUIAppTraits.
*/
class wxSocketManager
{
public:
// set the manager to use, we don't take ownership of it
//
// this should be called before creating the first wxSocket object,
// otherwise the manager returned by wxAppTraits::GetSocketManager() will
// be used
static void Set(wxSocketManager *manager);
// return the manager to use
//
// this initializes the manager at first use
static wxSocketManager *Get()
{
if ( !ms_manager )
Init();
return ms_manager;
}
// called before the first wxSocket is created and should do the
// initializations needed in order to use the network
//
// return true if initialized successfully; if this returns false sockets
// can't be used at all
virtual bool OnInit() = 0;
// undo the initializations of OnInit()
virtual void OnExit() = 0;
// create the socket implementation object matching this manager
virtual wxSocketImpl *CreateSocket(wxSocketBase& wxsocket) = 0;
// these functions enable or disable monitoring of the given socket for the
// specified events inside the currently running event loop (but notice
// that both BSD and Winsock implementations actually use socket->m_server
// value to determine what exactly should be monitored so it needs to be
// set before calling these functions)
//
// the default event value is used just for the convenience of wxMSW
// implementation which doesn't use this parameter anyhow, it doesn't make
// sense to pass wxSOCKET_LOST for the Unix implementation which does use
// this parameter
virtual void Install_Callback(wxSocketImpl *socket,
wxSocketNotify event = wxSOCKET_LOST) = 0;
virtual void Uninstall_Callback(wxSocketImpl *socket,
wxSocketNotify event = wxSOCKET_LOST) = 0;
virtual ~wxSocketManager() = default;
private:
// get the manager to use if we don't have it yet
static void Init();
static wxSocketManager *ms_manager;
};
/*
Base class for all socket implementations providing functionality common to
BSD and Winsock sockets.
Objects of this class are not created directly but only via the factory
function wxSocketManager::CreateSocket().
*/
class wxSocketImpl
{
public:
virtual ~wxSocketImpl();
// set various socket properties: all of those can only be called before
// creating the socket
void SetTimeout(unsigned long millisec);
void SetReusable() { m_reusable = true; }
void SetBroadcast() { m_broadcast = true; }
void DontDoBind() { m_dobind = false; }
void SetInitialSocketBuffers(int recv, int send)
{
m_initialRecvBufferSize = recv;
m_initialSendBufferSize = send;
}
wxSocketError SetLocal(const wxSockAddressImpl& address);
wxSocketError SetPeer(const wxSockAddressImpl& address);
// accessors
// ---------
bool IsServer() const { return m_server; }
const wxSockAddressImpl& GetLocal(); // non const as may update m_local
const wxSockAddressImpl& GetPeer() const { return m_peer; }
wxSocketError GetError() const { return m_error; }
bool IsOk() const { return m_error == wxSOCKET_NOERROR; }
// creating/closing the socket
// --------------------------
// notice that SetLocal() must be called before creating the socket using
// any of the functions below
//
// all of Create() functions return wxSOCKET_NOERROR if the operation
// completed successfully or one of:
// wxSOCKET_INVSOCK - the socket is in use.
// wxSOCKET_INVADDR - the local (server) or peer (client) address has not
// been set.
// wxSOCKET_IOERR - any other error.
// create a socket listening on the local address specified by SetLocal()
// (notice that DontDoBind() is ignored by this function)
wxSocketError CreateServer();
// create a socket connected to the peer address specified by SetPeer()
// (notice that DontDoBind() is ignored by this function)
//
// this function may return wxSOCKET_WOULDBLOCK in addition to the return
// values listed above if wait is false
wxSocketError CreateClient(bool wait);
// create (and bind unless DontDoBind() had been called) an UDP socket
// associated with the given local address
wxSocketError CreateUDP();
// may be called whether the socket was created or not, calls DoClose() if
// it was indeed created
void Close();
// shuts down the writing end of the socket and closes it, this is a more
// graceful way to close
//
// does nothing if the socket wasn't created
void Shutdown();
// IO operations
// -------------
// basic IO, work for both TCP and UDP sockets
//
// return the number of bytes read/written (possibly 0) or -1 on error
int Read(void *buffer, int size);
int Write(const void *buffer, int size);
// basically a wrapper for select(): returns the condition of the socket,
// blocking for not longer than timeout if it is specified (otherwise just
// poll without blocking at all)
//
// flags defines what kind of conditions we're interested in, the return
// value is composed of a (possibly empty) subset of the bits set in flags
wxSocketEventFlags Select(wxSocketEventFlags flags,
wxTimeVal_t *timeout = nullptr);
// convenient wrapper calling Select() with our default timeout
wxSocketEventFlags SelectWithTimeout(wxSocketEventFlags flags)
{
return Select(flags, &m_timeout);
}
// just a wrapper for accept(): it is called to create a new wxSocketImpl
// corresponding to a new server connection represented by the given
// wxSocketBase, returns nullptr on error (including immediately if there are
// no pending connections as our sockets are non-blocking)
wxSocketImpl *Accept(wxSocketBase& wxsocket);
// notifications
// -------------
// Update the socket depending on the presence or absence of wxSOCKET_BLOCK
// in GetSocketFlags(): if it's present, make the socket blocking and
// ensure that we don't get any asynchronous event for it, otherwise put
// it into non-blocking mode and enable monitoring it in the event loop.
virtual void UpdateBlockingState() = 0;
// notify m_wxsocket about the given socket event by calling its (inaptly
// named) OnRequest() method
void NotifyOnStateChange(wxSocketNotify event);
// called after reading/writing the data from/to the socket and should
// enable back the wxSOCKET_INPUT/OUTPUT_FLAG notifications if they were
// turned off when this data was first detected
virtual void ReenableEvents(wxSocketEventFlags flags) = 0;
// TODO: make these fields protected and provide accessors for those of
// them that wxSocketBase really needs
//protected:
wxSOCKET_T m_fd;
int m_initialRecvBufferSize;
int m_initialSendBufferSize;
wxSockAddressImpl m_local,
m_peer;
wxSocketError m_error;
bool m_stream;
bool m_establishing;
bool m_reusable;
bool m_broadcast;
bool m_dobind;
wxTimeVal_t m_timeout;
protected:
wxSocketImpl(wxSocketBase& wxsocket);
// get the associated socket flags
wxSocketFlags GetSocketFlags() const { return m_wxsocket->GetFlags(); }
// set m_error to the outcome of the last operation and return it
wxSocketError UpdateLastError() { m_error = GetLastError(); return m_error; }
// true if we're a listening stream socket
bool m_server;
private:
// get the error code corresponding to the last operation
//
// this is private because it's only used by UpdateLastError()
virtual wxSocketError GetLastError() const = 0;
// called by Close() if we have a valid m_fd
virtual void DoClose() = 0;
// check that the socket wasn't created yet and that the given address
// (either m_local or m_peer depending on the socket kind) is valid and
// set m_error and return false if this is not the case
bool PreCreateCheck(const wxSockAddressImpl& addr);
// set the given socket option: this just wraps setsockopt(SOL_SOCKET)
int SetSocketOption(int optname, int optval)
{
// although modern Unix systems use "const void *" for the 4th
// parameter here, old systems and Winsock still use "const char *"
return setsockopt(m_fd, SOL_SOCKET, optname,
reinterpret_cast<const char *>(&optval),
sizeof(optval));
}
// set the given socket option to true value: this is an even simpler
// wrapper for setsockopt(SOL_SOCKET) for boolean options
int EnableSocketOption(int optname)
{
return SetSocketOption(optname, 1);
}
// apply the options to the (just created) socket and register it with the
// event loop by calling UpdateBlockingState()
void PostCreation();
// update local address after binding/connecting
wxSocketError UpdateLocalAddress();
// functions used to implement Read/Write()
int RecvStream(void *buffer, int size);
int RecvDgram(void *buffer, int size);
int SendStream(const void *buffer, int size);
int SendDgram(const void *buffer, int size);
// set in ctor and never changed except that it's reset to nullptr when the
// socket is shut down
wxSocketBase *m_wxsocket;
wxDECLARE_NO_COPY_CLASS(wxSocketImpl);
};
#if defined(__WINDOWS__)
#include "wx/msw/private/sockmsw.h"
#else
#include "wx/unix/private/sockunix.h"
#endif
#endif /* wxUSE_SOCKETS */
#endif /* _WX_PRIVATE_SOCKET_H_ */

View File

@@ -0,0 +1,41 @@
///////////////////////////////////////////////////////////////////////////////
// Name: wx/private/spinctrl.h
// Purpose: Private functions used in wxSpinCtrl implementation.
// Author: Vadim Zeitlin
// Created: 2019-11-13
// Copyright: (c) 2019 Vadim Zeitlin <vadim@wxwidgets.org>
// Licence: wxWindows licence
///////////////////////////////////////////////////////////////////////////////
#ifndef _WX_PRIVATE_SPINCTRL_H_
#define _WX_PRIVATE_SPINCTRL_H_
namespace wxSpinCtrlImpl
{
// This is an internal helper function currently used by all ports: return the
// string containing hexadecimal representation of the given number.
extern wxString FormatAsHex(long val, long maxVal);
// Another helper returning the maximum length of a string representing a value
// valid in the given control.
extern int GetMaxValueLength(int minVal, int maxVal, int base);
// The helper function to determine the best size for the given control.
// We can't implement this function in the wxSpinCtrlBase because MSW implementation
// of wxSpinCtrl is derived from wxSpinButton but uses the same algorithm.
extern wxSize GetBestSize(const wxControl* spin, int minVal, int maxVal, int base);
// Helper function to check if given combination of range and base is valid.
extern bool IsBaseCompatibleWithRange(int minVal, int maxVal, int base);
// Maximum number of digits returned by DetermineDigits().
const unsigned SPINCTRLDBL_MAX_DIGITS = 20;
// Return the number of digits required to show the numbers using the
// specified increment without loss of precision.
extern unsigned DetermineDigits(double inc);
} // namespace wxSpinCtrlImpl
#endif // _WX_PRIVATE_SPINCTRL_H_

View File

@@ -0,0 +1,129 @@
///////////////////////////////////////////////////////////////////////////////
// Name: wx/private/streamtempinput.h
// Purpose: defines wxStreamTempInputBuffer which is used by Unix and MSW
// implementations of wxExecute; this file is only used by the
// library and never by the user code
// Author: Vadim Zeitlin
// Modified by: Rob Bresalier
// Created: 2013-05-04
// Copyright: (c) 2002 Vadim Zeitlin <vadim@wxwidgets.org>
// Licence: wxWindows licence
///////////////////////////////////////////////////////////////////////////////
#ifndef _WX_PRIVATE_STREAMTEMPINPUT_H
#define _WX_PRIVATE_STREAMTEMPINPUT_H
#include "wx/private/pipestream.h"
// ----------------------------------------------------------------------------
// wxStreamTempInputBuffer
// ----------------------------------------------------------------------------
/*
wxStreamTempInputBuffer is a hack which we need to solve the problem of
executing a child process synchronously with IO redirecting: when we do
this, the child writes to a pipe we open to it but when the pipe buffer
(which has finite capacity, e.g. commonly just 4Kb) becomes full we have to
read data from it because the child blocks in its write() until then and if
it blocks we are never going to return from wxExecute() so we dead lock.
So here is the fix: we now read the output as soon as it appears into a temp
buffer (wxStreamTempInputBuffer object) and later just stuff it back into
the stream when the process terminates. See supporting code in wxExecute()
itself as well.
Note that this is horribly inefficient for large amounts of output (count
the number of times we copy the data around) and so a better API is badly
needed! However it's not easy to devise a way to do this keeping backwards
compatibility with the existing wxExecute(wxEXEC_SYNC)...
*/
class wxStreamTempInputBuffer
{
public:
wxStreamTempInputBuffer() = default;
// call to associate a stream with this buffer, otherwise nothing happens
// at all
void Init(wxPipeInputStream *stream)
{
wxASSERT_MSG( !m_stream, wxS("Can only initialize once") );
m_stream = stream;
}
// check for input on our stream and cache it in our buffer if any
//
// return true if anything was done
bool Update()
{
if ( !m_stream || !m_stream->CanRead() )
return false;
// realloc in blocks of 4Kb: this is the default (and minimal) buffer
// size of the Unix pipes so it should be the optimal step
//
// NB: don't use "static int" in this inline function, some compilers
// (e.g. IBM xlC) don't like it
enum { incSize = 4096 };
void *buf = realloc(m_buffer, m_size + incSize);
if ( !buf )
return false;
m_buffer = buf;
m_stream->Read((char *)m_buffer + m_size, incSize);
m_size += m_stream->LastRead();
return true;
}
// check if can continue reading from the stream, this is used to disable
// the callback once we can't read anything more
bool Eof() const
{
// If we have no stream, always return true as we can't read any more.
return !m_stream || m_stream->Eof();
}
// read everything remaining until the EOF, this should only be called once
// the child process terminates and we know that no more data is coming
bool ReadAll()
{
while ( !Eof() )
{
if ( !Update() )
return false;
}
return true;
}
// dtor puts the data buffered during this object lifetime into the
// associated stream
~wxStreamTempInputBuffer()
{
if ( m_buffer )
{
m_stream->Ungetch(m_buffer, m_size);
free(m_buffer);
}
}
const void *GetBuffer() const { return m_buffer; }
size_t GetSize() const { return m_size; }
private:
// the stream we're buffering, if nullptr we don't do anything at all
wxPipeInputStream *m_stream = nullptr;
// the buffer of size m_size (nullptr if m_size == 0)
void *m_buffer = nullptr;
// the size of the buffer
size_t m_size = 0;
wxDECLARE_NO_COPY_CLASS(wxStreamTempInputBuffer);
};
#endif // _WX_PRIVATE_STREAMTEMPINPUT_H

View File

@@ -0,0 +1,47 @@
///////////////////////////////////////////////////////////////////////////////
// Name: wx/private/terminal.h
// Purpose: Helpers for working with terminal output
// Author: Vadim Zeitlin
// Created: 2024-11-22
// Copyright: (c) 2024 Vadim Zeitlin <vadim@wxwidgets.org>
// Licence: wxWindows licence
///////////////////////////////////////////////////////////////////////////////
#ifndef _WX_PRIVATE_TERMINAL_H_
#define _WX_PRIVATE_TERMINAL_H_
#ifdef __WINDOWS__
#include "wx/utils.h"
#include "wx/msw/wrapwin.h"
#endif
#ifdef __UNIX__
#include <stdio.h>
#include <unistd.h>
#include <sys/ioctl.h>
#endif
namespace wxTerminal
{
// Return the current terminal width or 0 if we couldn't find it.
inline int GetWidth()
{
#ifdef __WINDOWS__
CONSOLE_SCREEN_BUFFER_INFO csbi;
if ( ::GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &csbi) )
return csbi.srWindow.Right - csbi.srWindow.Left + 1;
#elif defined TIOCGWINSZ
winsize w;
int fd = fileno(stdout);
if ( fd != -1 && ioctl(fd, TIOCGWINSZ, &w) == 0 )
return w.ws_col;
#endif
return 0;
}
} // namespace wxTerminal
#endif // _WX_PRIVATE_TERMINAL_H_

View File

@@ -0,0 +1,176 @@
///////////////////////////////////////////////////////////////////////////////
// Name: wx/private/textmeasure.h
// Purpose: declaration of wxTextMeasure class
// Author: Manuel Martin
// Created: 2012-10-05
// Copyright: (c) 1997-2012 wxWidgets team
// Licence: wxWindows licence
///////////////////////////////////////////////////////////////////////////////
#ifndef _WX_PRIVATE_TEXTMEASURE_H_
#define _WX_PRIVATE_TEXTMEASURE_H_
class WXDLLIMPEXP_FWD_CORE wxDC;
class WXDLLIMPEXP_FWD_CORE wxFont;
class WXDLLIMPEXP_FWD_CORE wxWindow;
// ----------------------------------------------------------------------------
// wxTextMeasure: class used to measure text extent.
// ----------------------------------------------------------------------------
class wxTextMeasureBase
{
public:
// The first ctor argument must be non-null, i.e. each object of this class
// is associated with either a valid wxDC or a valid wxWindow. The font can
// be null to use the current DC/window font or can be specified explicitly.
wxTextMeasureBase(const wxDC *dc, const wxFont *theFont);
wxTextMeasureBase(const wxWindow *win, const wxFont *theFont);
// Even though this class is not supposed to be used polymorphically, give
// it a virtual dtor to avoid compiler warnings.
virtual ~wxTextMeasureBase() = default;
// Return the extent of a single line string.
void GetTextExtent(const wxString& string,
wxCoord *width,
wxCoord *height,
wxCoord *descent = nullptr,
wxCoord *externalLeading = nullptr);
// The same for a multiline (with '\n') string.
void GetMultiLineTextExtent(const wxString& text,
wxCoord *width,
wxCoord *height,
wxCoord *heightOneLine = nullptr);
// Find the dimensions of the largest string.
wxSize GetLargestStringExtent(size_t n, const wxString* strings);
wxSize GetLargestStringExtent(const wxArrayString& strings)
{
return GetLargestStringExtent(strings.size(), &strings[0]);
}
// Fill the array with the widths for each "0..N" substrings for N from 1
// to text.length().
//
// The scaleX argument is the horizontal scale used by wxDC and is only
// used in the generic implementation.
bool GetPartialTextExtents(const wxString& text,
wxArrayInt& widths,
double scaleX);
// This is another method which is only used by MeasuringGuard.
bool IsUsingDCImpl() const { return m_useDCImpl; }
protected:
// RAII wrapper for the two methods above.
class MeasuringGuard
{
public:
MeasuringGuard(wxTextMeasureBase& tm) : m_tm(tm)
{
// BeginMeasuring() should only be called if we have a native DC,
// so don't call it if we delegate to a DC of unknown type.
if ( !m_tm.IsUsingDCImpl() )
m_tm.BeginMeasuring();
}
~MeasuringGuard()
{
if ( !m_tm.IsUsingDCImpl() )
m_tm.EndMeasuring();
}
private:
wxTextMeasureBase& m_tm;
};
// These functions are called by our public methods before and after each
// call to DoGetTextExtent(). Derived classes may override them to prepare
// for -- possibly several -- subsequent calls to DoGetTextExtent().
//
// As these calls must be always paired, they're never called directly but
// only by our friend MeasuringGuard class.
virtual void BeginMeasuring() { }
virtual void EndMeasuring() { }
// The main function of this class, to be implemented in platform-specific
// way used by all our public methods.
//
// The width and height pointers here are never null and the input string
// is not empty.
virtual void DoGetTextExtent(const wxString& string,
wxCoord *width,
wxCoord *height,
wxCoord *descent = nullptr,
wxCoord *externalLeading = nullptr) = 0;
// The real implementation of GetPartialTextExtents().
//
// On input, widths array contains text.length() zero elements and the text
// is guaranteed to be non-empty.
virtual bool DoGetPartialTextExtents(const wxString& text,
wxArrayInt& widths,
double scaleX) = 0;
// Call either DoGetTextExtent() or wxDC::GetTextExtent() depending on the
// value of m_useDCImpl.
//
// This must be always used instead of calling DoGetTextExtent() directly!
void CallGetTextExtent(const wxString& string,
wxCoord *width,
wxCoord *height,
wxCoord *descent = nullptr,
wxCoord *externalLeading = nullptr);
// Get line height: used when the line is empty because CallGetTextExtent()
// would just return (0, 0) in this case.
int GetEmptyLineHeight();
// Return a valid font: if one was given to us in the ctor, use this one,
// otherwise use the current font of the associated wxDC or wxWindow.
wxFont GetFont() const;
// Exactly one of m_dc and m_win is non-null for any given object of this
// class.
const wxDC* const m_dc;
const wxWindow* const m_win;
// If this is true, simply forward to wxDC::GetTextExtent() from our
// CallGetTextExtent() instead of calling our own DoGetTextExtent().
//
// We need this because our DoGetTextExtent() typically only works with
// native DCs, i.e. those having an HDC under Windows or using Pango under
// GTK+. However wxTextMeasure object can be constructed for any wxDC, not
// necessarily a native one and in this case we must call back into the DC
// implementation of text measuring itself.
bool m_useDCImpl;
// This one can be null or not.
const wxFont* const m_font;
wxDECLARE_NO_COPY_CLASS(wxTextMeasureBase);
};
// Include the platform dependent class declaration, if any.
#if defined(__WXGTK__)
#include "wx/gtk/private/textmeasure.h"
#elif defined(__WXMSW__)
#include "wx/msw/private/textmeasure.h"
#else // no platform-specific implementation of wxTextMeasure yet
#include "wx/generic/private/textmeasure.h"
#define wxUSE_GENERIC_TEXTMEASURE 1
#endif
#ifndef wxUSE_GENERIC_TEXTMEASURE
#define wxUSE_GENERIC_TEXTMEASURE 0
#endif
#endif // _WX_PRIVATE_TEXTMEASURE_H_

View File

@@ -0,0 +1,72 @@
/////////////////////////////////////////////////////////////////////////////
// Name: wx/private/timer.h
// Purpose: Base class for wxTimer implementations
// Author: Lukasz Michalski <lmichalski@sf.net>
// Created: 31.10.2006
// Copyright: (c) 2006-2007 wxWidgets dev team
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
#ifndef _WX_TIMERIMPL_H_BASE_
#define _WX_TIMERIMPL_H_BASE_
#include "wx/defs.h"
#include "wx/event.h"
#include "wx/timer.h"
// ----------------------------------------------------------------------------
// wxTimerImpl: abstract base class for wxTimer implementations
// ----------------------------------------------------------------------------
class WXDLLIMPEXP_BASE wxTimerImpl
{
public:
// default ctor, SetOwner() must be called after it (wxTimer does it)
wxTimerImpl(wxTimer *owner);
// this must be called initially but may be also called later
void SetOwner(wxEvtHandler *owner, int timerid);
// empty but virtual base class dtor, the caller is responsible for
// stopping the timer before it's destroyed (it can't be done from here as
// it's too late)
virtual ~wxTimerImpl() = default;
// start the timer. When overriding call base version first.
virtual bool Start(int milliseconds = -1, bool oneShot = false);
// stop the timer, only called if the timer is really running (unlike
// wxTimer::Stop())
virtual void Stop() = 0;
// return true if the timer is running
virtual bool IsRunning() const = 0;
// this should be called by the port-specific code when the timer expires
virtual void Notify() { m_timer->Notify(); }
// the default implementation of wxTimer::Notify(): generate a wxEVT_TIMER
void SendEvent();
// accessors for wxTimer:
wxEvtHandler *GetOwner() const { return m_owner; }
int GetId() const { return m_idTimer; }
int GetInterval() const { return m_milli; }
bool IsOneShot() const { return m_oneShot; }
protected:
wxTimer *m_timer;
wxEvtHandler *m_owner;
int m_idTimer; // id passed to wxTimerEvent
int m_milli; // the timer interval
bool m_oneShot; // true if one shot
wxDECLARE_NO_COPY_CLASS(wxTimerImpl);
};
#endif // _WX_TIMERIMPL_H_BASE_

View File

@@ -0,0 +1,184 @@
///////////////////////////////////////////////////////////////////////////////
// Name: wx/private/tlwgeom.h
// Purpose: Declaration of platform-specific and private wxTLWGeometry.
// Author: Vadim Zeitlin
// Created: 2018-04-29
// Copyright: (c) 2018 Vadim Zeitlin <vadim@wxwidgets.org>
// Licence: wxWindows licence
///////////////////////////////////////////////////////////////////////////////
#ifndef _WX_PRIVATE_TLWGEOM_H_
#define _WX_PRIVATE_TLWGEOM_H_
#include "wx/display.h"
#include "wx/toplevel.h"
// ----------------------------------------------------------------------------
// wxTLWGeometryBase: abstract base class for platform-specific classes
// ----------------------------------------------------------------------------
// wxTLWGeometry contains full information about the window geometry, which may
// include things other than the obvious ones like its current position and
// size (e.g. under MSW it also stores the position of the maximized window,
// under GTK the size of non-client decorations etc). It is private to wx and
// is only used indirectly, via wxTopLevelWindow::SaveGeometry() and
// RestoreToGeometry() methods, in the public API.
class wxTLWGeometryBase
{
public:
typedef wxTopLevelWindow::GeometrySerializer Serializer;
wxTLWGeometryBase() = default;
virtual ~wxTLWGeometryBase() = default;
// Initialize from the given window.
virtual bool GetFrom(const wxTopLevelWindow* tlw) = 0;
// Resize the window to use this geometry.
virtual bool ApplyTo(wxTopLevelWindow* tlw) = 0;
// Serialize or deserialize the object by using the provided object for
// writing/reading the values of the different fields of this object.
virtual bool Save(const Serializer& ser) const = 0;
virtual bool Restore(Serializer& ser) = 0;
};
// ----------------------------------------------------------------------------
// wxTLWGeometryGeneric: simplest possible generic implementation
// ----------------------------------------------------------------------------
// names for various persistent options
#define wxPERSIST_TLW_X "x"
#define wxPERSIST_TLW_Y "y"
#define wxPERSIST_TLW_W "w"
#define wxPERSIST_TLW_H "h"
#define wxPERSIST_TLW_MAXIMIZED "Maximized"
#define wxPERSIST_TLW_ICONIZED "Iconized"
// MSW has its own native implementation and doesn't use this class.
#ifndef __WXMSW__
class wxTLWGeometryGeneric : public wxTLWGeometryBase
{
public:
wxTLWGeometryGeneric()
{
m_hasPos =
m_hasSize =
m_iconized =
m_maximized = false;
}
virtual bool Save(const Serializer& ser) const override
{
if ( !ser.SaveField(wxPERSIST_TLW_X, m_rectScreen.x) ||
!ser.SaveField(wxPERSIST_TLW_Y, m_rectScreen.y) )
return false;
if ( !ser.SaveField(wxPERSIST_TLW_W, m_rectScreen.width) ||
!ser.SaveField(wxPERSIST_TLW_H, m_rectScreen.height) )
return false;
if ( !ser.SaveField(wxPERSIST_TLW_MAXIMIZED, m_maximized) )
return false;
if ( !ser.SaveField(wxPERSIST_TLW_ICONIZED, m_iconized) )
return false;
return true;
}
virtual bool Restore(Serializer& ser) override
{
m_hasPos = ser.RestoreField(wxPERSIST_TLW_X, &m_rectScreen.x) &&
ser.RestoreField(wxPERSIST_TLW_Y, &m_rectScreen.y);
m_hasSize = ser.RestoreField(wxPERSIST_TLW_W, &m_rectScreen.width) &&
ser.RestoreField(wxPERSIST_TLW_H, &m_rectScreen.height);
int tmp;
if ( ser.RestoreField(wxPERSIST_TLW_MAXIMIZED, &tmp) )
m_maximized = tmp != 0;
if ( ser.RestoreField(wxPERSIST_TLW_ICONIZED, &tmp) )
m_iconized = tmp != 0;
// If we restored at least something, return true.
return m_hasPos || m_hasSize || m_maximized || m_iconized;
}
virtual bool GetFrom(const wxTopLevelWindow* tlw) override
{
m_rectScreen = tlw->GetScreenRect();
m_hasPos =
m_hasSize = true;
m_iconized = tlw->IsIconized();
m_maximized = tlw->IsMaximized();
return true;
}
virtual bool ApplyTo(wxTopLevelWindow* tlw) override
{
if ( m_hasPos )
{
// to avoid making the window completely invisible if it had been
// shown on a monitor which was disconnected since the last run
// (this is pretty common for notebook with external displays)
//
// NB: we should allow window position to be (slightly) off screen,
// it's not uncommon to position the window so that its upper
// left corner has slightly negative coordinate
if ( wxDisplay::GetFromPoint(m_rectScreen.GetTopLeft()) != wxNOT_FOUND ||
(m_hasSize &&
wxDisplay::GetFromPoint(m_rectScreen.GetBottomRight()) != wxNOT_FOUND) )
{
tlw->Move(m_rectScreen.GetTopLeft(), wxSIZE_ALLOW_MINUS_ONE);
}
//else: should we try to adjust position/size somehow?
}
if ( m_hasSize )
{
// a previous version of the program could have saved the window
// size which used to be big enough, but which is not big enough
// any more for the new version, so check that the size we restore
// doesn't cut off parts of the window
wxSize size = m_rectScreen.GetSize();
size.IncTo(tlw->GetBestSize());
tlw->SetSize(size);
}
// note that the window can be both maximized and iconized
if ( m_maximized )
tlw->Maximize();
if ( m_iconized )
tlw->Iconize();
return true;
}
private:
wxRect m_rectScreen;
bool m_hasPos;
bool m_hasSize;
bool m_iconized;
bool m_maximized;
};
#endif // !__WXMSW__
#ifdef __WXGTK__
#include "wx/gtk/private/tlwgeom.h"
#elif defined(__WXMSW__)
#include "wx/msw/private/tlwgeom.h"
#else
class wxTLWGeometry : public wxTLWGeometryGeneric
{
};
#endif
#endif // _WX_PRIVATE_TLWGEOM_H_

View File

@@ -0,0 +1,44 @@
///////////////////////////////////////////////////////////////////////////////
// Name: wx/private/uiaction.h
// Purpose: wxUIActionSimulatorImpl declaration
// Author: Vadim Zeitlin
// Created: 2016-05-21
// Copyright: (c) 2016 Vadim Zeitlin <vadim@wxwidgets.org>
// Licence: wxWindows licence
///////////////////////////////////////////////////////////////////////////////
#ifndef _WX_PRIVATE_UIACTION_H_
#define _WX_PRIVATE_UIACTION_H_
// ----------------------------------------------------------------------------
// Platform-specific implementation of wxUIActionSimulator
// ----------------------------------------------------------------------------
class wxUIActionSimulatorImpl
{
public:
wxUIActionSimulatorImpl() = default;
virtual ~wxUIActionSimulatorImpl() = default;
// Low level mouse methods which must be implemented in the derived class.
virtual bool MouseMove(long x, long y) = 0;
virtual bool MouseDown(int button = wxMOUSE_BTN_LEFT) = 0;
virtual bool MouseUp(int button = wxMOUSE_BTN_LEFT) = 0;
// Higher level mouse methods which have default implementation in the base
// class but can be overridden if necessary.
virtual bool MouseClick(int button = wxMOUSE_BTN_LEFT);
virtual bool MouseDblClick(int button = wxMOUSE_BTN_LEFT);
virtual bool MouseDragDrop(long x1, long y1, long x2, long y2,
int button = wxMOUSE_BTN_LEFT);
// The low-level port-specific function which really generates the key
// presses. It should generate exactly one key event with the given
// parameters.
virtual bool DoKey(int keycode, int modifiers, bool isDown) = 0;
private:
wxDECLARE_NO_COPY_CLASS(wxUIActionSimulatorImpl);
};
#endif // _WX_PRIVATE_UIACTION_H_

View File

@@ -0,0 +1,140 @@
///////////////////////////////////////////////////////////////////////////////
// Name: wx/private/uilocale.h
// Purpose: wxUILocaleImpl class declaration
// Author: Vadim Zeitlin
// Created: 2021-08-01
// Copyright: (c) 2021 Vadim Zeitlin <vadim@wxwidgets.org>
// Licence: wxWindows licence
///////////////////////////////////////////////////////////////////////////////
#ifndef _WX_PRIVATE_UILOCALE_H_
#define _WX_PRIVATE_UILOCALE_H_
#include "wx/localedefs.h"
#include "wx/object.h"
#include "wx/string.h"
#include "wx/vector.h"
typedef wxVector<wxLanguageInfo> wxLanguageInfos;
// Return the vector of all languages known to wx.
const wxLanguageInfos& wxGetLanguageInfos();
// Function returning hard-coded values for the "C" locale.
wxString wxGetStdCLocaleInfo(wxLocaleInfo index, wxLocaleCategory cat);
// ----------------------------------------------------------------------------
// wxUILocaleImpl provides the implementation of public wxUILocale functions
// ----------------------------------------------------------------------------
class wxUILocaleImpl : public wxRefCounter
{
public:
// This function is implemented in platform-specific code and returns the
// object used by default, i.e. if wxUILocale::UseDefault() is not called.
// This object corresponds to the traditional "C" locale.
//
// It should never return nullptr.
static wxUILocaleImpl* CreateStdC();
// Similarly, this one returns the object corresponding to the default user
// locale settings which is used if wxUILocale::UseDefault() was called.
//
// It may return nullptr in case of failure.
static wxUILocaleImpl* CreateUserDefault();
// Create locale object for the given locale.
//
// It may return nullptr in case of failure.
static wxUILocaleImpl* CreateForLocale(const wxLocaleIdent& locId);
// This function exists only for wxLocale compatibility and creates the
// locale corresponding to the given language. It shouldn't be used
// anywhere else.
//
// It is implemented in terms of CreateForLocale() for non-MSW platforms,
// but under MSW it is different for compatibility reasons.
//
// The language passed to this function is a valid language, i.e. neither
// wxLANGUAGE_UNKNOWN nor wxLANGUAGE_DEFAULT.
//
// It may return nullptr in case of failure, but never does so for English
// languages because wxLocale(wxLANGUAGE_ENGLISH) is always supposed to
// work, so it just falls back on CreateStdC() if it fails to create it.
static wxUILocaleImpl* CreateForLanguage(const wxLanguageInfo& info);
// This function retrieves a list of preferred UI languages.
// The list is in the order of preference, if it has more than one entry.
// The entries contain platform-dependent identifiers.
static wxVector<wxString> GetPreferredUILanguages();
#if wxUSE_DATETIME
// Helper function used by GetMonthName/GetWeekDayName(): returns 0 if flags is
// wxDateTime::Name_Full, 1 if it is wxDateTime::Name_Abbr, and 2 if it is
// wxDateTime::Name_Shortest or -1 if the flags is incorrect (and asserts in this case)
//
// the return value of this function is used as an index into 2D array
// containing full names in its first row and abbreviated ones in the 2nd one
static int ArrayIndexFromFlag(wxDateTime::NameFlags flags);
#endif // wxUSE_DATETIME
// Use this locale in the UI.
//
// This is not implemented for all platforms, notably not for Mac where the
// UI locale is determined at application startup, but we can't do anything
// about it anyhow, so we don't even bother returning an error code from it.
virtual void Use() = 0;
// Functions corresponding to wxUILocale ones.
virtual wxString GetName() const = 0;
virtual wxLocaleIdent GetLocaleId() const = 0;
virtual wxString GetInfo(wxLocaleInfo index, wxLocaleCategory cat) const = 0;
virtual wxString GetLocalizedName(wxLocaleName name, wxLocaleForm form) const = 0;
#if wxUSE_DATETIME
virtual wxString GetMonthName(wxDateTime::Month month, wxDateTime::NameForm form) const = 0;
virtual wxString GetWeekDayName(wxDateTime::WeekDay weekday, wxDateTime::NameForm form) const = 0;
#endif // wxUSE_DATETIME
virtual wxLayoutDirection GetLayoutDirection() const = 0;
virtual int CompareStrings(const wxString& lhs, const wxString& rhs,
int flags) const = 0;
virtual ~wxUILocaleImpl() = default;
// These two methods are for internal use only. First one creates the
// global language database if it doesn't already exist, second one destroys
// it.
static void CreateLanguagesDB();
static void DestroyLanguagesDB();
// Creates the global tables of languages and scripts called by CreateLanguagesDB
static void InitLanguagesDB();
// These two methods are for internal use only.
// wxLocaleIdent expects script identifiers as listed in ISO 15924.
// However, directory names for translation catalogs follow the
// Unix convention, using script aliases as listed in ISO 15924.
// First one converts a script name to its alias, second converts
// a script alias to its corresponding script name.
// Both methods return empty strings, if the script name or alias
// couldn't be found.
static wxString GetScriptAliasFromName(const wxString& scriptName);
static wxString GetScriptNameFromAlias(const wxString& scriptAlias);
// These three methods are for internal use only.
// The new algorithm for determine the best translation language
// uses them.
// First one expands a locale tag using most likely subtags for script
// and region. The method returns an empty string, if a matching tag
// couldn't be found.
// Second one determines the matching distance between locale tags.
// The method returns -1, if no match was found.
// Third one determines whether 2 regions belong to the same region
// group of the given language. The method returns false, if no
// region group is defined for the given language.
static wxString GetLikelySubtags(const wxString & fromTag);
static int GetMatchDistance(const wxString& desired, const wxString& supported);
static bool SameRegionGroup(const wxString& language, const wxString& desiredRegion, const wxString& supportedRegion);
};
#endif // _WX_PRIVATE_UILOCALE_H_

View File

@@ -0,0 +1,16 @@
/////////////////////////////////////////////////////////////////////////////
// Name: wx/private/unicode.h
// Purpose: Unicode private declsrations
// Author: Pavel Tyunin
// Created: 2020-10-06
// Copyright: (c) 2020 Pavel Tyunin
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
#ifndef _WX_PRIVATE_UNICODEH__
#define _WX_PRIVATE_UNICODEH__
// this table gives the length of the UTF-8 encoding from its first character:
extern const unsigned char tableUtf8Lengths[256];
#endif // _WX_PRIVATE_UNICODEH__

View File

@@ -0,0 +1,365 @@
///////////////////////////////////////////////////////////////////////////////
// Name: wx/private/webrequest.h
// Purpose: wxWebRequest implementation classes
// Author: Vadim Zeitlin
// Created: 2020-12-26
// Copyright: (c) 2020 Vadim Zeitlin <vadim@wxwidgets.org>
// Licence: wxWindows licence
///////////////////////////////////////////////////////////////////////////////
#ifndef _WX_PRIVATE_WEBREQUEST_H_
#define _WX_PRIVATE_WEBREQUEST_H_
#include "wx/ffile.h"
#include "wx/private/refcountermt.h"
#include <memory>
#include <unordered_map>
class WXDLLIMPEXP_FWD_BASE wxURI;
using wxWebRequestHeaderMap = std::unordered_map<wxString, wxString>;
// Trace mask used for the messages in wxWebRequest code.
#define wxTRACE_WEBREQUEST "webrequest"
// ----------------------------------------------------------------------------
// wxWebAuthChallengeImpl
// ----------------------------------------------------------------------------
class wxWebAuthChallengeImpl : public wxRefCounterMT
{
public:
virtual ~wxWebAuthChallengeImpl() = default;
wxWebAuthChallenge::Source GetSource() const { return m_source; }
virtual void SetCredentials(const wxWebCredentials& cred) = 0;
protected:
explicit wxWebAuthChallengeImpl(wxWebAuthChallenge::Source source)
: m_source(source) { }
private:
const wxWebAuthChallenge::Source m_source;
wxDECLARE_NO_COPY_CLASS(wxWebAuthChallengeImpl);
};
// ----------------------------------------------------------------------------
// wxWebRequestImpl
// ----------------------------------------------------------------------------
class wxWebRequestImpl : public wxRefCounterMT
{
public:
using Result = wxWebRequest::Result;
// Return true if this is an async request, false if it's synchronous.
bool IsAsync() const { return m_session != nullptr; }
virtual ~wxWebRequestImpl() = default;
void SetHeader(const wxString& name, const wxString& value)
{ m_headers[name] = value; }
void SetMethod(const wxString& method) { m_method = method; }
void SetData(const wxString& text, const wxString& contentType, const wxMBConv& conv = wxConvUTF8);
bool SetData(std::unique_ptr<wxInputStream> dataStream, const wxString& contentType, wxFileOffset dataSize = wxInvalidOffset);
void SetStorage(wxWebRequest::Storage storage) { m_storage = storage; }
wxWebRequest::Storage GetStorage() const { return m_storage; }
// This method is called to execute the request in a synchronous way.
virtual Result Execute() = 0;
// This method is called to start execution of an asynchronous request.
//
// Precondition for this method checked by caller: current state is idle.
virtual void Start() = 0;
// This method can be called to cancel execution of an asynchronous request.
//
// Precondition for this method checked by caller: not idle and not already
// cancelled.
void Cancel();
virtual wxWebResponseImplPtr GetResponse() const = 0;
virtual wxWebAuthChallengeImplPtr GetAuthChallenge() const = 0;
int GetId() const { return m_id; }
// This one is only valid for async requests.
wxWebSession& GetSession() const { return *m_session; }
// This one can be always called.
wxWebSessionImpl& GetSessionImpl() const { return *m_sessionImpl; }
wxWebRequest::State GetState() const { return m_state; }
virtual wxFileOffset GetBytesSent() const = 0;
virtual wxFileOffset GetBytesExpectedToSend() const = 0;
virtual wxFileOffset GetBytesReceived() const;
virtual wxFileOffset GetBytesExpectedToReceive() const;
virtual wxWebRequestHandle GetNativeHandle() const = 0;
void MakeInsecure(int flags) { m_securityFlags = flags; }
int GetSecurityFlags() const { return m_securityFlags; }
void SetState(wxWebRequest::State state, const wxString& failMsg = wxString());
void ReportDataReceived(size_t sizeReceived);
wxEvtHandler* GetHandler() const { return m_handler; }
protected:
wxString m_method;
wxWebRequest::Storage m_storage = wxWebRequest::Storage_Memory;
wxWebRequestHeaderMap m_headers;
wxFileOffset m_dataSize = 0;
std::unique_ptr<wxInputStream> m_dataStream;
int m_securityFlags = 0;
// Ctor for async requests.
wxWebRequestImpl(wxWebSession& session,
wxWebSessionImpl& sessionImpl,
wxEvtHandler* handler,
int id);
// Ctor for sync requests.
explicit wxWebRequestImpl(wxWebSessionImpl& sessionImpl);
bool WasCancelled() const { return m_cancelled; }
// Get the HTTP method to use: this will be m_method if it's non-empty,
// POST is we have any data to send, and GET otherwise.
//
// Returned string is always in upper case.
wxString GetHTTPMethod() const;
// Get wxWebRequest::State and, optionally, error message corresponding to
// the given response (response must be valid here).
static Result GetResultFromHTTPStatus(const wxWebResponseImplPtr& response);
// Call SetState() with either State_Failed or State_Completed appropriate
// for the response status.
void SetFinalStateFromStatus()
{
HandleResult(GetResultFromHTTPStatus(GetResponse()));
}
// Unconditionally call SetState() with the parameters corresponding to the
// given result.
void HandleResult(const Result& result)
{
SetState(result.state, result.error);
}
// Call SetState() if the result is an error (State_Failed) and return
// false in this case, otherwise just return true.
bool CheckResult(const Result& result)
{
if ( !result )
{
HandleResult(result);
return false;
}
return true;
}
private:
// Called from public Cancel() at most once per object.
virtual void DoCancel() = 0;
// Called to notify about the state change in the main thread by SetState()
// (which can itself be called from a different one).
//
// It also releases a reference added when switching to the active state by
// SetState() when leaving it.
void ProcessStateEvent(wxWebRequest::State state, const wxString& failMsg);
// This is a shared pointer and not just a reference to ensure that the
// session stays alive as long as there are any requests using it, as
// allowing it to die first would result in a crash when destroying the
// request later.
wxWebSessionImplPtr m_sessionImpl;
// These parameters are only valid for async requests.
wxWebSession* const m_session;
wxEvtHandler* const m_handler;
const int m_id;
wxWebRequest::State m_state = wxWebRequest::State_Idle;
wxFileOffset m_bytesReceived = 0;
wxCharBuffer m_dataText;
// Initially false, set to true after the first call to Cancel().
bool m_cancelled = false;
wxDECLARE_NO_COPY_CLASS(wxWebRequestImpl);
};
// ----------------------------------------------------------------------------
// wxWebResponseImpl
// ----------------------------------------------------------------------------
class wxWebResponseImpl : public wxRefCounterMT
{
public:
virtual ~wxWebResponseImpl();
virtual wxFileOffset GetContentLength() const = 0;
virtual wxString GetURL() const = 0;
virtual wxString GetHeader(const wxString& name) const = 0;
virtual std::vector<wxString> GetAllHeaderValues(const wxString& name) const = 0;
virtual wxString GetMimeType() const;
virtual wxString GetContentType() const;
virtual int GetStatus() const = 0;
virtual wxString GetStatusText() const = 0;
virtual wxInputStream* GetStream() const;
virtual wxString GetSuggestedFileName() const;
wxString AsString() const;
virtual wxString GetDataFile() const;
// Open data file if necessary, i.e. if using wxWebRequest::Storage_File.
//
// Returns result with State_Failed if the file is needed but couldn't be
// opened.
wxNODISCARD wxWebRequest::Result InitFileStorage();
void ReportDataReceived(size_t sizeReceived);
protected:
wxWebRequestImpl& m_request;
explicit wxWebResponseImpl(wxWebRequestImpl& request);
void* GetDataBuffer(size_t sizeNeeded);
// This function can optionally be called to preallocate the read buffer,
// if the total amount of data to be downloaded is known in advance.
void PreAllocBuffer(size_t sizeNeeded);
private:
// Called by wxWebRequestImpl only.
friend class wxWebRequestImpl;
void Finalize();
wxMemoryBuffer m_readBuffer;
mutable wxFFile m_file;
mutable std::unique_ptr<wxInputStream> m_stream;
wxDECLARE_NO_COPY_CLASS(wxWebResponseImpl);
};
// ----------------------------------------------------------------------------
// wxWebSessionFactory
// ----------------------------------------------------------------------------
class wxWebSessionFactory
{
public:
virtual wxWebSessionImpl* Create() = 0;
virtual wxWebSessionImpl* CreateSync() = 0;
virtual bool Initialize() { return true; }
virtual ~wxWebSessionFactory() = default;
};
// ----------------------------------------------------------------------------
// wxWebSessionImpl
// ----------------------------------------------------------------------------
class wxWebSessionImpl : public wxRefCounterMT
{
public:
// This session class can be used either synchronously or asynchronously,
// but the mode must be chosen at the time of the object creation and
// cannot be changed later.
enum class Mode
{
Async,
Sync
};
virtual ~wxWebSessionImpl();
// Only one of these functions is actually implemented in async/sync
// session implementation classes respectively. This is ugly, but allows to
// add support for sync requests/sessions without completely rewriting
// wxWebRequest code.
virtual wxWebRequestImplPtr
CreateRequest(wxWebSession& session,
wxEvtHandler* handler,
const wxString& url,
int id) = 0;
virtual wxWebRequestImplPtr
CreateRequestSync(wxWebSessionSync& session, const wxString& url) = 0;
virtual wxVersionInfo GetLibraryVersionInfo() const = 0;
bool SetBaseURL(const wxString& url);
const wxURI* GetBaseURL() const;
void AddCommonHeader(const wxString& name, const wxString& value)
{ m_headers[name] = value; }
void SetTempDir(const wxString& dir) { m_tempDir = dir; }
wxString GetTempDir() const;
virtual bool SetProxy(const wxWebProxy& proxy)
{ m_proxy = proxy; return true; }
const wxWebProxy& GetProxy() const { return m_proxy; }
const wxWebRequestHeaderMap& GetHeaders() const { return m_headers; }
virtual wxWebSessionHandle GetNativeHandle() const = 0;
virtual bool EnablePersistentStorage(bool WXUNUSED(enable)) { return false; }
protected:
explicit wxWebSessionImpl(Mode mode);
bool IsAsync() const { return m_mode == Mode::Async; }
private:
// Make it a friend to allow accessing our m_headers.
friend class wxWebRequest;
const Mode m_mode;
std::unique_ptr<wxURI> m_baseURL;
wxWebRequestHeaderMap m_headers;
wxString m_tempDir;
wxWebProxy m_proxy{wxWebProxy::Default()};
wxDECLARE_NO_COPY_CLASS(wxWebSessionImpl);
};
#endif // _WX_PRIVATE_WEBREQUEST_H_

View File

@@ -0,0 +1,291 @@
///////////////////////////////////////////////////////////////////////////////
// Name: wx/webrequest_curl.h
// Purpose: wxWebRequest implementation using libcurl
// Author: Tobias Taschner
// Created: 2018-10-25
// Copyright: (c) 2018 wxWidgets development team
// Licence: wxWindows licence
///////////////////////////////////////////////////////////////////////////////
#ifndef _WX_WEBREQUEST_CURL_H
#define _WX_WEBREQUEST_CURL_H
#if wxUSE_WEBREQUEST_CURL
#include "wx/private/webrequest.h"
#include "wx/thread.h"
#include "wx/vector.h"
#include "wx/timer.h"
#include "curl/curl.h"
#include <unordered_map>
#include <vector>
class wxWebRequestCURL;
class wxWebResponseCURL;
class wxWebSessionCURL;
class wxWebSessionSyncCURL;
class SocketPoller;
class wxWebAuthChallengeCURL : public wxWebAuthChallengeImpl
{
public:
wxWebAuthChallengeCURL(wxWebAuthChallenge::Source source,
wxWebRequestCURL& request);
void SetCredentials(const wxWebCredentials& cred) override;
private:
wxWebRequestCURL& m_request;
wxDECLARE_NO_COPY_CLASS(wxWebAuthChallengeCURL);
};
class wxWebRequestCURL : public wxWebRequestImpl
{
public:
// Ctor for async requests: creates a new libcurl handle and owns it.
wxWebRequestCURL(wxWebSession& session,
wxWebSessionCURL& sessionImpl,
wxEvtHandler* handler,
const wxString& url,
int id);
// Ctor for sync requests: uses the libcurl handle from the session and
// doesn't own it.
wxWebRequestCURL(wxWebSessionSyncCURL& sessionImpl,
const wxString& url);
~wxWebRequestCURL();
wxWebRequest::Result Execute() override;
void Start() override;
wxWebResponseImplPtr GetResponse() const override
{ return m_response; }
wxWebAuthChallengeImplPtr GetAuthChallenge() const override
{ return m_authChallenge; }
wxFileOffset GetBytesSent() const override;
wxFileOffset GetBytesExpectedToSend() const override;
CURL* GetHandle() const { return m_handle; }
wxWebRequestHandle GetNativeHandle() const override
{
return (wxWebRequestHandle)GetHandle();
}
bool StartRequest();
void HandleCompletion();
wxString GetError() const;
// Method called from libcurl callback
size_t CURLOnRead(char* buffer, size_t size);
private:
// Common initialization for sync and async requests performed when the
// request is created.
void DoStartPrepare(const wxString& url);
// This function is again common for sync and async requests, but is called
// right before starting, or executing, the request.
//
// If it returns result with State_Failed, the request should be aborted.
wxWebRequest::Result DoFinishPrepare();
// Convert the status of the completed request to our result structure and,
// if necessary, initialize m_authChallenge.
wxWebRequest::Result DoHandleCompletion();
void DoCancel() override;
// This is only used for async requests.
wxWebSessionCURL* const m_sessionCURL;
// This pointer is only owned by this object when using async requests.
CURL* const m_handle;
char m_errorBuffer[CURL_ERROR_SIZE];
struct curl_slist *m_headerList = nullptr;
wxObjectDataPtr<wxWebResponseCURL> m_response;
wxObjectDataPtr<wxWebAuthChallengeCURL> m_authChallenge;
wxFileOffset m_bytesSent;
wxDECLARE_NO_COPY_CLASS(wxWebRequestCURL);
};
class wxWebResponseCURL : public wxWebResponseImpl
{
public:
explicit wxWebResponseCURL(wxWebRequestCURL& request);
wxFileOffset GetContentLength() const override;
wxString GetURL() const override;
wxString GetHeader(const wxString& name) const override;
std::vector<wxString> GetAllHeaderValues(const wxString& name) const override;
int GetStatus() const override;
wxString GetStatusText() const override { return m_statusText; }
// Methods called from libcurl callbacks
size_t CURLOnWrite(void *buffer, size_t size);
size_t CURLOnHeader(const char* buffer, size_t size);
int CURLOnProgress(curl_off_t);
private:
// We can receive multiple headers with the same name (classic example is
// "Set-Cookie:"), so we can't use wxWebRequestHeaderMap here and need to
// define our own "multi-map" for headers: it maps the header name to a
// collection of all its values, possibly from multiple header lines.
using AllHeadersMap = std::unordered_map<wxString, std::vector<wxString>>;
AllHeadersMap m_headers;
wxString m_statusText;
wxFileOffset m_knownDownloadSize;
CURL* GetHandle() const
{ return static_cast<wxWebRequestCURL&>(m_request).GetHandle(); }
wxDECLARE_NO_COPY_CLASS(wxWebResponseCURL);
};
// Common base class for synchronous and asynchronous sessions.
class wxWebSessionBaseCURL : public wxWebSessionImpl
{
public:
explicit wxWebSessionBaseCURL(Mode mode);
~wxWebSessionBaseCURL();
wxVersionInfo GetLibraryVersionInfo() const override;
static bool CurlRuntimeAtLeastVersion(unsigned int, unsigned int,
unsigned int);
protected:
static int ms_activeSessions;
static unsigned int ms_runtimeVersion;
};
// Sync session implementation uses libcurl "easy" API.
class wxWebSessionSyncCURL : public wxWebSessionBaseCURL
{
public:
wxWebSessionSyncCURL();
~wxWebSessionSyncCURL();
wxWebRequestImplPtr
CreateRequest(wxWebSession& WXUNUSED(session),
wxEvtHandler* WXUNUSED(handler),
const wxString& WXUNUSED(url),
int WXUNUSED(id)) override
{
wxFAIL_MSG("This method should not be called for synchronous sessions");
return wxWebRequestImplPtr{};
}
wxWebRequestImplPtr
CreateRequestSync(wxWebSessionSync& session, const wxString& url) override;
wxWebSessionHandle GetNativeHandle() const override
{
return (wxWebSessionHandle)m_handle;
}
CURL* GetHandle() const { return m_handle; }
private:
CURL* m_handle = nullptr;
wxDECLARE_NO_COPY_CLASS(wxWebSessionSyncCURL);
};
// Async session implementation uses libcurl "multi" API.
class wxWebSessionCURL : public wxEvtHandler, public wxWebSessionBaseCURL
{
public:
wxWebSessionCURL();
~wxWebSessionCURL();
wxWebRequestImplPtr
CreateRequest(wxWebSession& session,
wxEvtHandler* handler,
const wxString& url,
int id = wxID_ANY) override;
wxWebRequestImplPtr
CreateRequestSync(wxWebSessionSync& WXUNUSED(session),
const wxString& WXUNUSED(url)) override
{
wxFAIL_MSG("This method should not be called for asynchronous sessions");
return wxWebRequestImplPtr{};
}
wxWebSessionHandle GetNativeHandle() const override
{
return (wxWebSessionHandle)m_handle;
}
bool StartRequest(wxWebRequestCURL& request);
void CancelRequest(wxWebRequestCURL* request);
void RequestHasTerminated(wxWebRequestCURL* request);
private:
static int TimerCallback(CURLM*, long, void*);
static int SocketCallback(CURL*, curl_socket_t, int, void*, void*);
void ProcessTimerCallback(long);
void TimeoutNotification(wxTimerEvent&);
void ProcessTimeoutNotification();
void ProcessSocketCallback(CURL*, curl_socket_t, int);
void ProcessSocketPollerResult(wxThreadEvent&);
void CheckForCompletedTransfers();
void FailRequest(CURL*, const wxString&);
void StopActiveTransfer(CURL*);
void RemoveActiveSocket(CURL*);
using TransferSet = std::unordered_map<CURL*, wxWebRequestCURL*>;
using CurlSocketMap = std::unordered_map<CURL*, curl_socket_t>;
TransferSet m_activeTransfers;
CurlSocketMap m_activeSockets;
SocketPoller* m_socketPoller = nullptr;
wxTimer m_timeoutTimer;
CURLM* m_handle = nullptr;
wxDECLARE_NO_COPY_CLASS(wxWebSessionCURL);
};
class wxWebSessionFactoryCURL : public wxWebSessionFactory
{
public:
wxWebSessionImpl* Create() override
{
return new wxWebSessionCURL();
}
wxWebSessionImpl* CreateSync() override
{
return new wxWebSessionSyncCURL();
}
};
#endif // wxUSE_WEBREQUEST_CURL
#endif

View File

@@ -0,0 +1,23 @@
///////////////////////////////////////////////////////////////////////////////
// Name: wx/private/webview.h
// Purpose: wxWebView implementation classes
// Author: Tobias Taschner
// Created: 2023-03-16
// Copyright: (c) 2023 wxWidgets development team
// Licence: wxWindows licence
///////////////////////////////////////////////////////////////////////////////
#ifndef _WX_PRIVATE_WEBVIEW_H_
#define _WX_PRIVATE_WEBVIEW_H_
class WXDLLIMPEXP_WEBVIEW wxWebViewConfigurationImpl
{
public:
virtual ~wxWebViewConfigurationImpl() = default;
virtual void* GetNativeConfiguration() const { return nullptr; }
virtual void SetDataPath(const wxString& WXUNUSED(path)) {}
virtual wxString GetDataPath() const { return wxString{}; }
virtual bool EnablePersistentStorage(bool WXUNUSED(enable)) { return false; }
};
#endif // _WX_PRIVATE_WEBVIEW_H_

View File

@@ -0,0 +1,100 @@
/////////////////////////////////////////////////////////////////////////////
// Name: wx/private/window.h
// Purpose: misc wxWindow helpers
// Author: Vaclav Slavik
// Created: 2010-01-21
// Copyright: (c) 2010 Vaclav Slavik
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
#ifndef _WX_PRIVATE_WINDOW_H_
#define _WX_PRIVATE_WINDOW_H_
#include "wx/gdicmn.h"
#include "wx/dynlib.h"
namespace wxPrivate
{
// Windows' computes dialog units using average character width over upper-
// and lower-case ASCII alphabet and not using the average character width
// metadata stored in the font; see
// http://support.microsoft.com/default.aspx/kb/145994 for detailed discussion.
//
// This helper function computes font dimensions in the same way. It works with
// either wxDC or wxWindow argument.
template<typename T>
inline wxSize GetAverageASCIILetterSize(const T& of_what)
{
const wxStringCharType *TEXT_TO_MEASURE =
wxS("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz");
wxSize s = of_what.GetTextExtent(TEXT_TO_MEASURE);
s.x = (s.x / 26 + 1) / 2;
return s;
}
namespace
{
inline bool SupportsPerMonitorDPI()
{
static bool s_checkDPI =
#if defined(__WXMSW__)
// Only check the DPI when GetDpiForWindow is available because the old
// method (GetDeviceCaps) is a lot slower (about 1500 times).
// And when GetDpiForWindow is not available (for example older Windows
// versions), per-monitor DPI (V2) is also not available.
wxLoadedDLL("user32.dll").HasSymbol("GetDpiForWindow");
#else
false;
#endif
return s_checkDPI;
}
}
template <typename T>
class DpiDependentValue
{
public:
// Explicit initialization is needed if T is a primitive type.
DpiDependentValue()
: m_value(), m_dpi()
{ }
bool HasChanged(const wxWindowBase* win)
{
if ( win && SupportsPerMonitorDPI() )
{
const wxSize dpi = win->GetDPI();
if ( dpi != m_dpi )
{
m_dpi = dpi;
return true;
}
}
// Ensure that we return true the first time we're called,
// assuming that the value will always be set to a non-default value.
return m_value == T();
}
void SetAtNewDPI(const T& value)
{
m_value = value;
}
T& Get()
{
return m_value;
}
private:
T m_value;
wxSize m_dpi;
};
} // namespace wxPrivate
#endif // _WX_PRIVATE_WINDOW_H_

View File

@@ -0,0 +1,78 @@
///////////////////////////////////////////////////////////////////////////////
// Name: wx/private/wordwrap.h
// Purpose: Simple helper for string word wrapping.
// Author: Vadim Zeitlin
// Created: 2024-11-22
// Copyright: (c) 2024 Vadim Zeitlin <vadim@wxwidgets.org>
// Licence: wxWindows licence
///////////////////////////////////////////////////////////////////////////////
#ifndef _WX_PRIVATE_WORDWRAP_H_
#define _WX_PRIVATE_WORDWRAP_H_
#include "wx/string.h"
#include <vector>
// ----------------------------------------------------------------------------
// wxWordWrap helper for wxCmdLineParser
// ----------------------------------------------------------------------------
inline std::vector<wxString> wxWordWrap(const wxString& text, int widthMax)
{
std::vector<wxString> lines;
wxString line;
int lastSpace = -1; // No space in the current line yet.
for ( auto ch : text )
{
// Always honour explicit line breaks.
if ( ch == '\n' )
{
lines.push_back(line);
line.clear();
lastSpace = -1;
}
else
{
const int lineLength = line.length();
if ( lineLength == widthMax )
{
// Can't continue this line.
if ( lastSpace == -1 )
{
// No space in the line, just break it.
lines.push_back(line);
line.clear();
}
else
{
// Break at the last space.
lines.push_back(line.substr(0, lastSpace));
// Also skip all the spaces following it, we don't want to
// start the new line with spaces.
while ( lastSpace < lineLength && line[lastSpace] == ' ' )
lastSpace++;
line = line.substr(lastSpace);
lastSpace = -1;
}
}
else
{
if ( ch == ' ' )
lastSpace = line.length();
}
line += ch;
}
}
if ( !line.empty() )
lines.push_back(line);
return lines;
}
#endif // _WX_PRIVATE_WORDWRAP_H_

View File

@@ -0,0 +1,928 @@
/////////////////////////////////////////////////////////////////////////////
// Name: wx/private/wxprintf.h
// Purpose: wxWidgets wxPrintf() implementation
// Author: Ove Kaven
// Modified by: Ron Lee, Francesco Montorsi
// Created: 09/04/99
// Copyright: (c) wxWidgets copyright
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
#ifndef _WX_PRIVATE_WXPRINTF_H_
#define _WX_PRIVATE_WXPRINTF_H_
// ---------------------------------------------------------------------------
// headers and macros
// ---------------------------------------------------------------------------
#include "wx/crt.h"
#include "wx/log.h"
#include "wx/utils.h"
#include <limits.h>
#include <string.h>
// prefer snprintf over sprintf
#if defined(__VISUALC__)
#define system_sprintf(buff, max, flags, data) \
::_snprintf(buff, max, flags, data)
#elif defined(HAVE_SNPRINTF)
#define system_sprintf(buff, max, flags, data) \
::snprintf(buff, max, flags, data)
#else // NB: at least sprintf() should always be available
// since 'max' is not used in this case, wxVsnprintf() should always
// ensure that 'buff' is big enough for all common needs
// (see wxMAX_SVNPRINTF_FLAGBUFFER_LEN and wxMAX_SVNPRINTF_SCRATCHBUFFER_LEN)
#define system_sprintf(buff, max, flags, data) \
::sprintf(buff, flags, data)
#define SYSTEM_SPRINTF_IS_UNSAFE
#endif
// ---------------------------------------------------------------------------
// printf format string parsing
// ---------------------------------------------------------------------------
// some limits of our implementation
#define wxMAX_SVNPRINTF_ARGUMENTS 64
#define wxMAX_SVNPRINTF_FLAGBUFFER_LEN 32
#define wxMAX_SVNPRINTF_SCRATCHBUFFER_LEN 512
// the conversion specifiers accepted by wxCRT_VsnprintfW
enum wxPrintfArgType
{
wxPAT_INVALID = -1,
wxPAT_INT, // %d, %i, %o, %u, %x, %X
wxPAT_LONGINT, // %ld, etc
wxPAT_LONGLONGINT, // %Ld, etc
wxPAT_SIZET, // %zd, etc
wxPAT_DOUBLE, // %e, %E, %f, %g, %G
wxPAT_LONGDOUBLE, // %le, etc
wxPAT_POINTER, // %p
wxPAT_CHAR, // %hc (in ANSI mode: %c, too)
wxPAT_WCHAR, // %lc (in Unicode mode: %c, too)
wxPAT_PCHAR, // %s (related to a char *)
wxPAT_PWCHAR, // %s (related to a wchar_t *)
wxPAT_NINT, // %n
wxPAT_NSHORTINT, // %hn
wxPAT_NLONGINT, // %ln
wxPAT_STAR // '*' used for width or precision
};
// an argument passed to wxCRT_VsnprintfW
union wxPrintfArg
{
int pad_int; // %d, %i, %o, %u, %x, %X
long int pad_longint; // %ld, etc
wxLongLong_t pad_longlongint; // %Ld, etc
size_t pad_sizet; // %zd, etc
double pad_double; // %e, %E, %f, %g, %G
long double pad_longdouble; // %le, etc
void *pad_pointer; // %p
char pad_char; // %hc (in ANSI mode: %c, too)
wchar_t pad_wchar; // %lc (in Unicode mode: %c, too)
void *pad_str; // %s
int *pad_nint; // %n
short int *pad_nshortint; // %hn
long int *pad_nlongint; // %ln
};
// helper for converting string into either char* or wchar_t* depending
// on the type of wxPrintfConvSpec<T> instantiation:
template<typename CharType> struct wxPrintfStringHelper {};
template<> struct wxPrintfStringHelper<char>
{
typedef const wxWX2MBbuf ConvertedType;
static ConvertedType Convert(const wxString& s) { return s.mb_str(); }
};
template<> struct wxPrintfStringHelper<wchar_t>
{
typedef const wxWX2WCbuf ConvertedType;
static ConvertedType Convert(const wxString& s) { return s.wc_str(); }
};
// Contains parsed data relative to a conversion specifier given to
// wxCRT_VsnprintfW and parsed from the format string
// NOTE: in C++ there is almost no difference between struct & classes thus
// there is no performance gain by using a struct here...
template<typename CharType>
class wxPrintfConvSpec
{
public:
// the position of the argument relative to this conversion specifier
size_t m_pos;
// the type of this conversion specifier
wxPrintfArgType m_type;
// the minimum and maximum width
// when one of this var is set to -1 it means: use the following argument
// in the stack as minimum/maximum width for this conversion specifier
int m_nMinWidth, m_nMaxWidth;
// does the argument need to the be aligned to left ?
bool m_bAlignLeft;
// pointer to the '%' of this conversion specifier in the format string
// NOTE: this points somewhere in the string given to the Parse() function -
// it's task of the caller ensure that memory is still valid !
const CharType *m_pArgPos;
// pointer to the last character of this conversion specifier in the
// format string
// NOTE: this points somewhere in the string given to the Parse() function -
// it's task of the caller ensure that memory is still valid !
const CharType *m_pArgEnd;
// a little buffer where formatting flags like #+\.hlqLz are stored by Parse()
// for use in Process()
char m_szFlags[wxMAX_SVNPRINTF_FLAGBUFFER_LEN];
public:
// we don't declare this as a constructor otherwise it would be called
// automatically and we don't want this: to be optimized, wxCRT_VsnprintfW
// calls this function only on really-used instances of this class.
void Init();
// Parses the first conversion specifier in the given string, which must
// begin with a '%'. Returns false if the first '%' does not introduce a
// (valid) conversion specifier and thus should be ignored.
bool Parse(const CharType *format);
// Process this conversion specifier and puts the result in the given
// buffer. Returns the number of characters written in 'buf' or -1 if
// there's not enough space.
int Process(CharType *buf, size_t lenMax, wxPrintfArg *p, size_t written);
// Loads the argument of this conversion specifier from given va_list.
bool LoadArg(wxPrintfArg *p, va_list &argptr);
private:
// A helper function of LoadArg() which is used to handle the '*' flag
void ReplaceAsteriskWith(int w);
};
template<typename CharType>
void wxPrintfConvSpec<CharType>::Init()
{
m_nMinWidth = 0;
m_nMaxWidth = INT_MAX;
m_pos = 0;
m_bAlignLeft = false;
m_pArgPos = m_pArgEnd = nullptr;
m_type = wxPAT_INVALID;
memset(m_szFlags, 0, sizeof(m_szFlags));
// this character will never be removed from m_szFlags array and
// is important when calling sprintf() in wxPrintfConvSpec::Process() !
m_szFlags[0] = '%';
}
template<typename CharType>
bool wxPrintfConvSpec<CharType>::Parse(const CharType *format)
{
bool done = false;
// temporary parse data
size_t flagofs = 1;
bool in_prec, // true if we found the dot in some previous iteration
prec_dot; // true if the dot has been already added to m_szFlags
int ilen = 0;
m_bAlignLeft = in_prec = prec_dot = false;
m_pArgPos = m_pArgEnd = format;
do
{
#define CHECK_PREC \
if (in_prec && !prec_dot) \
{ \
m_szFlags[flagofs++] = '.'; \
prec_dot = true; \
}
// what follows '%'?
const CharType ch = *(++m_pArgEnd);
switch ( ch )
{
case wxT('\0'):
return false; // not really an argument
case wxT('%'):
return false; // not really an argument
case wxT('#'):
case wxT('0'):
case wxT(' '):
case wxT('+'):
case wxT('\''):
CHECK_PREC
m_szFlags[flagofs++] = char(ch);
break;
case wxT('-'):
CHECK_PREC
m_bAlignLeft = true;
m_szFlags[flagofs++] = char(ch);
break;
case wxT('.'):
// don't use CHECK_PREC here to avoid warning about the value
// assigned to prec_dot inside it being never used (because
// overwritten just below)
if (in_prec && !prec_dot)
m_szFlags[flagofs++] = '.';
in_prec = true;
prec_dot = false;
m_nMaxWidth = 0;
// dot will be auto-added to m_szFlags if non-negative
// number follows
break;
case wxT('h'):
ilen = -1;
CHECK_PREC
m_szFlags[flagofs++] = char(ch);
break;
case wxT('l'):
// NB: it's safe to use flagofs-1 as flagofs always start from 1
if (m_szFlags[flagofs-1] == 'l') // 'll' modifier is the same as 'L' or 'q'
ilen = 2;
else
ilen = 1;
CHECK_PREC
m_szFlags[flagofs++] = char(ch);
break;
case wxT('q'):
case wxT('L'):
ilen = 2;
CHECK_PREC
m_szFlags[flagofs++] = char(ch);
break;
#ifdef __WINDOWS__
// under Windows we support the special '%I64' notation as longlong
// integer conversion specifier for MSVC compatibility
// (it behaves exactly as '%lli' or '%Li' or '%qi')
case wxT('I'):
if (*(m_pArgEnd+1) == wxT('6') &&
*(m_pArgEnd+2) == wxT('4'))
{
m_pArgEnd++;
m_pArgEnd++;
ilen = 2;
CHECK_PREC
m_szFlags[flagofs++] = char(ch);
m_szFlags[flagofs++] = '6';
m_szFlags[flagofs++] = '4';
break;
}
// else: fall-through, 'I' is MSVC equivalent of C99 'z'
wxFALLTHROUGH;
#endif // __WINDOWS__
case wxT('z'):
case wxT('Z'):
// 'z' is C99 standard for size_t and ptrdiff_t, 'Z' was used
// for this purpose in libc5 and by wx <= 2.8
ilen = 3;
CHECK_PREC
m_szFlags[flagofs++] = char(ch);
break;
case wxT('*'):
if (in_prec)
{
CHECK_PREC
// tell Process() to use the next argument
// in the stack as maxwidth...
m_nMaxWidth = -1;
}
else
{
// tell Process() to use the next argument
// in the stack as minwidth...
m_nMinWidth = -1;
}
// save the * in our formatting buffer...
// will be replaced later by Process()
m_szFlags[flagofs++] = char(ch);
break;
case wxT('1'): case wxT('2'): case wxT('3'):
case wxT('4'): case wxT('5'): case wxT('6'):
case wxT('7'): case wxT('8'): case wxT('9'):
{
int len = 0;
CHECK_PREC
while ( (*m_pArgEnd >= CharType('0')) &&
(*m_pArgEnd <= CharType('9')) )
{
m_szFlags[flagofs++] = char(*m_pArgEnd);
len = len*10 + (*m_pArgEnd - wxT('0'));
m_pArgEnd++;
}
if (in_prec)
m_nMaxWidth = len;
else
m_nMinWidth = len;
m_pArgEnd--; // the main loop pre-increments n again
}
break;
case wxT('$'): // a positional parameter (e.g. %2$s) ?
{
if (m_nMinWidth <= 0)
break; // ignore this formatting flag as no
// numbers are preceding it
// remove from m_szFlags all digits previously added
do {
flagofs--;
} while (m_szFlags[flagofs] >= '1' &&
m_szFlags[flagofs] <= '9');
// re-adjust the offset making it point to the
// next free char of m_szFlags
flagofs++;
m_pos = m_nMinWidth;
m_nMinWidth = 0;
}
break;
case wxT('d'):
case wxT('i'):
case wxT('o'):
case wxT('u'):
case wxT('x'):
case wxT('X'):
CHECK_PREC
m_szFlags[flagofs++] = char(ch);
if (ilen == 0)
m_type = wxPAT_INT;
else if (ilen == -1)
// NB: 'short int' value passed through '...'
// is promoted to 'int', so we have to get
// an int from stack even if we need a short
m_type = wxPAT_INT;
else if (ilen == 1)
m_type = wxPAT_LONGINT;
else if (ilen == 2)
m_type = wxPAT_LONGLONGINT;
else if (ilen == 3)
m_type = wxPAT_SIZET;
done = true;
break;
case wxT('e'):
case wxT('E'):
case wxT('f'):
case wxT('g'):
case wxT('G'):
CHECK_PREC
m_szFlags[flagofs++] = char(ch);
if (ilen == 2)
m_type = wxPAT_LONGDOUBLE;
else
m_type = wxPAT_DOUBLE;
done = true;
break;
case wxT('p'):
m_type = wxPAT_POINTER;
m_szFlags[flagofs++] = char(ch);
done = true;
break;
case wxT('c'):
if (ilen == -1)
{
// %hc == ANSI character
m_type = wxPAT_CHAR;
}
else
{
// %lc == %c == Unicode character
m_type = wxPAT_WCHAR;
}
done = true;
break;
case wxT('s'):
if (ilen == -1)
{
// wx extension: we'll let %hs mean non-Unicode strings
m_type = wxPAT_PCHAR;
}
else
{
// %ls == %s == Unicode string
m_type = wxPAT_PWCHAR;
}
done = true;
break;
case wxT('n'):
if (ilen == 0)
m_type = wxPAT_NINT;
else if (ilen == -1)
m_type = wxPAT_NSHORTINT;
else if (ilen >= 1)
m_type = wxPAT_NLONGINT;
done = true;
break;
default:
// bad format, don't consider this an argument;
// leave it unchanged
return false;
}
if (flagofs == wxMAX_SVNPRINTF_FLAGBUFFER_LEN)
{
wxLogDebug(wxT("Too many flags specified for a single conversion specifier!"));
return false;
}
}
while (!done);
return true; // parsing was successful
}
template<typename CharType>
void wxPrintfConvSpec<CharType>::ReplaceAsteriskWith(int width)
{
char temp[wxMAX_SVNPRINTF_FLAGBUFFER_LEN];
// find the first * in our flag buffer
char *pwidth = strchr(m_szFlags, '*');
wxCHECK_RET(pwidth, wxT("field width must be specified"));
// save what follows the * (the +1 is to skip the asterisk itself!)
strcpy(temp, pwidth+1);
if (width < 0)
{
pwidth[0] = wxT('-');
pwidth++;
}
// replace * with the actual integer given as width
#ifndef SYSTEM_SPRINTF_IS_UNSAFE
int maxlen = (m_szFlags + wxMAX_SVNPRINTF_FLAGBUFFER_LEN - pwidth) /
sizeof(*m_szFlags);
#endif
int offset = system_sprintf(pwidth, maxlen, "%d", abs(width));
// restore after the expanded * what was following it
strcpy(pwidth+offset, temp);
}
template<typename CharType>
bool wxPrintfConvSpec<CharType>::LoadArg(wxPrintfArg *p, va_list &argptr)
{
// did the '*' width/precision specifier was used ?
if (m_nMaxWidth == -1)
{
// take the maxwidth specifier from the stack
m_nMaxWidth = va_arg(argptr, int);
if (m_nMaxWidth < 0)
m_nMaxWidth = 0;
else
ReplaceAsteriskWith(m_nMaxWidth);
}
if (m_nMinWidth == -1)
{
// take the minwidth specifier from the stack
m_nMinWidth = va_arg(argptr, int);
ReplaceAsteriskWith(m_nMinWidth);
if (m_nMinWidth < 0)
{
m_bAlignLeft = !m_bAlignLeft;
m_nMinWidth = -m_nMinWidth;
}
}
switch (m_type) {
case wxPAT_INT:
p->pad_int = va_arg(argptr, int);
break;
case wxPAT_LONGINT:
p->pad_longint = va_arg(argptr, long int);
break;
case wxPAT_LONGLONGINT:
p->pad_longlongint = va_arg(argptr, wxLongLong_t);
break;
case wxPAT_SIZET:
p->pad_sizet = va_arg(argptr, size_t);
break;
case wxPAT_DOUBLE:
p->pad_double = va_arg(argptr, double);
break;
case wxPAT_LONGDOUBLE:
p->pad_longdouble = va_arg(argptr, long double);
break;
case wxPAT_POINTER:
p->pad_pointer = va_arg(argptr, void *);
break;
case wxPAT_CHAR:
p->pad_char = (char)va_arg(argptr, int); // char is promoted to int when passed through '...'
break;
case wxPAT_WCHAR:
p->pad_wchar = (wchar_t)va_arg(argptr, int); // char is promoted to int when passed through '...'
break;
case wxPAT_PCHAR:
case wxPAT_PWCHAR:
p->pad_str = va_arg(argptr, void *);
break;
case wxPAT_NINT:
p->pad_nint = va_arg(argptr, int *);
break;
case wxPAT_NSHORTINT:
p->pad_nshortint = va_arg(argptr, short int *);
break;
case wxPAT_NLONGINT:
p->pad_nlongint = va_arg(argptr, long int *);
break;
case wxPAT_STAR:
// this will be handled as part of the next argument
return true;
case wxPAT_INVALID:
default:
return false;
}
return true; // loading was successful
}
template<typename CharType>
int wxPrintfConvSpec<CharType>::Process(CharType *buf, size_t lenMax, wxPrintfArg *p, size_t written)
{
// buffer to avoid dynamic memory allocation each time for small strings;
// note that this buffer is used only to hold results of number formatting,
// %s directly writes user's string in buf, without using szScratch
char szScratch[wxMAX_SVNPRINTF_SCRATCHBUFFER_LEN];
size_t lenScratch = 0, lenCur = 0;
#define APPEND_CH(ch) \
{ \
if ( lenCur == lenMax ) \
return -1; \
\
buf[lenCur++] = ch; \
}
switch ( m_type )
{
case wxPAT_INT:
lenScratch = system_sprintf(szScratch, wxMAX_SVNPRINTF_SCRATCHBUFFER_LEN, m_szFlags, p->pad_int);
break;
case wxPAT_LONGINT:
lenScratch = system_sprintf(szScratch, wxMAX_SVNPRINTF_SCRATCHBUFFER_LEN, m_szFlags, p->pad_longint);
break;
case wxPAT_LONGLONGINT:
lenScratch = system_sprintf(szScratch, wxMAX_SVNPRINTF_SCRATCHBUFFER_LEN, m_szFlags, p->pad_longlongint);
break;
case wxPAT_SIZET:
lenScratch = system_sprintf(szScratch, wxMAX_SVNPRINTF_SCRATCHBUFFER_LEN, m_szFlags, p->pad_sizet);
break;
case wxPAT_LONGDOUBLE:
lenScratch = system_sprintf(szScratch, wxMAX_SVNPRINTF_SCRATCHBUFFER_LEN, m_szFlags, p->pad_longdouble);
break;
case wxPAT_DOUBLE:
lenScratch = system_sprintf(szScratch, wxMAX_SVNPRINTF_SCRATCHBUFFER_LEN, m_szFlags, p->pad_double);
break;
case wxPAT_POINTER:
lenScratch = system_sprintf(szScratch, wxMAX_SVNPRINTF_SCRATCHBUFFER_LEN, m_szFlags, p->pad_pointer);
break;
case wxPAT_CHAR:
case wxPAT_WCHAR:
{
wxUniChar ch;
if (m_type == wxPAT_CHAR)
ch = p->pad_char;
else // m_type == wxPAT_WCHAR
ch = p->pad_wchar;
CharType val = ch;
size_t i;
if (!m_bAlignLeft)
for (i = 1; i < (size_t)m_nMinWidth; i++)
APPEND_CH(wxT(' '));
APPEND_CH(val);
if (m_bAlignLeft)
for (i = 1; i < (size_t)m_nMinWidth; i++)
APPEND_CH(wxT(' '));
}
break;
case wxPAT_PCHAR:
case wxPAT_PWCHAR:
{
wxString s;
if ( !p->pad_str )
{
if ( m_nMaxWidth >= 6 )
s = wxT("(null)");
}
else if (m_type == wxPAT_PCHAR)
s.assign(static_cast<const char *>(p->pad_str));
else // m_type == wxPAT_PWCHAR
s.assign(static_cast<const wchar_t *>(p->pad_str));
typename wxPrintfStringHelper<CharType>::ConvertedType strbuf(
wxPrintfStringHelper<CharType>::Convert(s));
// at this point we are sure that m_nMaxWidth is positive or
// null (see top of wxPrintfConvSpec::LoadArg)
int len = wxMin((unsigned int)m_nMaxWidth, wxStrlen(strbuf));
int i;
if (!m_bAlignLeft)
{
for (i = len; i < m_nMinWidth; i++)
APPEND_CH(wxT(' '));
}
len = wxMin((unsigned int)len, lenMax-lenCur);
wxStrncpy(buf+lenCur, strbuf, len);
lenCur += len;
if (m_bAlignLeft)
{
for (i = len; i < m_nMinWidth; i++)
APPEND_CH(wxT(' '));
}
}
break;
case wxPAT_NINT:
*p->pad_nint = written;
break;
case wxPAT_NSHORTINT:
*p->pad_nshortint = (short int)written;
break;
case wxPAT_NLONGINT:
*p->pad_nlongint = written;
break;
case wxPAT_INVALID:
default:
return -1;
}
// if we used system's sprintf() then we now need to append the s_szScratch
// buffer to the given one...
switch (m_type)
{
case wxPAT_INT:
case wxPAT_LONGINT:
case wxPAT_LONGLONGINT:
case wxPAT_SIZET:
case wxPAT_LONGDOUBLE:
case wxPAT_DOUBLE:
case wxPAT_POINTER:
wxASSERT(lenScratch < wxMAX_SVNPRINTF_SCRATCHBUFFER_LEN);
// NB: 1) we can compare lenMax (for CharType*, i.e. possibly
// wchar_t*) with lenScratch (char*) because this code is
// formatting integers and that will have the same length
// even in UTF-8 (the only case when char* length may be
// more than wchar_t* length of the same string)
// 2) wxStrncpy converts the 2nd argument to 1st argument's
// type transparently if their types differ, so this code
// works for both instantiations
if (lenMax < lenScratch)
{
// fill output buffer and then return -1
wxStrncpy(buf, szScratch, lenMax);
return -1;
}
wxStrncpy(buf, szScratch, lenScratch);
lenCur += lenScratch;
break;
default:
break; // all other cases were completed previously
}
return lenCur;
}
// helper that parses format string
template<typename CharType>
struct wxPrintfConvSpecParser
{
typedef wxPrintfConvSpec<CharType> ConvSpec;
wxPrintfConvSpecParser(const CharType *fmt)
{
nspecs =
nargs = 0;
posarg_present =
nonposarg_present = false;
memset(pspec, 0, sizeof(pspec));
// parse the format string
for ( const CharType *toparse = fmt; *toparse != wxT('\0'); toparse++ )
{
// skip everything except format specifications
if ( *toparse != '%' )
continue;
// also skip escaped percent signs
if ( toparse[1] == '%' )
{
toparse++;
continue;
}
ConvSpec *spec = &specs[nspecs];
spec->Init();
// attempt to parse this format specification
if ( !spec->Parse(toparse) )
continue;
// advance to the end of this specifier
toparse = spec->m_pArgEnd;
// special handling for specifications including asterisks: we need
// to reserve an extra slot (or two if asterisks were used for both
// width and precision) in specs array in this case
if ( const char *f = strchr(spec->m_szFlags, '*') )
{
unsigned numAsterisks = 1;
if ( strchr(++f, '*') )
numAsterisks++;
for ( unsigned n = 0; n < numAsterisks; n++ )
{
if ( ++nspecs == wxMAX_SVNPRINTF_ARGUMENTS )
break;
// TODO: we need to support specifiers of the form "%2$*1$s"
// (this is the same as "%*s") as if any positional arguments
// are used all asterisks must be positional as well but this
// requires a lot of changes in this code (basically we'd need
// to rewrite Parse() to return "*" and conversion itself as
// separate entries)
if ( posarg_present )
{
wxFAIL_MSG
(
wxString::Format
(wxASCII_STR(
"Format string \"%s\" uses both positional "
"parameters and '*' but this is not currently "
"supported by this implementation, sorry."),
fmt
)
);
}
specs[nspecs] = *spec;
// make an entry for '*' and point to it from pspec
spec->Init();
spec->m_type = wxPAT_STAR;
pspec[nargs++] = spec;
spec = &specs[nspecs];
}
// If we hit the maximal number of arguments inside the inner
// loop, break out of the outer one as well.
if ( nspecs == wxMAX_SVNPRINTF_ARGUMENTS )
break;
}
// check if this is a positional or normal argument
if ( spec->m_pos > 0 )
{
// the positional arguments start from number 1 so we need
// to adjust the index
spec->m_pos--;
// We could be reusing an already existing argument, only
// increment their number if it's really a new one.
if ( spec->m_pos >= nargs )
{
nargs = spec->m_pos + 1;
}
else if ( pspec[spec->m_pos] ) // Had we seen it before?
{
// Check that the type specified this time is compatible
// with the previously-specified type.
wxASSERT_MSG
(
pspec[spec->m_pos]->m_type == spec->m_type,
"Positional parameter specified multiple times "
"with incompatible types."
);
}
posarg_present = true;
}
else // not a positional argument...
{
spec->m_pos = nargs++;
nonposarg_present = true;
}
// this conversion specifier is tied to the pos-th argument...
pspec[spec->m_pos] = spec;
if ( ++nspecs == wxMAX_SVNPRINTF_ARGUMENTS )
break;
}
// warn if we lost any arguments (the program probably will crash
// anyhow because of stack corruption...)
if ( nspecs == wxMAX_SVNPRINTF_ARGUMENTS )
{
wxFAIL_MSG
(
wxString::Format
(wxASCII_STR(
"wxVsnprintf() currently supports only %d arguments, "
"but format string \"%s\" defines more of them.\n"
"You need to change wxMAX_SVNPRINTF_ARGUMENTS and "
"recompile if more are really needed."),
fmt, wxMAX_SVNPRINTF_ARGUMENTS
)
);
}
}
// total number of valid elements in specs
unsigned nspecs;
// total number of arguments, also number of valid elements in pspec, and
// always less than or (usually) equal to nspecs
unsigned nargs;
// all format specifications in this format string in order of their
// appearance (which may be different from arguments order)
ConvSpec specs[wxMAX_SVNPRINTF_ARGUMENTS];
// pointer to specs array element for the N-th argument
ConvSpec *pspec[wxMAX_SVNPRINTF_ARGUMENTS];
// true if any positional/non-positional parameters are used
bool posarg_present,
nonposarg_present;
};
#undef APPEND_CH
#undef CHECK_PREC
#endif // _WX_PRIVATE_WXPRINTF_H_