1<section xmlns="http://docbook.org/ns/docbook" version="5.0" 2 xml:id="std.localization.locales.locale" xreflabel="Locale"> 3 4<info><title>locale</title> 5 <keywordset> 6 <keyword>ISO C++</keyword> 7 <keyword>locale</keyword> 8 </keywordset> 9</info> 10 11 12 13<para> 14Describes the basic locale object, including nested 15classes id, facet, and the reference-counted implementation object, 16class _Impl. 17</para> 18 19<section xml:id="locales.locale.req"><info><title>Requirements</title></info> 20 21 22<para> 23Class locale is non-templatized and has two distinct types nested 24inside of it: 25</para> 26 27<blockquote> 28<para> 29<emphasis> 30class facet 3122.1.1.1.2 Class locale::facet 32</emphasis> 33</para> 34</blockquote> 35 36<para> 37Facets actually implement locale functionality. For instance, a facet 38called numpunct is the data object that can be used to query for the 39thousands separator in the locale. 40</para> 41 42<para> 43Literally, a facet is strictly defined: 44</para> 45 46<itemizedlist> 47 <listitem> 48 <para> 49 Containing the following public data member: 50 </para> 51 <para> 52 <code>static locale::id id;</code> 53 </para> 54 </listitem> 55 56 <listitem> 57 <para> 58 Derived from another facet: 59 </para> 60 <para> 61 <code>class gnu_codecvt: public std::ctype<user-defined-type></code> 62 </para> 63 </listitem> 64</itemizedlist> 65 66<para> 67Of interest in this class are the memory management options explicitly 68specified as an argument to facet's constructor. Each constructor of a 69facet class takes a std::size_t __refs argument: if __refs == 0, the 70facet is deleted when the locale containing it is destroyed. If __refs 71== 1, the facet is not destroyed, even when it is no longer 72referenced. 73</para> 74 75<blockquote> 76<para> 77<emphasis> 78class id 7922.1.1.1.3 - Class locale::id 80</emphasis> 81</para> 82</blockquote> 83 84<para> 85Provides an index for looking up specific facets. 86</para> 87</section> 88 89<section xml:id="locales.locale.design"><info><title>Design</title></info> 90 91 92<para> 93The major design challenge is fitting an object-orientated and 94non-global locale design on top of POSIX and other relevant standards, 95which include the Single Unix (nee X/Open.) 96</para> 97 98<para> 99Because C and earlier versions of POSIX fall down so completely, 100portability is an issue. 101</para> 102 103</section> 104 105<section xml:id="locales.locale.impl"><info><title>Implementation</title></info> 106 107 108 <section xml:id="locale.impl.c"><info><title>Interacting with "C" locales</title></info> 109 110 111<itemizedlist> 112 <listitem> 113 <para> 114 <code>locale -a</code> displays available locales. 115 </para> 116<blockquote> 117<programlisting> 118af_ZA 119ar_AE 120ar_AE.utf8 121ar_BH 122ar_BH.utf8 123ar_DZ 124ar_DZ.utf8 125ar_EG 126ar_EG.utf8 127ar_IN 128ar_IQ 129ar_IQ.utf8 130ar_JO 131ar_JO.utf8 132ar_KW 133ar_KW.utf8 134ar_LB 135ar_LB.utf8 136ar_LY 137ar_LY.utf8 138ar_MA 139ar_MA.utf8 140ar_OM 141ar_OM.utf8 142ar_QA 143ar_QA.utf8 144ar_SA 145ar_SA.utf8 146ar_SD 147ar_SD.utf8 148ar_SY 149ar_SY.utf8 150ar_TN 151ar_TN.utf8 152ar_YE 153ar_YE.utf8 154be_BY 155be_BY.utf8 156bg_BG 157bg_BG.utf8 158br_FR 159bs_BA 160C 161ca_ES 162ca_ES@euro 163ca_ES.utf8 164ca_ES.utf8@euro 165cs_CZ 166cs_CZ.utf8 167cy_GB 168da_DK 169da_DK.iso885915 170da_DK.utf8 171de_AT 172de_AT@euro 173de_AT.utf8 174de_AT.utf8@euro 175de_BE 176de_BE@euro 177de_BE.utf8 178de_BE.utf8@euro 179de_CH 180de_CH.utf8 181de_DE 182de_DE@euro 183de_DE.utf8 184de_DE.utf8@euro 185de_LU 186de_LU@euro 187de_LU.utf8 188de_LU.utf8@euro 189el_GR 190el_GR.utf8 191en_AU 192en_AU.utf8 193en_BW 194en_BW.utf8 195en_CA 196en_CA.utf8 197en_DK 198en_DK.utf8 199en_GB 200en_GB.iso885915 201en_GB.utf8 202en_HK 203en_HK.utf8 204en_IE 205en_IE@euro 206en_IE.utf8 207en_IE.utf8@euro 208en_IN 209en_NZ 210en_NZ.utf8 211en_PH 212en_PH.utf8 213en_SG 214en_SG.utf8 215en_US 216en_US.iso885915 217en_US.utf8 218en_ZA 219en_ZA.utf8 220en_ZW 221en_ZW.utf8 222es_AR 223es_AR.utf8 224es_BO 225es_BO.utf8 226es_CL 227es_CL.utf8 228es_CO 229es_CO.utf8 230es_CR 231es_CR.utf8 232es_DO 233es_DO.utf8 234es_EC 235es_EC.utf8 236es_ES 237es_ES@euro 238es_ES.utf8 239es_ES.utf8@euro 240es_GT 241es_GT.utf8 242es_HN 243es_HN.utf8 244es_MX 245es_MX.utf8 246es_NI 247es_NI.utf8 248es_PA 249es_PA.utf8 250es_PE 251es_PE.utf8 252es_PR 253es_PR.utf8 254es_PY 255es_PY.utf8 256es_SV 257es_SV.utf8 258es_US 259es_US.utf8 260es_UY 261es_UY.utf8 262es_VE 263es_VE.utf8 264et_EE 265et_EE.utf8 266eu_ES 267eu_ES@euro 268eu_ES.utf8 269eu_ES.utf8@euro 270fa_IR 271fi_FI 272fi_FI@euro 273fi_FI.utf8 274fi_FI.utf8@euro 275fo_FO 276fo_FO.utf8 277fr_BE 278fr_BE@euro 279fr_BE.utf8 280fr_BE.utf8@euro 281fr_CA 282fr_CA.utf8 283fr_CH 284fr_CH.utf8 285fr_FR 286fr_FR@euro 287fr_FR.utf8 288fr_FR.utf8@euro 289fr_LU 290fr_LU@euro 291fr_LU.utf8 292fr_LU.utf8@euro 293ga_IE 294ga_IE@euro 295ga_IE.utf8 296ga_IE.utf8@euro 297gl_ES 298gl_ES@euro 299gl_ES.utf8 300gl_ES.utf8@euro 301gv_GB 302gv_GB.utf8 303he_IL 304he_IL.utf8 305hi_IN 306hr_HR 307hr_HR.utf8 308hu_HU 309hu_HU.utf8 310id_ID 311id_ID.utf8 312is_IS 313is_IS.utf8 314it_CH 315it_CH.utf8 316it_IT 317it_IT@euro 318it_IT.utf8 319it_IT.utf8@euro 320iw_IL 321iw_IL.utf8 322ja_JP.eucjp 323ja_JP.utf8 324ka_GE 325kl_GL 326kl_GL.utf8 327ko_KR.euckr 328ko_KR.utf8 329kw_GB 330kw_GB.utf8 331lt_LT 332lt_LT.utf8 333lv_LV 334lv_LV.utf8 335mi_NZ 336mk_MK 337mk_MK.utf8 338mr_IN 339ms_MY 340ms_MY.utf8 341mt_MT 342mt_MT.utf8 343nl_BE 344nl_BE@euro 345nl_BE.utf8 346nl_BE.utf8@euro 347nl_NL 348nl_NL@euro 349nl_NL.utf8 350nl_NL.utf8@euro 351nn_NO 352nn_NO.utf8 353no_NO 354no_NO.utf8 355oc_FR 356pl_PL 357pl_PL.utf8 358POSIX 359pt_BR 360pt_BR.utf8 361pt_PT 362pt_PT@euro 363pt_PT.utf8 364pt_PT.utf8@euro 365ro_RO 366ro_RO.utf8 367ru_RU 368ru_RU.koi8r 369ru_RU.utf8 370ru_UA 371ru_UA.utf8 372se_NO 373sk_SK 374sk_SK.utf8 375sl_SI 376sl_SI.utf8 377sq_AL 378sq_AL.utf8 379sr_YU 380sr_YU@cyrillic 381sr_YU.utf8 382sr_YU.utf8@cyrillic 383sv_FI 384sv_FI@euro 385sv_FI.utf8 386sv_FI.utf8@euro 387sv_SE 388sv_SE.iso885915 389sv_SE.utf8 390ta_IN 391te_IN 392tg_TJ 393th_TH 394th_TH.utf8 395tl_PH 396tr_TR 397tr_TR.utf8 398uk_UA 399uk_UA.utf8 400ur_PK 401uz_UZ 402vi_VN 403vi_VN.tcvn 404wa_BE 405wa_BE@euro 406yi_US 407zh_CN 408zh_CN.gb18030 409zh_CN.gbk 410zh_CN.utf8 411zh_HK 412zh_HK.utf8 413zh_TW 414zh_TW.euctw 415zh_TW.utf8 416</programlisting> 417</blockquote> 418</listitem> 419 420 <listitem> 421 <para> 422 <code>`locale`</code> displays environmental variables that 423 impact how locale("") will be deduced. 424 </para> 425<blockquote> 426<programlisting> 427LANG=en_US 428LC_CTYPE="en_US" 429LC_NUMERIC="en_US" 430LC_TIME="en_US" 431LC_COLLATE="en_US" 432LC_MONETARY="en_US" 433LC_MESSAGES="en_US" 434LC_PAPER="en_US" 435LC_NAME="en_US" 436LC_ADDRESS="en_US" 437LC_TELEPHONE="en_US" 438LC_MEASUREMENT="en_US" 439LC_IDENTIFICATION="en_US" 440LC_ALL= 441</programlisting> 442</blockquote> 443</listitem> 444</itemizedlist> 445 446<para> 447From Josuttis, p. 697-698, which says, that "there is only *one* 448relation (of the C++ locale mechanism) to the C locale mechanism: the 449global C locale is modified if a named C++ locale object is set as the 450global locale" (emphasis Paolo), that is: 451</para> 452 453<programlisting>std::locale::global(std::locale(""));</programlisting> 454 455<para>affects the C functions as if the following call was made:</para> 456 457<programlisting>std::setlocale(LC_ALL, "");</programlisting> 458 459<para> 460 On the other hand, there is *no* vice versa, that is, calling 461 setlocale has *no* whatsoever on the C++ locale mechanism, in 462 particular on the working of locale(""), which constructs the locale 463 object from the environment of the running program, that is, in 464 practice, the set of LC_ALL, LANG, etc. variable of the shell. 465</para> 466 467 </section> 468</section> 469 470<section xml:id="locales.locale.future"><info><title>Future</title></info> 471 472 473<itemizedlist> 474 <listitem> 475 <para> 476 Locale initialization: at what point does _S_classic, _S_global 477 get initialized? Can named locales assume this initialization 478 has already taken place? 479 </para> 480 </listitem> 481 482 <listitem> 483 <para> 484 Document how named locales error check when filling data 485 members. I.e., a fr_FR locale that doesn't have 486 numpunct::truename(): does it use "true"? Or is it a blank 487 string? What's the convention? 488 </para> 489 </listitem> 490 491 <listitem> 492 <para> 493 Explain how locale aliasing happens. When does "de_DE" use "de" 494 information? What is the rule for locales composed of just an 495 ISO language code (say, "de") and locales with both an ISO 496 language code and ISO country code (say, "de_DE"). 497 </para> 498 </listitem> 499 500 <listitem> 501 <para> 502 What should non-required facet instantiations do? If the 503 generic implementation is provided, then how to end-users 504 provide specializations? 505 </para> 506 </listitem> 507</itemizedlist> 508</section> 509 510<bibliography xml:id="locales.locale.biblio"><info><title>Bibliography</title></info> 511 512 513 <biblioentry> 514 <citetitle> 515 The GNU C Library 516 </citetitle> 517 <author><personname><surname>McGrath</surname><firstname>Roland</firstname></personname></author> 518 <author><personname><surname>Drepper</surname><firstname>Ulrich</firstname></personname></author> 519 <copyright> 520 <year>2007</year> 521 <holder>FSF</holder> 522 </copyright> 523 <pagenums> 524 Chapters 6 Character Set Handling and 7 Locales and 525 Internationalization 526 </pagenums> 527 </biblioentry> 528 529 <biblioentry> 530 <citetitle> 531 Correspondence 532 </citetitle> 533 <author><personname><surname>Drepper</surname><firstname>Ulrich</firstname></personname></author> 534 <copyright> 535 <year>2002</year> 536 <holder/> 537 </copyright> 538 </biblioentry> 539 540 <biblioentry> 541 <citetitle> 542 ISO/IEC 14882:1998 Programming languages - C++ 543 </citetitle> 544 <copyright> 545 <year>1998</year> 546 <holder>ISO</holder> 547 </copyright> 548 </biblioentry> 549 550 <biblioentry> 551 <citetitle> 552 ISO/IEC 9899:1999 Programming languages - C 553 </citetitle> 554 <copyright> 555 <year>1999</year> 556 <holder>ISO</holder> 557 </copyright> 558 </biblioentry> 559 560 <biblioentry> 561 <title> 562 <link xmlns:xlink="http://www.w3.org/1999/xlink" 563 xlink:href="http://pubs.opengroup.org/onlinepubs/9699919799/"> 564 System Interface Definitions, Issue 7 (IEEE Std. 1003.1-2008) 565 </link> 566 </title> 567 <copyright> 568 <year>2008</year> 569 <holder> 570 The Open Group/The Institute of Electrical and Electronics 571 Engineers, Inc. 572 </holder> 573 </copyright> 574 </biblioentry> 575 576 <biblioentry> 577 <citetitle> 578 The C++ Programming Language, Special Edition 579 </citetitle> 580 <author><personname><surname>Stroustrup</surname><firstname>Bjarne</firstname></personname></author> 581 <copyright> 582 <year>2000</year> 583 <holder>Addison Wesley, Inc.</holder> 584 </copyright> 585 <pagenums>Appendix D</pagenums> 586 <publisher> 587 <publishername> 588 Addison Wesley 589 </publishername> 590 </publisher> 591 </biblioentry> 592 593 <biblioentry> 594 <citetitle> 595 Standard C++ IOStreams and Locales 596 </citetitle> 597 <subtitle> 598 Advanced Programmer's Guide and Reference 599 </subtitle> 600 <author><personname><surname>Langer</surname><firstname>Angelika</firstname></personname></author> 601 <author><personname><surname>Kreft</surname><firstname>Klaus</firstname></personname></author> 602 <copyright> 603 <year>2000</year> 604 <holder>Addison Wesley Longman, Inc.</holder> 605 </copyright> 606 <publisher> 607 <publishername> 608 Addison Wesley Longman 609 </publishername> 610 </publisher> 611 </biblioentry> 612 613</bibliography> 614 615</section> 616