# *   Copyright (C) 1998-2011, International Business Machines
# *   Corporation and others.  All Rights Reserved.
LANG_CLDR_VERSION = 2.0
# 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 'reslocal.mk' file in this same directory.
# Then, you can have your local changes remain even if you upgrade or
# reconfigure ICU.
#
# Example 'reslocal.mk' files:
#
#  * To add an additional locale to the list:
#    _____________________________________________________
#    |  LANG_SOURCE_LOCAL =   myLocale.txt ...
#
#  * To REPLACE the default list and only build with a few
#    locales:
#    _____________________________________________________
#    |  LANG_SOURCE = ar.txt ar_AE.txt en.txt de.txt zh.txt
#
#
# Generated by LDML2ICUConverter, from LDML source files.

# Aliases without a corresponding xx.xml file (see icu-config.xml & build.xml)
LANG_SYNTHETIC_ALIAS = en_RH.txt en_ZW.txt he_IL.txt id_ID.txt\
 in_ID.txt iw_IL.txt ja_JP.txt ja_JP_TRADITIONAL.txt nb_NO.txt\
 nn_NO.txt no_NO.txt no_NO_NY.txt th_TH.txt th_TH_TRADITIONAL.txt


# All aliases (to not be included under 'installed'), but not including root.
LANG_ALIAS_SOURCE = $(LANG_SYNTHETIC_ALIAS) az_AZ.txt ha_GH.txt ha_NE.txt ha_NG.txt\
 in.txt iw.txt kk_KZ.txt mo.txt no.txt\
 pa_IN.txt pa_PK.txt sh.txt sh_BA.txt sh_CS.txt\
 sh_YU.txt shi_MA.txt sr_BA.txt sr_CS.txt sr_Cyrl_CS.txt\
 sr_Cyrl_YU.txt sr_Latn_CS.txt sr_Latn_YU.txt sr_ME.txt sr_RS.txt\
 sr_YU.txt tl.txt tl_PH.txt tzm_MA.txt uz_AF.txt\
 uz_UZ.txt vai_LR.txt zh_CN.txt zh_HK.txt zh_MO.txt\
 zh_SG.txt zh_TW.txt


# Ordinary resources
LANG_SOURCE = af.txt agq.txt ak.txt am.txt\
 ar.txt as.txt asa.txt az.txt az_Cyrl.txt\
 az_Latn.txt az_Latn_AZ.txt bas.txt be.txt bem.txt\
 bez.txt bg.txt bm.txt bn.txt bn_IN.txt\
 bo.txt br.txt brx.txt bs.txt ca.txt\
 cgg.txt chr.txt cs.txt cy.txt da.txt\
 dav.txt de.txt de_CH.txt dje.txt dua.txt\
 dyo.txt ebu.txt ee.txt el.txt en.txt\
 eo.txt es.txt es_419.txt es_CL.txt et.txt\
 eu.txt ewo.txt fa.txt fa_AF.txt ff.txt\
 fi.txt fil.txt fil_PH.txt fo.txt fr.txt\
 fr_CA.txt ga.txt gl.txt gsw.txt gu.txt\
 guz.txt gv.txt ha.txt ha_Latn.txt ha_Latn_GH.txt\
 ha_Latn_NE.txt ha_Latn_NG.txt haw.txt he.txt hi.txt\
 hr.txt hu.txt hy.txt id.txt ig.txt\
 ii.txt is.txt it.txt ja.txt jmc.txt\
 ka.txt kab.txt kam.txt kde.txt kea.txt\
 khq.txt ki.txt kk.txt kk_Cyrl.txt kk_Cyrl_KZ.txt\
 kl.txt kln.txt km.txt kn.txt ko.txt\
 kok.txt ksb.txt ksf.txt kw.txt lag.txt\
 lg.txt ln.txt lt.txt lu.txt luo.txt\
 luy.txt lv.txt mas.txt mer.txt mfe.txt\
 mg.txt mgh.txt mk.txt ml.txt mr.txt\
 ms.txt mt.txt mua.txt my.txt naq.txt\
 nb.txt nd.txt ne.txt nl.txt nl_BE.txt\
 nmg.txt nn.txt nus.txt nyn.txt om.txt\
 or.txt pa.txt pa_Arab.txt pa_Arab_PK.txt pa_Guru.txt\
 pa_Guru_IN.txt pl.txt ps.txt pt.txt pt_PT.txt\
 rm.txt rn.txt ro.txt ro_MD.txt rof.txt\
 ru.txt ru_UA.txt rw.txt rwk.txt saq.txt\
 sbp.txt seh.txt ses.txt sg.txt shi.txt\
 shi_Latn.txt shi_Latn_MA.txt shi_Tfng.txt si.txt sk.txt\
 sl.txt sn.txt so.txt sq.txt sr.txt\
 sr_Cyrl.txt sr_Cyrl_BA.txt sr_Cyrl_RS.txt sr_Latn.txt sr_Latn_BA.txt\
 sr_Latn_ME.txt sr_Latn_RS.txt sv.txt sv_FI.txt sw.txt\
 swc.txt ta.txt te.txt teo.txt th.txt\
 ti.txt to.txt tr.txt twq.txt tzm.txt\
 tzm_Latn.txt tzm_Latn_MA.txt uk.txt ur.txt uz.txt\
 uz_Arab.txt uz_Arab_AF.txt uz_Cyrl.txt uz_Cyrl_UZ.txt uz_Latn.txt\
 vai.txt vai_Latn.txt vai_Vaii.txt vai_Vaii_LR.txt vi.txt\
 vun.txt xog.txt yav.txt yo.txt zh.txt\
 zh_Hans.txt zh_Hans_CN.txt zh_Hans_HK.txt zh_Hans_MO.txt zh_Hans_SG.txt\
 zh_Hant.txt zh_Hant_HK.txt zh_Hant_MO.txt zh_Hant_TW.txt zu.txt

