1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 // MARKER(update_precomp.py): autogen include statement, do not remove
29 #include "precompiled_i18npool.hxx"
30 #include <com/sun/star/lang/XSingleServiceFactory.hpp>
31 #include <com/sun/star/lang/XMultiServiceFactory.hpp>
32 #include <com/sun/star/registry/XRegistryKey.hpp>
33 
34 #include <cppuhelper/factory.hxx>
35 #include <cppuhelper/weak.hxx>
36 #include <osl/mutex.hxx>
37 
38 #include <localedata.hxx>
39 #include <numberformatcode.hxx>
40 #include <nativenumbersupplier.hxx>
41 #include <defaultnumberingprovider.hxx>
42 #include <servicename.hxx>
43 
44 #define TRANSLITERATION_ALL
45 #include <transliterationImpl.hxx>
46 #include <transliteration_body.hxx>
47 #include <transliteration_caseignore.hxx>
48 #include <transliteration_Ignore.hxx>
49 #include <transliteration_OneToOne.hxx>
50 #include <textToPronounce_zh.hxx>
51 #include <numtotext_cjk.hxx>
52 #include <numtochar.hxx>
53 #include <texttonum.hxx>
54 #include <chartonum.hxx>
55 
56 #include <calendarImpl.hxx>
57 #include <calendar_gregorian.hxx>
58 #include <calendar_hijri.hxx>
59 #include <calendar_jewish.hxx>
60 
61 #define BREAKITERATOR_ALL
62 #include <breakiteratorImpl.hxx>
63 #include <breakiterator_cjk.hxx>
64 #include <breakiterator_th.hxx>
65 #include <breakiterator_unicode.hxx>
66 
67 #include <indexentrysupplier.hxx>
68 #include <indexentrysupplier_asian.hxx>
69 #include <indexentrysupplier_ja_phonetic.hxx>
70 #include <indexentrysupplier_common.hxx>
71 #include <indexentrysupplier_default.hxx>
72 
73 #define CCLASS_ALL
74 #include <characterclassificationImpl.hxx>
75 #include <scripttypedetector.hxx>
76 #include <cclass_unicode.hxx>
77 
78 #define COLLATOR_ALL
79 #include <collatorImpl.hxx>
80 #include <chaptercollator.hxx>
81 #include <collator_unicode.hxx>
82 
83 #include <inputsequencechecker.hxx>
84 #include <inputsequencechecker_th.hxx>
85 #include <inputsequencechecker_hi.hxx>
86 
87 #include <textconversionImpl.hxx>
88 #include <textconversion.hxx>
89 
90 #include <ordinalsuffix.hxx>
91 
92 #define IMPL_CREATEINSTANCE( ImplName ) \
93     ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >   \
94         SAL_CALL ImplName##_CreateInstance(                                 \
95             const ::com::sun::star::uno::Reference<                         \
96                     ::com::sun::star::lang::XMultiServiceFactory >& )       \
97 {                                                                           \
98     return ::com::sun::star::uno::Reference <                               \
99             ::com::sun::star::uno::XInterface >( ( ::cppu::OWeakObject* )   \
100                                     new ImplName );                         \
101 }
102 
103 #define IMPL_CREATEINSTANCE_MSF( ImplName ) \
104     ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >   \
105         SAL_CALL ImplName##_CreateInstance(                                 \
106             const ::com::sun::star::uno::Reference<                         \
107                     ::com::sun::star::lang::XMultiServiceFactory >& rxMSF ) \
108 {                                                                           \
109     return ::com::sun::star::uno::Reference <                               \
110             ::com::sun::star::uno::XInterface >( ( ::cppu::OWeakObject* )   \
111                                     new ImplName( rxMSF ) );                \
112 }
113 
114 typedef ::com::sun::star::uno::Reference<
115         ::com::sun::star::uno::XInterface > (SAL_CALL *FN_CreateInstance)(
116             const ::com::sun::star::uno::Reference<
117                 ::com::sun::star::lang::XMultiServiceFactory >& );
118 
119 #define IMPL_TRANSLITERATION_ITEM( implName ) \
120     {       TRLT_SERVICELNAME_L10N, \
121         TRLT_IMPLNAME_PREFIX  #implName, \
122         &implName##_CreateInstance }
123 
124 // -------------------------------------------------------------------------------------
125 
126 using namespace ::com::sun::star::i18n;
127 
128 IMPL_CREATEINSTANCE_MSF( NumberFormatCodeMapper )
129 IMPL_CREATEINSTANCE( NativeNumberSupplier )
130 IMPL_CREATEINSTANCE( LocaleData )
131 IMPL_CREATEINSTANCE_MSF( DefaultNumberingProvider )
132 IMPL_CREATEINSTANCE_MSF( IndexEntrySupplier )
133 IMPL_CREATEINSTANCE_MSF( IndexEntrySupplier_asian )
134 IMPL_CREATEINSTANCE_MSF( IndexEntrySupplier_ja_phonetic_alphanumeric_first_by_syllable )
135 IMPL_CREATEINSTANCE_MSF( IndexEntrySupplier_ja_phonetic_alphanumeric_first_by_consonant )
136 IMPL_CREATEINSTANCE_MSF( IndexEntrySupplier_ja_phonetic_alphanumeric_last_by_syllable )
137 IMPL_CREATEINSTANCE_MSF( IndexEntrySupplier_ja_phonetic_alphanumeric_last_by_consonant )
138 IMPL_CREATEINSTANCE_MSF( IndexEntrySupplier_Unicode )
139 IMPL_CREATEINSTANCE_MSF( CalendarImpl )
140 IMPL_CREATEINSTANCE( Calendar_gregorian )
141 IMPL_CREATEINSTANCE( Calendar_hanja )
142 IMPL_CREATEINSTANCE( Calendar_gengou )
143 IMPL_CREATEINSTANCE( Calendar_ROC )
144 IMPL_CREATEINSTANCE( Calendar_hijri )
145 IMPL_CREATEINSTANCE( Calendar_jewish )
146 IMPL_CREATEINSTANCE( Calendar_buddhist )
147 IMPL_CREATEINSTANCE_MSF( BreakIteratorImpl )
148 IMPL_CREATEINSTANCE( BreakIterator_Unicode )
149 IMPL_CREATEINSTANCE( BreakIterator_ja )
150 IMPL_CREATEINSTANCE( BreakIterator_zh )
151 IMPL_CREATEINSTANCE( BreakIterator_zh_TW )
152 IMPL_CREATEINSTANCE( BreakIterator_ko )
153 IMPL_CREATEINSTANCE( BreakIterator_th )
154 IMPL_CREATEINSTANCE_MSF( ChapterCollator )
155 IMPL_CREATEINSTANCE_MSF( CollatorImpl )
156 IMPL_CREATEINSTANCE( Collator_Unicode )
157 
158 IMPL_CREATEINSTANCE_MSF( CharacterClassificationImpl )
159 IMPL_CREATEINSTANCE_MSF( cclass_Unicode )
160 IMPL_CREATEINSTANCE_MSF( TransliterationImpl )
161 IMPL_CREATEINSTANCE( ScriptTypeDetector )
162 
163 IMPL_CREATEINSTANCE_MSF( InputSequenceCheckerImpl )
164 IMPL_CREATEINSTANCE( InputSequenceChecker_th )
165 IMPL_CREATEINSTANCE( InputSequenceChecker_hi )
166 
167 IMPL_CREATEINSTANCE_MSF( TextConversionImpl )
168 IMPL_CREATEINSTANCE_MSF( TextConversion_ko )
169 IMPL_CREATEINSTANCE_MSF( TextConversion_zh )
170 
171 IMPL_CREATEINSTANCE( Transliteration_u2l )
172 IMPL_CREATEINSTANCE( Transliteration_l2u )
173 IMPL_CREATEINSTANCE( Transliteration_sentencecase )
174 IMPL_CREATEINSTANCE( Transliteration_titlecase )
175 IMPL_CREATEINSTANCE( Transliteration_togglecase )
176 IMPL_CREATEINSTANCE( Transliteration_caseignore )
177 IMPL_CREATEINSTANCE( hiraganaToKatakana )
178 IMPL_CREATEINSTANCE( katakanaToHiragana )
179 IMPL_CREATEINSTANCE( ignoreKana )
180 IMPL_CREATEINSTANCE( fullwidthToHalfwidth )
181 IMPL_CREATEINSTANCE( halfwidthToFullwidth )
182 IMPL_CREATEINSTANCE( ignoreWidth )
183 
184 IMPL_CREATEINSTANCE( smallToLarge_ja_JP)
185 IMPL_CREATEINSTANCE( largeToSmall_ja_JP)
186 IMPL_CREATEINSTANCE( ignoreTraditionalKanji_ja_JP)
187 IMPL_CREATEINSTANCE( ignoreTraditionalKana_ja_JP)
188 IMPL_CREATEINSTANCE( ignoreMinusSign_ja_JP)
189 IMPL_CREATEINSTANCE( ignoreIterationMark_ja_JP)
190 IMPL_CREATEINSTANCE( ignoreSeparator_ja_JP)
191 IMPL_CREATEINSTANCE( ignoreZiZu_ja_JP)
192 IMPL_CREATEINSTANCE( ignoreBaFa_ja_JP)
193 IMPL_CREATEINSTANCE( ignoreTiJi_ja_JP)
194 IMPL_CREATEINSTANCE( ignoreHyuByu_ja_JP)
195 IMPL_CREATEINSTANCE( ignoreSeZe_ja_JP)
196 IMPL_CREATEINSTANCE( ignoreIandEfollowedByYa_ja_JP)
197 IMPL_CREATEINSTANCE( ignoreKiKuFollowedBySa_ja_JP)
198 IMPL_CREATEINSTANCE( ignoreSize_ja_JP)
199 IMPL_CREATEINSTANCE( ignoreProlongedSoundMark_ja_JP)
200 IMPL_CREATEINSTANCE( ignoreMiddleDot_ja_JP)
201 IMPL_CREATEINSTANCE( ignoreSpace_ja_JP)
202 
203 IMPL_CREATEINSTANCE( TextToChuyin_zh_TW )
204 IMPL_CREATEINSTANCE( TextToPinyin_zh_CN )
205 
206 IMPL_CREATEINSTANCE( NumToCharLower_zh_CN )
207 IMPL_CREATEINSTANCE( NumToCharUpper_zh_CN )
208 IMPL_CREATEINSTANCE( NumToCharLower_zh_TW )
209 IMPL_CREATEINSTANCE( NumToCharUpper_zh_TW )
210 IMPL_CREATEINSTANCE( NumToCharHalfwidth )
211 IMPL_CREATEINSTANCE( NumToCharFullwidth )
212 IMPL_CREATEINSTANCE( NumToCharKanjiShort_ja_JP )
213 IMPL_CREATEINSTANCE( NumToCharKanjiTraditional_ja_JP )
214 IMPL_CREATEINSTANCE( NumToCharHangul_ko )
215 IMPL_CREATEINSTANCE( NumToCharLower_ko )
216 IMPL_CREATEINSTANCE( NumToCharUpper_ko )
217 IMPL_CREATEINSTANCE( NumToCharIndic_ar )
218 IMPL_CREATEINSTANCE( NumToCharEastIndic_ar )
219 IMPL_CREATEINSTANCE( NumToCharIndic_hi )
220 IMPL_CREATEINSTANCE( NumToChar_th )
221 
222 IMPL_CREATEINSTANCE( CharToNumLower_zh_CN )
223 IMPL_CREATEINSTANCE( CharToNumUpper_zh_CN )
224 IMPL_CREATEINSTANCE( CharToNumLower_zh_TW )
225 IMPL_CREATEINSTANCE( CharToNumUpper_zh_TW )
226 IMPL_CREATEINSTANCE( CharToNumFullwidth )
227 IMPL_CREATEINSTANCE( CharToNumKanjiShort_ja_JP )
228 IMPL_CREATEINSTANCE( CharToNumKanjiTraditional_ja_JP )
229 IMPL_CREATEINSTANCE( CharToNumHangul_ko )
230 IMPL_CREATEINSTANCE( CharToNumLower_ko )
231 IMPL_CREATEINSTANCE( CharToNumUpper_ko )
232 IMPL_CREATEINSTANCE( CharToNumIndic_ar )
233 IMPL_CREATEINSTANCE( CharToNumEastIndic_ar )
234 IMPL_CREATEINSTANCE( CharToNumIndic_hi )
235 IMPL_CREATEINSTANCE( CharToNum_th )
236 
237 IMPL_CREATEINSTANCE( NumToTextLower_zh_CN )
238 IMPL_CREATEINSTANCE( NumToTextUpper_zh_CN )
239 IMPL_CREATEINSTANCE( NumToTextLower_zh_TW )
240 IMPL_CREATEINSTANCE( NumToTextUpper_zh_TW )
241 IMPL_CREATEINSTANCE( NumToTextFullwidth_zh_CN )
242 IMPL_CREATEINSTANCE( NumToTextFullwidth_zh_TW )
243 IMPL_CREATEINSTANCE( NumToTextFullwidth_ja_JP )
244 IMPL_CREATEINSTANCE( NumToTextFullwidth_ko )
245 IMPL_CREATEINSTANCE( NumToTextKanjiLongModern_ja_JP )
246 IMPL_CREATEINSTANCE( NumToTextKanjiLongTraditional_ja_JP )
247 IMPL_CREATEINSTANCE( NumToTextKanjiShortModern_ja_JP )
248 IMPL_CREATEINSTANCE( NumToTextKanjiShortTraditional_ja_JP )
249 IMPL_CREATEINSTANCE( NumToTextFormalHangul_ko )
250 IMPL_CREATEINSTANCE( NumToTextFormalLower_ko )
251 IMPL_CREATEINSTANCE( NumToTextFormalUpper_ko )
252 IMPL_CREATEINSTANCE( NumToTextInformalHangul_ko )
253 IMPL_CREATEINSTANCE( NumToTextInformalUpper_ko )
254 IMPL_CREATEINSTANCE( NumToTextInformalLower_ko )
255 
256 IMPL_CREATEINSTANCE( TextToNumLower_zh_CN )
257 IMPL_CREATEINSTANCE( TextToNumUpper_zh_CN )
258 IMPL_CREATEINSTANCE( TextToNumLower_zh_TW )
259 IMPL_CREATEINSTANCE( TextToNumUpper_zh_TW )
260 IMPL_CREATEINSTANCE( TextToNumKanjiLongModern_ja_JP )
261 IMPL_CREATEINSTANCE( TextToNumKanjiLongTraditional_ja_JP )
262 IMPL_CREATEINSTANCE( TextToNumFormalHangul_ko )
263 IMPL_CREATEINSTANCE( TextToNumFormalLower_ko )
264 IMPL_CREATEINSTANCE( TextToNumFormalUpper_ko )
265 IMPL_CREATEINSTANCE( TextToNumInformalHangul_ko )
266 IMPL_CREATEINSTANCE( TextToNumInformalUpper_ko )
267 IMPL_CREATEINSTANCE( TextToNumInformalLower_ko )
268 
269 IMPL_CREATEINSTANCE( NumToTextDate_zh )
270 IMPL_CREATEINSTANCE( NumToTextAIUFullWidth_ja_JP )
271 IMPL_CREATEINSTANCE( NumToTextAIUHalfWidth_ja_JP )
272 IMPL_CREATEINSTANCE( NumToTextIROHAFullWidth_ja_JP )
273 IMPL_CREATEINSTANCE( NumToTextIROHAHalfWidth_ja_JP )
274 IMPL_CREATEINSTANCE( NumToTextCircledNumber )
275 IMPL_CREATEINSTANCE( NumToTextHangulJamo_ko )
276 IMPL_CREATEINSTANCE( NumToTextHangulSyllable_ko )
277 IMPL_CREATEINSTANCE( NumToTextHangulCircledJamo_ko )
278 IMPL_CREATEINSTANCE( NumToTextHangulCircledSyllable_ko )
279 IMPL_CREATEINSTANCE( NumToTextTianGan_zh )
280 IMPL_CREATEINSTANCE( NumToTextDiZi_zh )
281 
282 IMPL_CREATEINSTANCE( fullwidthKatakanaToHalfwidthKatakana )
283 IMPL_CREATEINSTANCE( halfwidthKatakanaToFullwidthKatakana )
284 IMPL_CREATEINSTANCE( fullwidthToHalfwidthLikeASC )
285 IMPL_CREATEINSTANCE( halfwidthToFullwidthLikeJIS )
286 
287 IMPL_CREATEINSTANCE_MSF( OrdinalSuffix )
288 
289 static const struct InstancesArray {
290         const sal_Char* pServiceNm;
291         const sal_Char* pImplementationNm;
292         FN_CreateInstance pFn;
293 } aInstances[] = {
294     {   "com.sun.star.i18n.LocaleData",
295         "com.sun.star.i18n.LocaleData",
296         & LocaleData_CreateInstance },
297     {   "com.sun.star.i18n.NumberFormatMapper",
298         "com.sun.star.i18n.NumberFormatCodeMapper",
299         & NumberFormatCodeMapper_CreateInstance },
300     {   "com.sun.star.i18n.NativeNumberSupplier",
301         "com.sun.star.i18n.NativeNumberSupplier",
302         & NativeNumberSupplier_CreateInstance },
303     {   "com.sun.star.text.DefaultNumberingProvider",
304         "com.sun.star.text.DefaultNumberingProvider",
305         &DefaultNumberingProvider_CreateInstance },
306     {   "com.sun.star.i18n.IndexEntrySupplier",
307         "com.sun.star.i18n.IndexEntrySupplier",
308         &IndexEntrySupplier_CreateInstance },
309     {   "com.sun.star.i18n.IndexEntrySupplier_asian",
310         "com.sun.star.i18n.IndexEntrySupplier_asian",
311         &IndexEntrySupplier_asian_CreateInstance },
312     {   "com.sun.star.i18n.IndexEntrySupplier_ja_phonetic (alphanumeric first)",
313         "com.sun.star.i18n.IndexEntrySupplier_ja_phonetic (alphanumeric first)",
314         &IndexEntrySupplier_ja_phonetic_alphanumeric_first_by_syllable_CreateInstance },
315     {   "com.sun.star.i18n.IndexEntrySupplier_ja_phonetic (alphanumeric last)",
316         "com.sun.star.i18n.IndexEntrySupplier_ja_phonetic (alphanumeric last)",
317         &IndexEntrySupplier_ja_phonetic_alphanumeric_last_by_syllable_CreateInstance },
318     {   "com.sun.star.i18n.IndexEntrySupplier_ja_phonetic (alphanumeric first) (grouped by syllable)",
319         "com.sun.star.i18n.IndexEntrySupplier_ja_phonetic (alphanumeric first) (grouped by syllable)",
320         &IndexEntrySupplier_ja_phonetic_alphanumeric_first_by_syllable_CreateInstance },
321     {   "com.sun.star.i18n.IndexEntrySupplier_ja_phonetic (alphanumeric first) (grouped by consonant)",
322         "com.sun.star.i18n.IndexEntrySupplier_ja_phonetic (alphanumeric first) (grouped by consonant)",
323         &IndexEntrySupplier_ja_phonetic_alphanumeric_first_by_consonant_CreateInstance },
324     {   "com.sun.star.i18n.IndexEntrySupplier_ja_phonetic (alphanumeric last) (grouped by syllable)",
325         "com.sun.star.i18n.IndexEntrySupplier_ja_phonetic (alphanumeric last) (grouped by syllable)",
326         &IndexEntrySupplier_ja_phonetic_alphanumeric_last_by_syllable_CreateInstance },
327     {   "com.sun.star.i18n.IndexEntrySupplier_ja_phonetic (alphanumeric last) (grouped by consonant)",
328         "com.sun.star.i18n.IndexEntrySupplier_ja_phonetic (alphanumeric last) (grouped by consonant)",
329         &IndexEntrySupplier_ja_phonetic_alphanumeric_last_by_consonant_CreateInstance },
330     {       "com.sun.star.i18n.IndexEntrySupplier_Unicode",
331         "com.sun.star.i18n.IndexEntrySupplier_Unicode",
332         &IndexEntrySupplier_Unicode_CreateInstance },
333     {   "com.sun.star.i18n.LocaleCalendar",
334         "com.sun.star.i18n.CalendarImpl",
335         &CalendarImpl_CreateInstance },
336     {   "com.sun.star.i18n.Calendar_gregorian",
337         "com.sun.star.i18n.Calendar_gregorian",
338         &Calendar_gregorian_CreateInstance },
339     {   "com.sun.star.i18n.Calendar_gengou",
340         "com.sun.star.i18n.Calendar_gengou",
341         &Calendar_gengou_CreateInstance },
342     {   "com.sun.star.i18n.Calendar_ROC",
343         "com.sun.star.i18n.Calendar_ROC",
344         &Calendar_ROC_CreateInstance },
345     {   "com.sun.star.i18n.Calendar_hanja_yoil",
346         "com.sun.star.i18n.Calendar_hanja_yoil",
347         &Calendar_hanja_CreateInstance },
348     {   "com.sun.star.i18n.Calendar_hanja",
349         "com.sun.star.i18n.Calendar_hanja",
350         &Calendar_hanja_CreateInstance },
351     {   "com.sun.star.i18n.Calendar_hijri",
352         "com.sun.star.i18n.Calendar_hijri",
353         &Calendar_hijri_CreateInstance },
354     {   "com.sun.star.i18n.Calendar_jewish",
355         "com.sun.star.i18n.Calendar_jewish",
356         &Calendar_jewish_CreateInstance },
357     {   "com.sun.star.i18n.Calendar_buddhist",
358         "com.sun.star.i18n.Calendar_buddhist",
359         &Calendar_buddhist_CreateInstance },
360     {   "com.sun.star.i18n.BreakIterator",
361         "com.sun.star.i18n.BreakIterator",
362         &BreakIteratorImpl_CreateInstance },
363     {   "com.sun.star.i18n.BreakIterator_Unicode",
364         "com.sun.star.i18n.BreakIterator_Unicode",
365         &BreakIterator_Unicode_CreateInstance },
366     {   "com.sun.star.i18n.BreakIterator_ja",
367         "com.sun.star.i18n.BreakIterator_ja",
368         &BreakIterator_ja_CreateInstance },
369     {   "com.sun.star.i18n.BreakIterator_zh",
370         "com.sun.star.i18n.BreakIterator_zh",
371         &BreakIterator_zh_CreateInstance },
372     {   "com.sun.star.i18n.BreakIterator_zh_TW",
373         "com.sun.star.i18n.BreakIterator_zh_TW",
374         &BreakIterator_zh_TW_CreateInstance },
375     {   "com.sun.star.i18n.BreakIterator_ko",
376         "com.sun.star.i18n.BreakIterator_ko",
377         &BreakIterator_ko_CreateInstance },
378     {   "com.sun.star.i18n.BreakIterator_th",
379         "com.sun.star.i18n.BreakIterator_th",
380         &BreakIterator_th_CreateInstance },
381     {   "com.sun.star.i18n.Collator",
382         "com.sun.star.i18n.Collator",
383         &CollatorImpl_CreateInstance },
384     {   "com.sun.star.i18n.ChapterCollator",
385         "com.sun.star.i18n.ChapterCollator",
386         &ChapterCollator_CreateInstance },
387     {   "com.sun.star.i18n.Collator_Unicode",
388         "com.sun.star.i18n.Collator_Unicode",
389         &Collator_Unicode_CreateInstance },
390     {   "com.sun.star.i18n.ScriptTypeDetector",
391         "com.sun.star.i18n.ScriptTypeDetector",
392         &ScriptTypeDetector_CreateInstance },
393     {   "com.sun.star.i18n.CharacterClassification",
394         "com.sun.star.i18n.CharacterClassification",
395         &CharacterClassificationImpl_CreateInstance },
396     {   "com.sun.star.i18n.CharacterClassification_Unicode",
397         "com.sun.star.i18n.CharacterClassification_Unicode",
398         &cclass_Unicode_CreateInstance },
399     {   "com.sun.star.i18n.InputSequenceChecker",
400         "com.sun.star.i18n.InputSequenceChecker",
401         &InputSequenceCheckerImpl_CreateInstance },
402     {   "com.sun.star.i18n.InputSequenceChecker_th",
403         "com.sun.star.i18n.InputSequenceChecker_th",
404         &InputSequenceChecker_th_CreateInstance },
405     {   "com.sun.star.i18n.InputSequenceChecker_hi",
406         "com.sun.star.i18n.InputSequenceChecker_hi",
407         &InputSequenceChecker_hi_CreateInstance },
408     {   "com.sun.star.i18n.TextConversion",
409         "com.sun.star.i18n.TextConversion",
410         &TextConversionImpl_CreateInstance },
411     {   "com.sun.star.i18n.TextConversion_ko",
412         "com.sun.star.i18n.TextConversion_ko",
413         &TextConversion_ko_CreateInstance },
414     {   "com.sun.star.i18n.TextConversion_zh",
415         "com.sun.star.i18n.TextConversion_zh",
416         &TextConversion_zh_CreateInstance },
417     {   TRLT_SERVICELNAME,
418         TRLT_IMPLNAME ,
419         &TransliterationImpl_CreateInstance },
420     {   TRLT_SERVICELNAME_L10N,
421         TRLT_IMPLNAME_PREFIX  "UPPERCASE_LOWERCASE",
422         &Transliteration_u2l_CreateInstance },
423     {   TRLT_SERVICELNAME_L10N,
424         TRLT_IMPLNAME_PREFIX  "LOWERCASE_UPPERCASE",
425         &Transliteration_l2u_CreateInstance },
426     {   TRLT_SERVICELNAME_L10N,
427         TRLT_IMPLNAME_PREFIX  "SENTENCE_CASE",
428         &Transliteration_sentencecase_CreateInstance },
429     {   TRLT_SERVICELNAME_L10N,
430         TRLT_IMPLNAME_PREFIX  "TITLE_CASE",
431         &Transliteration_titlecase_CreateInstance },
432     {   TRLT_SERVICELNAME_L10N,
433         TRLT_IMPLNAME_PREFIX  "TOGGLE_CASE",
434         &Transliteration_togglecase_CreateInstance },
435     {   TRLT_SERVICELNAME_L10N,
436         TRLT_IMPLNAME_PREFIX  "IGNORE_CASE",
437         &Transliteration_caseignore_CreateInstance },
438     {   TRLT_SERVICELNAME_L10N,
439         TRLT_IMPLNAME_PREFIX  "HIRAGANA_KATAKANA",
440         &hiraganaToKatakana_CreateInstance },
441     {   TRLT_SERVICELNAME_L10N,
442         TRLT_IMPLNAME_PREFIX  "KATAKANA_HIRAGANA",
443         &katakanaToHiragana_CreateInstance },
444     {   TRLT_SERVICELNAME_L10N,
445         TRLT_IMPLNAME_PREFIX  "IGNORE_KANA",
446         &ignoreKana_CreateInstance },
447     {   TRLT_SERVICELNAME_L10N,
448         TRLT_IMPLNAME_PREFIX  "FULLWIDTH_HALFWIDTH",
449         &fullwidthToHalfwidth_CreateInstance },
450     {   TRLT_SERVICELNAME_L10N,
451         TRLT_IMPLNAME_PREFIX  "HALFWIDTH_FULLWIDTH",
452         &halfwidthToFullwidth_CreateInstance },
453     {   TRLT_SERVICELNAME_L10N,
454         TRLT_IMPLNAME_PREFIX  "IGNORE_WIDTH",
455         &ignoreWidth_CreateInstance },
456     IMPL_TRANSLITERATION_ITEM (smallToLarge_ja_JP),
457     IMPL_TRANSLITERATION_ITEM (largeToSmall_ja_JP),
458     IMPL_TRANSLITERATION_ITEM (ignoreTraditionalKanji_ja_JP),
459     IMPL_TRANSLITERATION_ITEM (ignoreTraditionalKana_ja_JP),
460     IMPL_TRANSLITERATION_ITEM (ignoreKana),
461     IMPL_TRANSLITERATION_ITEM (ignoreMinusSign_ja_JP),
462     IMPL_TRANSLITERATION_ITEM (ignoreIterationMark_ja_JP),
463     IMPL_TRANSLITERATION_ITEM (ignoreSeparator_ja_JP),
464     IMPL_TRANSLITERATION_ITEM (ignoreZiZu_ja_JP),
465     IMPL_TRANSLITERATION_ITEM (ignoreBaFa_ja_JP),
466     IMPL_TRANSLITERATION_ITEM (ignoreTiJi_ja_JP),
467     IMPL_TRANSLITERATION_ITEM (ignoreHyuByu_ja_JP),
468     IMPL_TRANSLITERATION_ITEM (ignoreSeZe_ja_JP),
469     IMPL_TRANSLITERATION_ITEM (ignoreIandEfollowedByYa_ja_JP),
470     IMPL_TRANSLITERATION_ITEM (ignoreKiKuFollowedBySa_ja_JP),
471     IMPL_TRANSLITERATION_ITEM (ignoreSize_ja_JP),
472     IMPL_TRANSLITERATION_ITEM (ignoreProlongedSoundMark_ja_JP),
473     IMPL_TRANSLITERATION_ITEM (ignoreMiddleDot_ja_JP),
474     IMPL_TRANSLITERATION_ITEM (ignoreSpace_ja_JP),
475     IMPL_TRANSLITERATION_ITEM (TextToPinyin_zh_CN),
476     IMPL_TRANSLITERATION_ITEM (TextToChuyin_zh_TW),
477 
478     IMPL_TRANSLITERATION_ITEM (NumToCharUpper_zh_CN),
479     IMPL_TRANSLITERATION_ITEM (NumToCharLower_zh_CN),
480     IMPL_TRANSLITERATION_ITEM (NumToCharUpper_zh_TW),
481     IMPL_TRANSLITERATION_ITEM (NumToCharLower_zh_TW),
482     IMPL_TRANSLITERATION_ITEM (NumToCharHalfwidth),
483     IMPL_TRANSLITERATION_ITEM (NumToCharFullwidth),
484     IMPL_TRANSLITERATION_ITEM (NumToCharKanjiShort_ja_JP),
485     IMPL_TRANSLITERATION_ITEM (NumToCharKanjiTraditional_ja_JP),
486     IMPL_TRANSLITERATION_ITEM (NumToCharLower_ko),
487     IMPL_TRANSLITERATION_ITEM (NumToCharUpper_ko),
488     IMPL_TRANSLITERATION_ITEM (NumToCharHangul_ko),
489     IMPL_TRANSLITERATION_ITEM (NumToCharIndic_ar),
490     IMPL_TRANSLITERATION_ITEM (NumToCharEastIndic_ar),
491     IMPL_TRANSLITERATION_ITEM (NumToCharIndic_hi),
492     IMPL_TRANSLITERATION_ITEM (NumToChar_th),
493 
494     IMPL_TRANSLITERATION_ITEM (CharToNumUpper_zh_CN),
495     IMPL_TRANSLITERATION_ITEM (CharToNumLower_zh_CN),
496     IMPL_TRANSLITERATION_ITEM (CharToNumUpper_zh_TW),
497     IMPL_TRANSLITERATION_ITEM (CharToNumLower_zh_TW),
498     IMPL_TRANSLITERATION_ITEM (CharToNumFullwidth),
499     IMPL_TRANSLITERATION_ITEM (CharToNumKanjiShort_ja_JP),
500     IMPL_TRANSLITERATION_ITEM (CharToNumKanjiTraditional_ja_JP),
501     IMPL_TRANSLITERATION_ITEM (CharToNumLower_ko),
502     IMPL_TRANSLITERATION_ITEM (CharToNumUpper_ko),
503     IMPL_TRANSLITERATION_ITEM (CharToNumHangul_ko),
504     IMPL_TRANSLITERATION_ITEM (CharToNumIndic_ar),
505     IMPL_TRANSLITERATION_ITEM (CharToNumEastIndic_ar),
506     IMPL_TRANSLITERATION_ITEM (CharToNumIndic_hi),
507     IMPL_TRANSLITERATION_ITEM (CharToNum_th),
508 
509     IMPL_TRANSLITERATION_ITEM (NumToTextUpper_zh_CN),
510     IMPL_TRANSLITERATION_ITEM (NumToTextLower_zh_CN),
511     IMPL_TRANSLITERATION_ITEM (NumToTextUpper_zh_TW),
512     IMPL_TRANSLITERATION_ITEM (NumToTextLower_zh_TW),
513     IMPL_TRANSLITERATION_ITEM (NumToTextFullwidth_zh_CN),
514     IMPL_TRANSLITERATION_ITEM (NumToTextFullwidth_zh_TW),
515     IMPL_TRANSLITERATION_ITEM (NumToTextFullwidth_ja_JP),
516     IMPL_TRANSLITERATION_ITEM (NumToTextFullwidth_ko),
517     IMPL_TRANSLITERATION_ITEM (NumToTextKanjiLongModern_ja_JP),
518     IMPL_TRANSLITERATION_ITEM (NumToTextKanjiLongTraditional_ja_JP),
519     IMPL_TRANSLITERATION_ITEM (NumToTextKanjiShortModern_ja_JP),
520     IMPL_TRANSLITERATION_ITEM (NumToTextKanjiShortTraditional_ja_JP),
521     IMPL_TRANSLITERATION_ITEM (NumToTextInformalHangul_ko),
522     IMPL_TRANSLITERATION_ITEM (NumToTextInformalLower_ko),
523     IMPL_TRANSLITERATION_ITEM (NumToTextInformalUpper_ko),
524     IMPL_TRANSLITERATION_ITEM (NumToTextFormalHangul_ko),
525     IMPL_TRANSLITERATION_ITEM (NumToTextFormalLower_ko),
526     IMPL_TRANSLITERATION_ITEM (NumToTextFormalUpper_ko),
527 
528     IMPL_TRANSLITERATION_ITEM (TextToNumUpper_zh_CN),
529     IMPL_TRANSLITERATION_ITEM (TextToNumLower_zh_CN),
530     IMPL_TRANSLITERATION_ITEM (TextToNumUpper_zh_TW),
531     IMPL_TRANSLITERATION_ITEM (TextToNumLower_zh_TW),
532     IMPL_TRANSLITERATION_ITEM (TextToNumKanjiLongModern_ja_JP),
533     IMPL_TRANSLITERATION_ITEM (TextToNumKanjiLongTraditional_ja_JP),
534     IMPL_TRANSLITERATION_ITEM (TextToNumInformalHangul_ko),
535     IMPL_TRANSLITERATION_ITEM (TextToNumInformalLower_ko),
536     IMPL_TRANSLITERATION_ITEM (TextToNumInformalUpper_ko),
537     IMPL_TRANSLITERATION_ITEM (TextToNumFormalHangul_ko),
538     IMPL_TRANSLITERATION_ITEM (TextToNumFormalLower_ko),
539     IMPL_TRANSLITERATION_ITEM (TextToNumFormalUpper_ko),
540 
541     IMPL_TRANSLITERATION_ITEM (NumToTextDate_zh),
542     IMPL_TRANSLITERATION_ITEM (NumToTextAIUFullWidth_ja_JP),
543     IMPL_TRANSLITERATION_ITEM (NumToTextAIUHalfWidth_ja_JP),
544     IMPL_TRANSLITERATION_ITEM (NumToTextIROHAFullWidth_ja_JP),
545     IMPL_TRANSLITERATION_ITEM (NumToTextIROHAHalfWidth_ja_JP),
546     IMPL_TRANSLITERATION_ITEM (NumToTextCircledNumber),
547     IMPL_TRANSLITERATION_ITEM (NumToTextHangulJamo_ko),
548     IMPL_TRANSLITERATION_ITEM (NumToTextHangulSyllable_ko),
549     IMPL_TRANSLITERATION_ITEM (NumToTextHangulCircledJamo_ko),
550     IMPL_TRANSLITERATION_ITEM (NumToTextHangulCircledSyllable_ko),
551     IMPL_TRANSLITERATION_ITEM (NumToTextTianGan_zh),
552     IMPL_TRANSLITERATION_ITEM (NumToTextDiZi_zh),
553 
554     {   "com.sun.star.i18n.OrdinalSuffix",
555         "com.sun.star.i18n.OrdinalSuffix",
556         & OrdinalSuffix_CreateInstance },
557 
558     {   TRLT_SERVICELNAME_L10N,
559         TRLT_IMPLNAME_PREFIX  "FULLWIDTHKATAKANA_HALFWIDTHKATAKANA",
560         &fullwidthKatakanaToHalfwidthKatakana_CreateInstance },
561     {   TRLT_SERVICELNAME_L10N,
562         TRLT_IMPLNAME_PREFIX  "HALFWIDTHKATAKANA_FULLWIDTHKATAKANA",
563         &halfwidthKatakanaToFullwidthKatakana_CreateInstance },
564     {   TRLT_SERVICELNAME_L10N,
565         TRLT_IMPLNAME_PREFIX  "FULLWIDTH_HALFWIDTH_LIKE_ASC",
566         &fullwidthToHalfwidthLikeASC_CreateInstance },
567     {   TRLT_SERVICELNAME_L10N,
568         TRLT_IMPLNAME_PREFIX  "HALFWIDTH_FULLWIDTH_LIKE_JIS",
569         &halfwidthToFullwidthLikeJIS_CreateInstance },
570 // add here new services !!
571     { 0, 0, 0 }
572 };
573 
574 
575 extern "C"
576 {
577 
578 void SAL_CALL component_getImplementationEnvironment( const sal_Char** ppEnvTypeName, uno_Environment** /*ppEnv*/ )
579 {
580     *ppEnvTypeName = CPPU_CURRENT_LANGUAGE_BINDING_NAME;
581 }
582 
583 void* SAL_CALL component_getFactory( const sal_Char* sImplementationName, void* _pServiceManager, void* /*_pRegistryKey*/ )
584 {
585     void* pRet = NULL;
586 
587     ::com::sun::star::lang::XMultiServiceFactory* pServiceManager =
588         reinterpret_cast< ::com::sun::star::lang::XMultiServiceFactory* >
589             ( _pServiceManager );
590     ::com::sun::star::uno::Reference<
591             ::com::sun::star::lang::XSingleServiceFactory > xFactory;
592 
593     for( const InstancesArray* pArr = aInstances; pArr->pServiceNm; ++pArr )
594     {
595         if( 0 == rtl_str_compare( sImplementationName, pArr->pImplementationNm ) )
596         {
597             ::com::sun::star::uno::Sequence< ::rtl::OUString > aServiceNames(1);
598             aServiceNames.getArray()[0] =
599                 ::rtl::OUString::createFromAscii( pArr->pServiceNm );
600             xFactory = ::cppu::createSingleFactory(
601                     pServiceManager, aServiceNames.getArray()[0],
602                     *pArr->pFn, aServiceNames );
603             break;
604         }
605     }
606 
607     if ( xFactory.is() )
608     {
609         xFactory->acquire();
610         pRet = xFactory.get();
611     }
612 
613     return pRet;
614 }
615 
616 }   // "C"
617