Бьерн Страуструп. Язык программирования С++. Специальное издание (2011) (1004033), страница 230
Текст из файла (страница 230)
Вызов яею(саг, яег, Ы, "ЗЬо" ) ищет в каталоге са( сообщение, идентифицируемое посредством (яег, 1ю1) . Если строка находится, толею() возвращает эту строку; в противном случае яею() возвращает строку по умолчанию (здесь это яюг1пя("уоо" ) ). Приведем пример фасета сообщений для системы, в которой каталог сообщений реализован в виде вектора множеств «сообщений», имеющих тип ятг1пя: яюгиею Яею ( »ееюог<яюг(пе> тлея ю 1072 Приложение О.
Локализация я!сися Саг гесяог<Юег> зегяз )! с!ат Му теязаеея: риЫгс тетадез<сааг> ( гесяог<Саг>з сазе]оея! риЫзс: ехр1(с11 Му теяяаеея (я]яе 1= 0): сазе]вез (злее гес(ог<Саг>) ( ) са1а]ое ао орел (сопя! язг]пай з, солзз !оса!ей 1ос) сопз1; (г открыть каталог я язг!ле Ио ее1 (са1ааге с, 1пя з, 1ш т, сопят ягг(лез ) сопя!1 ll взять сообщ-е !з,т] из с гоМ йо с1озе (сазе!ое са1) соля! ( (у(са1а]одз.ягзе() <= са1) сазе]оез.егаяе(сага]оея.Ьее!и() мсая]; ) -Му теззаеез () (Ие1еяе зсагагоезг ) )1 Все функции-члены объявлены константными, потому что структура данных каталога (вес!ос<Без>) хранится вне фасета. Сообгцения выбираются указанием каталога, множества внутри каталога и строки внутри множества. Строка-аргумент используется в качестве возврата по умолчанию в случае, если сообщение в каталоге не обнаруживается.
яяг1пе Му теяяаеез::Ио еез (сазе!ое саг, 1пя зея, ип тяа, сопя! зяг!пез з(еу] сопи ( ф(са1агояя. я!ее () <= сая) ге!игл йеу! Сага с = саяе!вез [саз) 1 (г (с. зеп . я!ее ( ) < = яея) ге!игл Йеуг Яезз я = с.зегз(зея]1 (р(я.тяяя.ягзе() <= тзе) ге!игл 1(еу) ге1игл з. тяая (тяя] 1 Открытие каталога включает в себя считывание текстового содержимого с диска в структуру Саг. В примере я выбрал представление, читать которое не составляет никакого труда.
Множество разграничивается при помощи «< и»>, и каждое сообщение есть одна строка текста: теяяаеея<сЬаг>::сага(ое Му теяяаеея::Ио орел (солт яяг!пей п, соля! 1оса1ез 1ос) солт ( язг(пе пп = л м (оса]е () . пате () 1 Цяягеат/(пп.с тг() ) 1 (!'(!Я ге1игл — 11 сазе]ояз.РизЬ Баса(Саз () ) 1 Сияя с = сазе!вез. Ьаса ( ) 1 язг!пе з! нгЫ1е (уЬ >з з а з= =" «< " ) У читаем 5е1 1(ОЗ () 4. Стандартные фасеты с.яет.рияЬ Ьа<Ь(Яез() ); Бега и = с яезя. Ьаса () т пЫ!е(дег!!пе0",я) аз я ) = "»>") т.тзяя.рияЬ Ьаса (я); ге!игл сага!ояя.я(се П -1; ) // читаем сообщение Вот пример простейшего использования: 1ия тти () (!(! Ьая !осе!<Му теяяаяея> (!оса(е() ) ) ( сеп « "по теяяадеяуасегуоипд !и " « !оса(е () .пате() « ' тп'; ехЬ(1) / ) сопзг тетарея <сваг>з т = ияеуасег<Му теяяаеея> (!оса(е () ); ехтегп тппр теяяаее 01гесгогуг // здесь я храню сообщения гиг са( = т.орел (теяяаие а!гесгогу, !оса1е() ); (г'(соя<0) ( сеп « "по сага!оя3оипгР,и" ! ехд(1) г ) сош « т.пег(саг,0,0, "МгяяеаКаиагп! ") «еп01( сош «т.де! (сш,1,2, "Мгяяед аеа!и! ") « епд!т сои! « т.рег(саг,1,3, "М!яяед аиа1п) ") « еп41г сои! «т.аег(саг,3,0, "М!яяеЫаеаги! ") « етйг ) Если каталог содержит «< ЬеНо еооОЬуе »> уея по тауЬе »> то программа выведет Ье!1о тауЬе М!яяез( аяа1и! Мгяяетг ада!п! (я.4.7.1.
Использование сообщений из других фвсетов Помимо того, что сообщения используются в качестве хранилища зависящих от локализации строк, которые используются для общения с пользователем, они могут Приложение(). Локализация 1074 содержать строки для других фасетов. Например, фасет Яеаюп ю Ц!3.3.2) можно написать следующим образом: с1азз Яеазои <о< риЫ!с !оса!в«Зисе< ( солт теяяаеея<сйаг> з т < <и< со<< // директория сообщений // каталог сообщений риЫ!с: е!азз МЬятл теталез ( ) ! Яеазоп <о (<п« = О): !оса<в<:<осе<(<), т (изе /асе«Яеаяоп теяяалея> (!оса1е () ) ), са< (т.
орел ( теязале <<<зев<агу,!оса!е () ) ) ( <<(са«0) <Ьгоы М<зз<пи теталез () < ) -Яеаюп <о () ( ) // чтобы можно было уничтожать обьекты Яеаяол (о Д1).З) солт я<с<иль <о тг (Яеазоп х) соля« // строковое представление х Ьоо</гот з<г(сопя< в<пила з, Яеазопя х) солт; //поместить Яеазол соответ-ой я вх я<ало <оса!в::Ы <й< У объект идентификации фаеета (ях).2.
з1).З, ЗВ.З.!) )< <оса<в:: Ы Яеазоп Ы:: Ы; У определяем идентифицирующий объект сопз< я<<!иль Яеаюи 1о::<о з<г(Яеаюп х) солги ( ге<игл т->де< (са<, х, "по-зися-зеазоп" ); ) Ьоо1Беазоп 1о::Згот я<г (соля< я<пиеа з, Яеаяоиз х) соля< /ог(Ы«' = Яеаюи <:яре<ил< 1<=Яеаяол «иди<его 1««) (1(т — >де<(са«, ', "ло-зиса-яеазои" ) == я) ( х = Яеаюи(<) < ге<игл и ив< ) т<игп <а1зе/ ) <етр<а<е<с<аяз СЬ> с!ат зЫ: <теязалея Ьупате: риЫ(е теззалез<СЬ> (/*...*/); Это решение, использующее механизм теаяалея, отличается от исходного (5Р.3.2) тем, что разработчик строк Яеаяоп для нового контекста локализации должен помещать их в каталог тек<алея.
Это не может представлять сложности для тех, кто в состоянии добавлять в систему новые контексты локализации. Однако из-за того, что те<заявя предоставляют механизм доступа «только для чтения», добавление нового набора названий времен года может оказаться не по плечу прикладному программисту. Имеется и версия щеязааез с суффиксом Ьупате (5Р.4, 5(3.4.!): 1075 0.5. Советы 0.5. Советы 0.6. Упражнения 1. 3. 4. 5.
б. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. Будьте готовы к тому, что любая нетривиальная программа или система, не- посредственно взаимодействующие с людьми, будут эксплуатироваться в раз- ных странах; в0.1. Не рассчитывайте на то, что все используют тот же набор символов, что и вы; в0.4.!. Используйте Ьса!е, а не частные проприетарные решения для ввода/вывода, зависящего от национальных и культурных особенностей; в0. !. Не помещайте строковые имена локализаций непосредственно в текст про- граммы; в0.2.!.
Минимизируйте применение глобальной форматной информации; 90.2.3, в0.4.4.7. Предпочитайте зависящие от локализации сравнения строк и сортировки; в0.2.4, в0.4.!. Создавайте фасеты неизменяемыми (!шпштаб!е); в0.2.2, 90.3. Сконцентрируйте модификацию контекстов локализации в четко ограничен- ных фрагментах программы; 90.2.3. Пусть время жизни фасетов регулируется из контекстов локализации; 90.3. При написании функций ввода/вывода, зависящих от локализации, не забы- вайте обрабатывать исключения, генерируемые пользовательскими (заме- шенными) функциями; в0.4.2.2. Используйте простой тип Мопеу для хранения денежных сумм; 90.4.3. Используйте простые пользовательские типы для хранения значений, тре- бующих ввода/вывода, чувствительного к местным и национальным особен- ностям (а не прибегайте к приведению типов ко встроенным типам до и по- сле операций чтения/записи); 90.4.3.
Не доверяйте измерениям времени выполнения до тех пор, пока вы не учтете все влияющие на них факторы; 9Э.4.4.!. Не забывайте об ограничениях типа йие г, 90.4.4.1, В0.4.4.5. Используйте процедуры ввода даты, допускающие различные форматы дат; в0.4.4.5. Отдавайте предпочтение тем функциям классификации символов, в которых локализации учитываются (используются) явным образом; 90.4.5, в0.4.5.!. (*2.5) Определите Юеаюя 1о (В0.3.2) для языка, отличного от американского английского. ('2) Определите класс Яеаюя ю (50.3.2), который принимает строки названий времен года в качестве аргументов конструктора, с тем, чтобы названия времен года в разных локализациях могли представляться объектами этого класса. 1078 Приложение О.
Локализация 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. (*3) Напишите функцию соВаге<сйае>:: сотраге (), которая работает согласно словарному упорядочению. Сделайте это для языков, вроде французского или немецкого, в которых букв больше, чем в английском. (*2) Напишите программу, которая читает и пишет логические значения (типа Ьоо() в виде чисел, английских слов или слов любого другого языка по вашему выбору. (*2.5) Определите тип Пте для представления времени суток. Определите тип Расе аай «те с помощью типов Пте и Роге. Обсудите плюсы и минусы такого подхода в сравнении с Расе из эь».4.4.