# The contents of this file are subject to the Mozilla Public
# License Version 1.1 (the "License"); you may not use this file
# except in compliance with the License. You may obtain a copy of
# the License at http://www.mozilla.org/MPL/
# 
# Software distributed under the License is distributed on an "AS
# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
# implied. See the License for the specific language governing
# rights and limitations under the License.
# 
# Alternatively, the contents of this file may be used under the terms of
# either the GNU General Public License Version 2 or later (the "GPL"), or
# the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
# in which case the provisions of the GPL or the LGPL are applicable instead
# of those above. If you wish to allow use of your version of this file only
# under the terms of either the GPL or the LGPL, and not to allow others to
# use your version of this file under the terms of the MPL, indicate your
# decision by deleting the provisions above and replace them with the notice
# and other provisions required by the LGPL or the GPL. If you do not delete
# the provisions above, a recipient may use your version of this file under
# the terms of any one of the MPL, the GPL or the LGPL.
# 
# The Original Code is the Mozilla Swedish translation for Mozilla 1.0.
# 
# The Initial Developer of the Original Code is Mikael Hedberg.
# 
# Contributor(s):
# - Mikael Hedberg <hedberg@novasphere.net>
# - Hasse Wallanger <hasse@jasajudeju.se>

ad	=	Andorra
ae	=	Förenade Arabemiraten
af	=	Afghanistan
ag	=	Antigua och Barbuda
ai	=	Anguilla
al	=	Albanien
am	=	Armenien
an	=	Nederländska Antillerna
ao	=	Angola
aq	=	Antarktis
ar	=	Argentina
as	=	Amerikanska Samoa
at	=	Österrike
au	=	Australien
aw	=	Aruba
ax	=	Åland
az	=	Azerbajdzjan
ba	=	Bosnien och Hercegovina
bb	=	Barbados
bd	=	Bangladesh
be	=	Belgien
bf	=	Burkina Faso
bg	=	Bulgarien
bh	=	Bahrain
bi	=	Burundi
bj	=	Benin
bl	=	Saint-Barthélemy
bm	=	Bermuda
bn	=	Brunei Darussalam
bo	=	Bolivia
br	=	Brasilien
bs	=	Bahamas
bt	=	Bhutan
bv	=	Bouvetøya
bw	=	Botswana
by	=	Vitryssland
bz	=	Belize
ca	=	Kanada
cc	=	Cocos (Keeling) Islands
cd	=	Kongo-Kinshasa
cf	=	Centralafrikanska republiken
cg	=	Kongo-Brazzaville
ch	=	Schweiz
ci	=	Elfenbenskusten
ck	=	Cooköarna
cl	=	Chile
cm	=	Kamerun
cn	=	Kina
co	=	Colombia
cr	=	Costa Rica
cu	=	Kuba
cv	=	Kap Verde
cx	=	Julön
cy	=	Cypern
cz	=	Tjeckien
de	=	Tyskland
dj	=	Djibouti
dk	=	Danmark
dm	=	Dominica
do	=	Dominikanska republiken
dz	=	Algeriet
ec	=	Ecuador
ee	=	Estland
eg	=	Egypten
eh	=	Västsahara
er	=	Eritrea
es	=	Spanien
et	=	Etiopien
fi	=	Finland
fj	=	Fiji
fk	=	Falklandsöarna
fm	=	Mikronesien
fo	=	Färöarna
fr	=	Frankrike
ga	=	Gabon
gb	=	Storbritannien
gd	=	Grenada
ge	=	Georgien
gf	=	Franska Guyana
gg	=	Guernsey
gh	=	Ghana
gi	=	Gibraltar
gl	=	Grönland
gm	=	Gambia
gn	=	Guinea
gp	=	Guadeloupe
gq	=	Ekvatorialguinea
gr	=	Grekland
gs	=	Sydgeorgien och Sydsandwichöarna
gt	=	Guatemala
gu	=	Guam
gw	=	Guinea-Bissau
gy	=	Guyana
hk	=	Hong Kong
hm	=	Heard- och McDonaldsöarna
hn	=	Honduras
hr	=	Kroatien
ht	=	Haiti
hu	=	Ungern
id	=	Indonesien
ie	=	Irland
il	=	Israel
im	=	Isle of Man
in	=	Indien
io	=	Brittiska territoriet i Indiska oceanen
iq	=	Irak
ir	=	Iran
is	=	Island
it	=	Italien
je	=	Jersey
jm	=	Jamaica
jo	=	Jordanien
jp	=	Japan
ke	=	Kenya
kg	=	Kirgizistan
kh	=	Kambodja
ki	=	Kiribati
km	=	Komorerna
kn	=	Saint Kitts och Nevis
kp	=	Nordkorea
kr	=	Sydkorea
kw	=	Kuwait
ky	=	Caymanöarna
kz	=	Kazakstan
la	=	Laos
lb	=	Libanon
lc	=	Saint Lucia
li	=	Liechtenstein
lk	=	Sri Lanka
lr	=	Liberia
ls	=	Lesotho
lt	=	Litauen
lu	=	Luxemburg
lv	=	Lettland
ly	=	Libyen
ma	=	Marocko
mc	=	Monaco
md	=	Moldavien
me	=	Montenegro
mf	=	Saint-Martin
mg	=	Madagaskar
mh	=	Marshallöarna
mk	=	Makedonien
ml	=	Mali
mm	=	Myanmar
mn	=	Mongoliet
mo	=	Macao 
mp	=	Nordmarianerna
mq	=	Martinique
mr	=	Mauritanien
ms	=	Montserrat
mt	=	Malta
mu	=	Mauritius
mv	=	Maldiverna
mw	=	Malawi
mx	=	Mexico
my	=	Malaysia
mz	=	Mozambique
na	=	Namibia
nc	=	Nya Kaledonien
ne	=	Niger
nf	=	Norfolkön
ng	=	Nigeria
ni	=	Nicaragua
nl	=	Nederländerna
no	=	Norge
np	=	Nepal
nr	=	Nauru
nu	=	Niue
nz	=	Nya Zeeland
om	=	Oman
pa	=	Panama
pe	=	Peru
pf	=	Franska Polynesien
pg	=	Papua Nya Guinea
ph	=	Filippinerna
pk	=	Pakistan
pl	=	Polen
pm	=	Saint Pierre och Miquelon
pn	=	Pitcairn
pr	=	Puerto Rico
ps	=	Palestinska självstyret
pt	=	Portugal
pw	=	Palau
py	=	Paraguay
qa	=	Qatar
re	=	Reunion
ro	=	Rumänien
rs	=	Serbien
ru	=	Ryssland
rw	=	Rwanda
sa	=	Saudiarabien
sb	=	Solomonöarna
sc	=	Seychellerna
sd	=	Sudan
se	=	Sverige
sg	=	Singapore
sh	=	Sankta Helena
si	=	Slovenien
sj	=	Svalbard och Jan Mayen
sk	=	Slovakien
sl	=	Sierra Leone
sm	=	San Marino
sn	=	Senegal
so	=	Somalia
sr	=	Surinam
st	=	São Tomé och Príncipe
sv	=	El Salvador
sy	=	Syrien
sz	=	Swaziland
tc	=	Turks- och Caicosöarna
td	=	Tchad
tf	=	Franska sydterritorierna
tg	=	Togo
th	=	Thailand
tj	=	Tadzjikistan
tk	=	Tokelauöarna
tl	=	Timor-Leste
tm	=	Turkmenistan
tn	=	Tunisien
to	=	Tonga
tr	=	Turkiet
tt	=	Trinidad och Tobago
tv	=	Tuvalu
tw	=	Taiwan
tz	=	Tanzania
ua	=	Ukraina
ug	=	Uganda
um	=	Förenta staternas yttre småöar
us	=	Förenta staterna
uy	=	Uruguay
uz	=	Uzbekistan
va	=	Vatikanstaten
vc	=	Saint Vincent och Grenadinerna
ve	=	Venezuela
vg	=	Brittiska Jungfruöarna
vi	=	Amerikanska Jungfruöarna
vn	=	Vietnam
vu	=	Vanuatu
wf	=	Wallis- och Futunaöarna
ws	=	Samoa
ye	=	Jemen
yt	=	Mayotte
za	=	Sydafrika
zm	=	Zambia
zw	=	Zimbabwe
