# *   Copyright (C) 1998-2007, International Business Machines
# *   Corporation and others.  All Rights Reserved.
COLLATION_CLDR_VERSION = 1.5
# A list of txt's to build
# Note: 
#
#   If you are thinking of modifying this file, READ THIS. 
#
# Instead of changing this file [unless you want to check it back in],
# you should consider creating a 'collocal.mk' file in this same directory.
# Then, you can have your local changes remain even if you upgrade or
# reconfigure ICU.
#
# Example 'collocal.mk' files:
#
#  * To add an additional locale to the list: 
#    _____________________________________________________
#    |  COLLATION_SOURCE_LOCAL =   myLocale.txt ...
#
#  * To REPLACE the default list and only build with a few
#     locale:
#    _____________________________________________________
#    |  COLLATION_SOURCE = ar.txt ar_AE.txt en.txt de.txt zh.txt
#
#
# Generated by LDML2ICUConverter, from LDML source files. 

# Aliases which do not have a corresponding xx.xml file (see icu-config.xml & build.xml)
COLLATION_SYNTHETIC_ALIAS = de_.txt de__PHONEBOOK.txt es_.txt es__TRADITIONAL.txt\
 hi_.txt hi__DIRECT.txt in.txt in_ID.txt iw.txt\
 iw_IL.txt no.txt no_NO.txt sh.txt sh_BA.txt\
 sh_YU.txt sr_BA.txt sr_ME.txt sr_RS.txt zh_.txt\
 zh_CN.txt zh_HK.txt zh_MO.txt zh_SG.txt zh_TW.txt\
 zh_TW_STROKE.txt zh__PINYIN.txt


# All aliases (to not be included under 'installed'), but not including root.
COLLATION_ALIAS_SOURCE = $(COLLATION_SYNTHETIC_ALIAS)


# Empty locales, used for validSubLocale fallback.
COLLATION_EMPTY_SOURCE = ar_AE.txt ar_BH.txt ar_DZ.txt ar_EG.txt\
 ar_IQ.txt ar_JO.txt ar_KW.txt ar_LB.txt ar_LY.txt\
 ar_MA.txt ar_OM.txt ar_QA.txt ar_SA.txt ar_SD.txt\
 ar_SY.txt ar_TN.txt ar_YE.txt as_IN.txt be_BY.txt\
 bg_BG.txt ca_ES.txt cs_CZ.txt da_DK.txt de_AT.txt\
 de_BE.txt de_CH.txt de_DE.txt de_LU.txt el_GR.txt\
 en_AU.txt en_BW.txt en_CA.txt en_GB.txt en_HK.txt\
 en_IE.txt en_IN.txt en_MT.txt en_NZ.txt en_PH.txt\
 en_SG.txt en_US.txt en_US_POSIX.txt en_VI.txt en_ZA.txt\
 en_ZW.txt es_AR.txt es_BO.txt es_CL.txt es_CO.txt\
 es_CR.txt es_DO.txt es_EC.txt es_ES.txt es_GT.txt\
 es_HN.txt es_MX.txt es_NI.txt es_PA.txt es_PE.txt\
 es_PR.txt es_PY.txt es_SV.txt es_US.txt es_UY.txt\
 es_VE.txt et_EE.txt fa_IR.txt fi_FI.txt fo_FO.txt\
 fr_BE.txt fr_CA.txt fr_CH.txt fr_FR.txt fr_LU.txt\
 ga.txt ga_IE.txt gu_IN.txt he_IL.txt hi_IN.txt\
 hr_HR.txt hu_HU.txt id.txt id_ID.txt is_IS.txt\
 it_CH.txt it_IT.txt ja_JP.txt kk_KZ.txt kl_GL.txt\
 kn_IN.txt ko_KR.txt lt_LT.txt lv_LV.txt mk_MK.txt\
 mr_IN.txt ms.txt ms_BN.txt ms_MY.txt mt_MT.txt\
 nb_NO.txt nl.txt nl_BE.txt nl_NL.txt nn_NO.txt\
 om_ET.txt om_KE.txt pa_IN.txt pl_PL.txt ps_AF.txt\
 pt.txt pt_BR.txt pt_PT.txt ro_RO.txt ru_RU.txt\
 ru_UA.txt sk_SK.txt sl_SI.txt sq_AL.txt sr_Cyrl.txt\
 sr_Cyrl_BA.txt sr_Cyrl_ME.txt sr_Cyrl_RS.txt sr_Latn_BA.txt sr_Latn_ME.txt\
 sr_Latn_RS.txt sv_FI.txt sv_SE.txt ta_IN.txt te_IN.txt\
 th_TH.txt tr_TR.txt uk_UA.txt vi_VN.txt zh_Hans.txt\
 zh_Hans_CN.txt zh_Hans_SG.txt zh_Hant_HK.txt zh_Hant_MO.txt zh_Hant_TW.txt


# Ordinary resources
COLLATION_SOURCE = $(COLLATION_EMPTY_SOURCE) ar.txt as.txt be.txt bg.txt\
 bn.txt ca.txt cs.txt cy.txt da.txt\
 de.txt el.txt en.txt en_BE.txt eo.txt\
 es.txt et.txt fa.txt fa_AF.txt fi.txt\
 fo.txt fr.txt gu.txt haw.txt he.txt\
 hi.txt hr.txt hu.txt is.txt it.txt\
 ja.txt kk.txt kl.txt km.txt kn.txt\
 ko.txt kok.txt lt.txt lv.txt mk.txt\
 ml.txt mr.txt mt.txt nb.txt nn.txt\
 om.txt or.txt pa.txt pl.txt ps.txt\
 ro.txt ru.txt sk.txt sl.txt sq.txt\
 sr.txt sr_Latn.txt sv.txt ta.txt te.txt\
 th.txt tr.txt uk.txt vi.txt zh.txt\
 zh_Hant.txt

