<!--
    Licensed to the Apache Software  Foundation (ASF) under one or more
    contributor  license agreements.  See  the NOTICE  file distributed
    with  this  work  for  additional information  regarding  copyright
    ownership.   The ASF  licenses this  file to  you under  the Apache
    License, Version  2.0 (the  License); you may  not use  this file
    except in  compliance with the License.   You may obtain  a copy of
    the License at

    http://www.apache.org/licenses/LICENSE-2.0

    Unless required by applicable law or agreed to in writing, software
    distributed under the  License is distributed on an  "AS IS" BASIS,
    WITHOUT  WARRANTIES OR CONDITIONS  OF ANY  KIND, either  express or
    implied.   See  the License  for  the  specific language  governing
    permissions and limitations under the License.

    Copyright 1999-2007 Rogue Wave Software, Inc.
-->

<HTML>
<HEAD>
<TITLE>Localization library</TITLE>
<LINK REL=StyleSheet HREF="../rw.css" TYPE="text/css" TITLE="Apache stdcxx Stylesheet"></HEAD>
<BODY BGCOLOR=#FFFFFF>
<A HREF="2-5.html"><IMG SRC="images/bprev.gif" WIDTH=20 HEIGHT=21 ALT="Previous file" BORDER=O></A><A HREF="noframes.html"><IMG SRC="images/btop.gif" WIDTH=56 HEIGHT=21 ALT="Top of Document" BORDER=O></A><A HREF="booktoc.html"><IMG SRC="images/btoc.gif" WIDTH=56 HEIGHT=21 ALT="Contents" BORDER=O></A><A HREF="tindex.html"><IMG SRC="images/bindex.gif" WIDTH=56 HEIGHT=21 ALT="Index page" BORDER=O></A><A HREF="2-7.html"><IMG SRC="images/bnext.gif" WIDTH=25 HEIGHT=21 ALT="Next file" BORDER=O></A><DIV CLASS="DOCUMENTNAME"><B>Apache C++ Standard Library Reference Guide</B></DIV>
<H2>2.6 Localization library</H2>
<P>Clause 22 of the Standard contains the Localization library, <SAMP>lib.localization</SAMP>. This library describes components for international text processing. If you are reading this manual online, click the name of header file or entry to go to its description.</P>
<H4><A NAME="Table&nbsp;5">Table&nbsp;5: Localization library</A></H4>
<TABLE BORDER="1" CELLPADDING="3" CELLSPACING="3">
<tr><td valign=top><B>Header File</B>
</td>
<td valign=top colspan=3 rowspan=1><B>Corresponding Entries in this Reference</B>
</td>
</tr>
<tr><td valign=top><P CLASS="TABLE"><SAMP>&lt;locale&gt;</SAMP></P>
</td>
<td valign=top><P CLASS="TABLE"><B><I><A HREF="locale.html">locale</A></I></B></P>
<P CLASS="TABLE"><SAMP><A HREF="has-facet.html">has_facet()</A></SAMP></P>
<P CLASS="TABLE"><SAMP><A HREF="use-facet.html">use_facet()</A></SAMP></P>
<P CLASS="TABLE"><SAMP><A HREF="isspace.html">isspace()</A></SAMP></P>
<P CLASS="TABLE"><SAMP><A HREF="isprint.html">isprint()</A></SAMP></P>
<P CLASS="TABLE"><SAMP><A HREF="iscntrl.html">iscntrl()</A></SAMP></P>
<P CLASS="TABLE"><SAMP><A HREF="isupper.html">isupper()</A></SAMP></P>
<P CLASS="TABLE"><SAMP><A HREF="islower.html">islower()</A></SAMP></P>
<P CLASS="TABLE"><SAMP><A HREF="isalpha.html">isalpha()</A></SAMP></P>
<P CLASS="TABLE"><SAMP><A HREF="isdigit.html">isdigit()</A></SAMP></P>
<P CLASS="TABLE"><SAMP><A HREF="ispunct.html">ispunct()</A></SAMP></P>
<P CLASS="TABLE"><SAMP><A HREF="isxdigit.html">isxdigit()</A></SAMP></P>
<P CLASS="TABLE"><SAMP><A HREF="isalnum.html">isalnum()</A></SAMP></P>
<P CLASS="TABLE"><SAMP><A HREF="isgraph.html">isgraph()</A></SAMP></P>
<P CLASS="TABLE"><SAMP><A HREF="toupper.html">toupper()</A></SAMP></P>
<P CLASS="TABLE"><SAMP><A HREF="tolower.html">tolower()</A></SAMP></P>
</td>
<td valign=top><P CLASS="TABLE"><A HREF="facets.html">Facets</A></P>
<P CLASS="TABLE"><B><I><A HREF="ctype.html">ctype</A></I></B></P>
<P CLASS="TABLE"><B><I><A HREF="ctype-byname.html">ctype_byname</A></I></B></P>
<P CLASS="TABLE"><B><I><A HREF="num-get.html">num_get</A></I></B></P>
<P CLASS="TABLE"><B><I><A HREF="num-put.html">num_put</A></I></B></P>
<P CLASS="TABLE"><B><I><A HREF="numpunct.html">numpunct</A></I></B></P>
<P CLASS="TABLE"><B><I><A HREF="numpunct.html">numpunct_byname</A></I></B></P>
<P CLASS="TABLE"><B><I><A HREF="codecvt.html">codecvt</A></I></B></P>
<P CLASS="TABLE"><B><I><A HREF="codecvt-byname.html">codecvt_byname</A></I></B></P>
<P CLASS="TABLE"><B><I><A HREF="collate.html">collate</A></I></B></P>
<P CLASS="TABLE"><B><I><A HREF="collate.html">collate_byname</A></I></B></P>
</td>
<td valign=top><P CLASS="TABLE"><B><I><A HREF="time-get.html">time_get</A></I></B></P>
<P CLASS="TABLE"><B><I><A HREF="time-get-byname.html">time_get_byname</A></I></B></P>
<P CLASS="TABLE"><B><I><A HREF="time-put.html">time_put</A></I></B></P>
<P CLASS="TABLE"><B><I><A HREF="time-put-byname.html">time_put_byname</A></I></B></P>
<P CLASS="TABLE"><B><I><A HREF="money-get.html">money_get</A></I></B></P>
<P CLASS="TABLE"><B><I><A HREF="money-put.html">money_put</A></I></B></P>
<P CLASS="TABLE"><B><I><A HREF="moneypunct.html">moneypunct</A></I></B></P>
<P CLASS="TABLE"><B><I><A HREF="moneypunct.html">moneypunct_byname</A></I></B></P>
<P CLASS="TABLE"><B><I><A HREF="messages.html">messages</A></I></B></P>
<P CLASS="TABLE"><B><I><A HREF="messages.html">messages_byname</A></I></B></P>
</td>
</tr>
</TABLE>

<BR>
<HR>
<A HREF="2-5.html"><IMG SRC="images/bprev.gif" WIDTH=20 HEIGHT=21 ALT="Previous file" BORDER=O></A><A HREF="noframes.html"><IMG SRC="images/btop.gif" WIDTH=56 HEIGHT=21 ALT="Top of Document" BORDER=O></A><A HREF="booktoc.html"><IMG SRC="images/btoc.gif" WIDTH=56 HEIGHT=21 ALT="Contents" BORDER=O></A><A HREF="tindex.html"><IMG SRC="images/bindex.gif" WIDTH=56 HEIGHT=21 ALT="Index page" BORDER=O></A><A HREF="2-7.html"><IMG SRC="images/bnext.gif" WIDTH=20 HEIGHT=21 ALT="Next file" BORDER=O></A>

<!-- Google Analytics tracking code -->
<script src="http://www.google-analytics.com/urchin.js" type="text/javascript">
</script>
<script type="text/javascript">
    _uacct = "UA-1775151-1";
    urchinTracker();
</script>
<!-- end of Google Analytics tracking code -->

</BODY>
</HTML>
