xref: /aosp_15_r20/external/icu/icu4c/source/samples/translit/main.cpp (revision 0e209d3975ff4a8c132096b14b0e9364a753506e)
1*0e209d39SAndroid Build Coastguard Worker /***********************************************************************
2*0e209d39SAndroid Build Coastguard Worker  * © 2016 and later: Unicode, Inc. and others.
3*0e209d39SAndroid Build Coastguard Worker  * License & terms of use: http://www.unicode.org/copyright.html
4*0e209d39SAndroid Build Coastguard Worker  ***********************************************************************
5*0e209d39SAndroid Build Coastguard Worker  ***********************************************************************
6*0e209d39SAndroid Build Coastguard Worker  * COPYRIGHT:
7*0e209d39SAndroid Build Coastguard Worker  * Copyright (c) 1999-2003, International Business Machines Corporation and
8*0e209d39SAndroid Build Coastguard Worker  * others. All Rights Reserved.
9*0e209d39SAndroid Build Coastguard Worker  ***********************************************************************/
10*0e209d39SAndroid Build Coastguard Worker 
11*0e209d39SAndroid Build Coastguard Worker #include "unicode/translit.h"
12*0e209d39SAndroid Build Coastguard Worker //#include "unicode/rbt.h"
13*0e209d39SAndroid Build Coastguard Worker #include "unicode/unistr.h"
14*0e209d39SAndroid Build Coastguard Worker #include "unicode/calendar.h"
15*0e209d39SAndroid Build Coastguard Worker #include "unicode/datefmt.h"
16*0e209d39SAndroid Build Coastguard Worker #include <stdio.h>
17*0e209d39SAndroid Build Coastguard Worker #include <stdlib.h>
18*0e209d39SAndroid Build Coastguard Worker #include "util.h"
19*0e209d39SAndroid Build Coastguard Worker #include "unaccent.h"
20*0e209d39SAndroid Build Coastguard Worker 
21*0e209d39SAndroid Build Coastguard Worker // RuleBasedTransliterator rules to remove accents from characters
22*0e209d39SAndroid Build Coastguard Worker // so they can be displayed as ASCIIx
23*0e209d39SAndroid Build Coastguard Worker UnicodeString UNACCENT_RULES(
24*0e209d39SAndroid Build Coastguard Worker     "[\\u00C0-\\u00C5] > A;"
25*0e209d39SAndroid Build Coastguard Worker     "[\\u00C8-\\u00CB] > E;"
26*0e209d39SAndroid Build Coastguard Worker     "[\\u00CC-\\u00CF] > I;"
27*0e209d39SAndroid Build Coastguard Worker     "[\\u00E0-\\u00E5] > a;"
28*0e209d39SAndroid Build Coastguard Worker     "[\\u00E8-\\u00EB] > e;"
29*0e209d39SAndroid Build Coastguard Worker     "[\\u00EC-\\u00EF] > i;"
30*0e209d39SAndroid Build Coastguard Worker     );
31*0e209d39SAndroid Build Coastguard Worker 
main(int argc,char ** argv)32*0e209d39SAndroid Build Coastguard Worker int main(int argc, char **argv) {
33*0e209d39SAndroid Build Coastguard Worker 
34*0e209d39SAndroid Build Coastguard Worker     Calendar *cal;
35*0e209d39SAndroid Build Coastguard Worker     DateFormat *fmt;
36*0e209d39SAndroid Build Coastguard Worker     DateFormat *defFmt;
37*0e209d39SAndroid Build Coastguard Worker     Transliterator *greek_latin;
38*0e209d39SAndroid Build Coastguard Worker     Transliterator *rbtUnaccent;
39*0e209d39SAndroid Build Coastguard Worker     Transliterator *unaccent;
40*0e209d39SAndroid Build Coastguard Worker     UParseError pError;
41*0e209d39SAndroid Build Coastguard Worker     UErrorCode status = U_ZERO_ERROR;
42*0e209d39SAndroid Build Coastguard Worker     Locale greece("el", "GR");
43*0e209d39SAndroid Build Coastguard Worker     UnicodeString str, str2;
44*0e209d39SAndroid Build Coastguard Worker 
45*0e209d39SAndroid Build Coastguard Worker     // Create a calendar in the Greek locale
46*0e209d39SAndroid Build Coastguard Worker     cal = Calendar::createInstance(greece, status);
47*0e209d39SAndroid Build Coastguard Worker     check(status, "Calendar::createInstance");
48*0e209d39SAndroid Build Coastguard Worker 
49*0e209d39SAndroid Build Coastguard Worker     // Create a formatter
50*0e209d39SAndroid Build Coastguard Worker     fmt = DateFormat::createDateInstance(DateFormat::kFull, greece);
51*0e209d39SAndroid Build Coastguard Worker     fmt->setCalendar(*cal);
52*0e209d39SAndroid Build Coastguard Worker 
53*0e209d39SAndroid Build Coastguard Worker     // Create a default formatter
54*0e209d39SAndroid Build Coastguard Worker     defFmt = DateFormat::createDateInstance(DateFormat::kFull);
55*0e209d39SAndroid Build Coastguard Worker     defFmt->setCalendar(*cal);
56*0e209d39SAndroid Build Coastguard Worker 
57*0e209d39SAndroid Build Coastguard Worker     // Create a Greek-Latin Transliterator
58*0e209d39SAndroid Build Coastguard Worker     greek_latin = Transliterator::createInstance("Greek-Latin", UTRANS_FORWARD, status);
59*0e209d39SAndroid Build Coastguard Worker     if (greek_latin == nullptr) {
60*0e209d39SAndroid Build Coastguard Worker         printf("ERROR: Transliterator::createInstance() failed\n");
61*0e209d39SAndroid Build Coastguard Worker         exit(1);
62*0e209d39SAndroid Build Coastguard Worker     }
63*0e209d39SAndroid Build Coastguard Worker 
64*0e209d39SAndroid Build Coastguard Worker     // Create a custom Transliterator
65*0e209d39SAndroid Build Coastguard Worker     rbtUnaccent = Transliterator::createFromRules("RBTUnaccent",
66*0e209d39SAndroid Build Coastguard Worker                                                   UNACCENT_RULES,
67*0e209d39SAndroid Build Coastguard Worker                                                   UTRANS_FORWARD,
68*0e209d39SAndroid Build Coastguard Worker                                                   pError,
69*0e209d39SAndroid Build Coastguard Worker                                                   status);
70*0e209d39SAndroid Build Coastguard Worker     check(status, "Transliterator::createFromRules");
71*0e209d39SAndroid Build Coastguard Worker 
72*0e209d39SAndroid Build Coastguard Worker     // Create a custom Transliterator
73*0e209d39SAndroid Build Coastguard Worker     unaccent = new UnaccentTransliterator();
74*0e209d39SAndroid Build Coastguard Worker 
75*0e209d39SAndroid Build Coastguard Worker     // Loop over various months
76*0e209d39SAndroid Build Coastguard Worker     for (int32_t month = Calendar::JANUARY;
77*0e209d39SAndroid Build Coastguard Worker          month <= Calendar::DECEMBER;
78*0e209d39SAndroid Build Coastguard Worker          ++month) {
79*0e209d39SAndroid Build Coastguard Worker 
80*0e209d39SAndroid Build Coastguard Worker         // Set the calendar to a date
81*0e209d39SAndroid Build Coastguard Worker         cal->clear();
82*0e209d39SAndroid Build Coastguard Worker         cal->set(1999, month, 4);
83*0e209d39SAndroid Build Coastguard Worker 
84*0e209d39SAndroid Build Coastguard Worker         // Format the date in default locale
85*0e209d39SAndroid Build Coastguard Worker         str.remove();
86*0e209d39SAndroid Build Coastguard Worker         defFmt->format(cal->getTime(status), str, status);
87*0e209d39SAndroid Build Coastguard Worker         check(status, "DateFormat::format");
88*0e209d39SAndroid Build Coastguard Worker         printf("Date: ");
89*0e209d39SAndroid Build Coastguard Worker         uprintf(escape(str));
90*0e209d39SAndroid Build Coastguard Worker         printf("\n");
91*0e209d39SAndroid Build Coastguard Worker 
92*0e209d39SAndroid Build Coastguard Worker         // Format the date for Greece
93*0e209d39SAndroid Build Coastguard Worker         str.remove();
94*0e209d39SAndroid Build Coastguard Worker         fmt->format(cal->getTime(status), str, status);
95*0e209d39SAndroid Build Coastguard Worker         check(status, "DateFormat::format");
96*0e209d39SAndroid Build Coastguard Worker         printf("Greek formatted date: ");
97*0e209d39SAndroid Build Coastguard Worker         uprintf(escape(str));
98*0e209d39SAndroid Build Coastguard Worker         printf("\n");
99*0e209d39SAndroid Build Coastguard Worker 
100*0e209d39SAndroid Build Coastguard Worker         // Transliterate result
101*0e209d39SAndroid Build Coastguard Worker         greek_latin->transliterate(str);
102*0e209d39SAndroid Build Coastguard Worker         printf("Transliterated via Greek-Latin: ");
103*0e209d39SAndroid Build Coastguard Worker         uprintf(escape(str));
104*0e209d39SAndroid Build Coastguard Worker         printf("\n");
105*0e209d39SAndroid Build Coastguard Worker 
106*0e209d39SAndroid Build Coastguard Worker         // Transliterate result
107*0e209d39SAndroid Build Coastguard Worker         str2 = str;
108*0e209d39SAndroid Build Coastguard Worker         rbtUnaccent->transliterate(str);
109*0e209d39SAndroid Build Coastguard Worker         printf("Transliterated via RBT unaccent: ");
110*0e209d39SAndroid Build Coastguard Worker         uprintf(escape(str));
111*0e209d39SAndroid Build Coastguard Worker         printf("\n");
112*0e209d39SAndroid Build Coastguard Worker 
113*0e209d39SAndroid Build Coastguard Worker         unaccent->transliterate(str2);
114*0e209d39SAndroid Build Coastguard Worker         printf("Transliterated via normalizer unaccent: ");
115*0e209d39SAndroid Build Coastguard Worker         uprintf(escape(str2));
116*0e209d39SAndroid Build Coastguard Worker         printf("\n\n");
117*0e209d39SAndroid Build Coastguard Worker     }
118*0e209d39SAndroid Build Coastguard Worker 
119*0e209d39SAndroid Build Coastguard Worker     // Clean up
120*0e209d39SAndroid Build Coastguard Worker     delete fmt;
121*0e209d39SAndroid Build Coastguard Worker     delete cal;
122*0e209d39SAndroid Build Coastguard Worker     delete greek_latin;
123*0e209d39SAndroid Build Coastguard Worker     delete unaccent;
124*0e209d39SAndroid Build Coastguard Worker     delete rbtUnaccent;
125*0e209d39SAndroid Build Coastguard Worker 
126*0e209d39SAndroid Build Coastguard Worker     printf("Exiting successfully\n");
127*0e209d39SAndroid Build Coastguard Worker     return 0;
128*0e209d39SAndroid Build Coastguard Worker }
129