Index: data/timezones.xml
===================================================================
--- data/timezones.xml	(revision 0)
+++ data/timezones.xml	(revision 0)
@@ -0,0 +1,2303 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE timezones SYSTEM "timezones.dtd">
+<timezones>
+  <country id='AD'>
+    <zone id='Europe/Andorra'>
+      <offset>+1</offset>
+      <dst-offset>+2</dst-offset>
+    </zone>
+  </country>
+  <country id='AE'>
+    <zone id='Asia/Dubai'>
+      <offset>+4</offset>
+    </zone>
+  </country>
+  <country id='AF'>
+    <zone id='Asia/Kabul'>
+      <offset>+4:30</offset>
+    </zone>
+  </country>
+  <country id='AG'>
+    <zone id='America/Antigua'>
+      <_name>Atlantic Time</_name>
+      <offset>-4</offset>
+    </zone>
+  </country>
+  <country id='AI'>
+    <zone id='America/Anguilla'>
+      <_name>Atlantic Time</_name>
+      <offset>-4</offset>
+    </zone>
+  </country>
+  <country id='AL'>
+    <zone id='Europe/Tirane'>
+      <offset>+1</offset>
+      <dst-offset>+2</dst-offset>
+    </zone>
+  </country>
+  <country id='AM'>
+    <zone id='Asia/Yerevan'>
+      <offset>+4</offset>
+      <dst-offset>+5</dst-offset>
+    </zone>
+  </country>
+  <country id='AN'>
+    <zone id='America/Curacao'>
+      <_name>Atlantic Time</_name>
+      <offset>-4</offset>
+    </zone>
+  </country>
+  <country id='AO'>
+    <zone id='Africa/Luanda'>
+      <offset>+1</offset>
+    </zone>
+  </country>
+  <country id='AQ'>
+    <zone id='Antarctica/Palmer'>
+      <!-- Translators: This is an American research station in
+	   Antarctica, which keeps the same time as mainland Chile.
+	   The string is only used in places where "Antarctica" is
+	   already clear from context.
+      -->
+      <_name>Palmer Station (Chile Time)</_name>
+      <offset>-4</offset>
+    </zone>
+    <zone id='Antarctica/Rothera'>
+      <!-- Translators: This is a British research station in
+	   Antarctica. The string is only used in places where
+	   "Antarctica" is already clear from context.
+      -->
+      <_name>Rothera Research Station</_name>
+      <offset>-3</offset>
+    </zone>
+    <zone id='Antarctica/Syowa'>
+      <!-- Translators: This is a Japanese research station in
+	   Antarctica. The string is only used in places where
+	   "Antarctica" is already clear from context.
+      -->
+      <_name>Showa Station</_name>
+      <offset>+3</offset>
+    </zone>
+    <zone id='Antarctica/Mawson'>
+      <!-- Translators: This is an Australian research station in
+	   Antarctica. The string is only used in places where
+	   "Antarctica" is already clear from context.
+      -->
+      <_name>Mawson Station</_name>
+      <offset>+6</offset>
+    </zone>
+    <zone id='Antarctica/Vostok'>
+      <!-- Translators: This is a Russian research station in
+	   Antarctica. The string is only used in places where
+	   "Antarctica" is already clear from context.
+      -->
+      <_name>Vostok Station</_name>
+      <offset>+6</offset>
+    </zone>
+    <zone id='Antarctica/Davis'>
+      <!-- Translators: This is an Australian research station in
+	   Antarctica. The string is only used in places where
+	   "Antarctica" is already clear from context.
+      -->
+      <_name>Davis Station</_name>
+      <offset>+7</offset>
+    </zone>
+    <zone id='Antarctica/Casey'>
+      <!-- Translators: This is an Australian research station in
+	   Antarctica, which keeps the same time as Western
+	   Australia. The string is only used in places where
+	   "Antarctica" is already clear from context.
+      -->
+      <_name>Casey Station (Western Australia Time)</_name>
+      <offset>+8</offset>
+    </zone>
+    <zone id='Antarctica/DumontDUrville'>
+      <!-- Translators: This is a French research station in
+	   Antarctica. The string is only used in places where
+	   "Antarctica" is already clear from context.
+      -->
+      <_name>Dumont d'Urville Station</_name>
+      <offset>+10</offset>
+    </zone>
+    <zone id='Antarctica/McMurdo'>
+      <!-- Translators: This is an American research station in
+	   Antarctica, which keeps the same time as New Zealand. The
+	   string is only used in places where "Antarctica" is
+	   already clear from context.
+      -->
+      <_name>McMurdo Station (New Zealand Time)</_name>
+      <offset>+12</offset>
+      <dst-offset>+13</dst-offset>
+    </zone>
+    <zone id='Antarctica/South_Pole'>
+      <!-- Translators: This is an American research station in
+	   Antarctica, which keeps the same time as New Zealand. The
+	   string is only used in places where "Antarctica" is
+	   already clear from context.
+      -->
+      <_name>Amundsen-Scott South Pole Station (New Zealand Time)</_name>
+      <offset>+12</offset>
+      <dst-offset>+13</dst-offset>
+    </zone>
+  </country>
+  <country id='AR'>
+    <zone id='America/Argentina/Buenos_Aires'>
+      <offset>-3</offset>
+      <dst-offset>-2</dst-offset>
+      <obsoletes>America/Argentina/Catamarca</obsoletes>
+      <obsoletes>America/Argentina/Cordoba</obsoletes>
+      <obsoletes>America/Argentina/Jujuy</obsoletes>
+      <obsoletes>America/Argentina/La_Rioja</obsoletes>
+      <obsoletes>America/Argentina/Mendoza</obsoletes>
+      <obsoletes>America/Argentina/Rio_Gallegos</obsoletes>
+      <obsoletes>America/Argentina/San_Juan</obsoletes>
+      <obsoletes>America/Argentina/San_Luis</obsoletes>
+      <obsoletes>America/Argentina/Tucuman</obsoletes>
+      <obsoletes>America/Argentina/Ushuaia</obsoletes>
+    </zone>
+  </country>
+  <country id='AS'>
+    <zone id='Pacific/Pago_Pago'>
+      <offset>-11</offset>
+    </zone>
+  </country>
+  <country id='AT'>
+    <zone id='Europe/Vienna'>
+      <offset>+1</offset>
+      <dst-offset>+2</dst-offset>
+    </zone>
+  </country>
+  <country id='AU'>
+    <zone id='Australia/Perth'>
+      <!-- Translators: This is the time zone used in Western
+	   Australia. The string is only used in places where
+	   "Australia" is already clear from context.
+      -->
+      <_name>Western Time</_name>
+      <offset>+8</offset>
+      <dst-offset>+9</dst-offset>
+    </zone>
+    <zone id='Australia/Eucla'>
+      <!-- Translators: This is the commonly-used name for an
+	   unofficial time zone used in part of southwestern
+	   Australia. The string is only used in places where
+	   "Australia" is already clear from context.
+      -->
+      <_name>Central Western Time</_name>
+      <offset>+8:45</offset>
+      <dst-offset>+9:45</dst-offset>
+    </zone>
+    <zone id='Australia/Adelaide'>
+      <!-- Translators: This is the time zone used in Central
+	   Australia. This string is specifically for the time zone
+	   as implemented in the state of South Australia, and is
+	   only used in places where "Australia" is already clear
+	   from context.
+      -->
+      <_name>Central Time (South Australia)</_name>
+      <offset>+9:30</offset>
+      <dst-offset>+10:30</dst-offset>
+    </zone>
+    <zone id='Australia/Broken_Hill'>
+      <!-- Translators: This is the time zone used in Central
+	   Australia. This string is specifically for the time zone
+	   as implemented in Yancowinna county in the state of New
+	   South Wales (NSW), which uses Central Time even though
+	   the rest of the state uses Eastern Time. This string is
+	   only used in places where "Australia" is already clear
+	   from context.
+      -->
+      <_name>Central Time (Yancowinna, NSW)</_name>
+      <offset>+9:30</offset>
+      <dst-offset>+10:30</dst-offset>
+    </zone>
+    <zone id='Australia/Darwin'>
+      <!-- Translators: This is the time zone used in Central
+	   Australia. This string is specifically for the time zone
+	   as implemented in the Northern Territory, which does not
+	   use Summer Time. This string is only used in places where
+	   "Australia" is already clear from context.
+      -->
+      <_name>Central Time (Northern Territory)</_name>
+      <offset>+9:30</offset>
+    </zone>
+    <zone id='Australia/Hobart'>
+      <!-- Translators: This is the time zone used in Eastern
+	   Australia. This string is specifically for the time zone
+	   as implemented in the state of Tasmania, and is only used
+	   in places where "Australia" is already clear from
+	   context.
+      -->
+      <_name>Eastern Time (Tasmania)</_name>
+      <offset>+10</offset>
+      <dst-offset>+11</dst-offset>
+      <obsoletes>Australia/Currie</obsoletes>
+    </zone>
+    <zone id='Australia/Melbourne'>
+      <!-- Translators: This is the time zone used in Eastern
+	   Australia. This string is specifically for the time zone
+	   as implemented in the state of Victoria, and is only used
+	   in places where "Australia" is already clear from
+	   context.
+      -->
+      <_name>Eastern Time (Victoria)</_name>
+      <offset>+10</offset>
+      <dst-offset>+11</dst-offset>
+    </zone>
+    <zone id='Australia/Sydney'>
+      <!-- Translators: This is the time zone used in Eastern
+	   Australia. This string is specifically for the time zone
+	   as implemented in the state of New South Wales, and is
+	   only used in places where "Australia" is already clear
+	   from context.
+      -->
+      <_name>Eastern Time (New South Wales)</_name>
+      <offset>+10</offset>
+      <dst-offset>+11</dst-offset>
+    </zone>
+    <zone id='Australia/Brisbane'>
+      <!-- Translators: This is the time zone used in Eastern
+	   Australia. This string is specifically for the time zone
+	   as implemented in the state of Queensland, which does not
+	   use Summer Time. This string is only used in places where
+	   "Australia" is already clear from context.
+      -->
+      <_name>Eastern Time (Queensland)</_name>
+      <offset>+10</offset>
+      <obsoletes>Australia/Lindeman</obsoletes>
+    </zone>
+    <zone id='Australia/Lord_Howe'>
+      <!-- Translators: This is the time zone used on Lord Howe
+	   Island, off the east coast of Australia. This string is
+	   only used in places where "Australia" is already clear
+	   from context.
+      -->
+      <_name>Lord Howe Island</_name>
+      <offset>+10:30</offset>
+      <dst-offset>+11</dst-offset>
+    </zone>
+  </country>
+  <country id='AW'>
+    <zone id='America/Aruba'>
+      <_name>Atlantic Time</_name>
+      <offset>-4</offset>
+    </zone>
+  </country>
+  <country id='AX'>
+    <zone id='Europe/Mariehamn'>
+      <offset>+2</offset>
+      <dst-offset>+3</dst-offset>
+    </zone>
+  </country>
+  <country id='AZ'>
+    <zone id='Asia/Baku'>
+      <offset>+4</offset>
+      <dst-offset>+5</dst-offset>
+    </zone>
+  </country>
+  <country id='BA'>
+    <zone id='Europe/Sarajevo'>
+      <offset>+1</offset>
+      <dst-offset>+2</dst-offset>
+    </zone>
+  </country>
+  <country id='BB'>
+    <zone id='America/Barbados'>
+      <_name>Atlantic Time</_name>
+      <offset>-4</offset>
+    </zone>
+  </country>
+  <country id='BD'>
+    <zone id='Asia/Dhaka'>
+      <offset>+6</offset>
+    </zone>
+  </country>
+  <country id='BE'>
+    <zone id='Europe/Brussels'>
+      <offset>+1</offset>
+      <dst-offset>+2</dst-offset>
+    </zone>
+  </country>
+  <country id='BF'>
+    <zone id='Africa/Ouagadougou'>
+      <offset>+0</offset>
+    </zone>
+  </country>
+  <country id='BG'>
+    <zone id='Europe/Sofia'>
+      <offset>+2</offset>
+      <dst-offset>+3</dst-offset>
+    </zone>
+  </country>
+  <country id='BH'>
+    <zone id='Asia/Bahrain'>
+      <offset>+3</offset>
+    </zone>
+  </country>
+  <country id='BI'>
+    <zone id='Africa/Bujumbura'>
+      <offset>+2</offset>
+    </zone>
+  </country>
+  <country id='BJ'>
+    <zone id='Africa/Porto-Novo'>
+      <offset>+1</offset>
+    </zone>
+  </country>
+  <country id='BL'>
+    <zone id='America/St_Barthelemy'>
+      <_name>Atlantic Time</_name>
+      <offset>-4</offset>
+    </zone>
+  </country>
+  <country id='BM'>
+    <zone id='Atlantic/Bermuda'>
+      <_name>Atlantic Time</_name>
+      <offset>-4</offset>
+      <dst-offset>-3</dst-offset>
+    </zone>
+  </country>
+  <country id='BN'>
+    <zone id='Asia/Brunei'>
+      <offset>+8</offset>
+    </zone>
+  </country>
+  <country id='BO'>
+    <zone id='America/La_Paz'>
+      <offset>-4</offset>
+    </zone>
+  </country>
+  <country id='BR'>
+    <zone id='America/Araguaina'>
+      <!-- Translators: This represents the time zone in the
+	   Brazilian state of Tocantins, which (as of 2008) is
+	   "Brasília Time" (ie, the same as Brasília), but without
+	   daylight/summer time. This string is only used in places
+	   where "Brazil" is already clear from context.
+      -->
+      <_name>Tocantins</_name>
+      <offset>-3</offset>
+    </zone>
+    <zone id='America/Bahia'>
+      <!-- Translators: This represents the time zone in the
+	   Brazilian state of Bahia, which (as of 2008) is "Brasília
+	   Time" (ie, the same as Brasília), but without without
+	   daylight/summer time. This string is only used in places
+	   where "Brazil" is already clear from context.
+      -->
+      <_name>Bahia</_name>
+      <offset>-3</offset>
+    </zone>
+    <zone id='America/Belem'>
+      <!-- Translators: This represents the time zone in the
+	   Brazilian state of Amapá and the eastern part of Pará,
+	   which (as of 2008) is "Brasília Time" (ie, the same as
+	   Brasília), but without daylight/summer time. This string
+	   is only used in places where "Brazil" is already clear
+	   from context.
+      -->
+      <_name>Amapá / East Pará</_name>
+      <offset>-3</offset>
+    </zone>
+    <zone id='America/Boa_Vista'>
+      <!-- Translators: This represents the time zone in the
+	   Brazilian state of Roraima, which (as of 2008) is one
+	   hour behind Brasília, without daylight/summer time. This
+	   string is only used in places where "Brazil" is already
+	   clear from context.
+      -->
+      <_name>Roraima</_name>
+      <offset>-4</offset>
+    </zone>
+    <zone id='America/Campo_Grande'>
+      <!-- Translators: This represents the time zone in the
+	   Brazilian state of Mato Grosso do Sul, which (as of 2008)
+	   is one hour behind Brasília, and includes daylight/summer
+	   time. This string is only used in places where "Brazil"
+	   is already clear from context.
+      -->
+      <_name>Mato Grosso do Sul</_name>
+      <offset>-4</offset>
+      <dst-offset>-3</dst-offset>
+    </zone>
+    <zone id='America/Cuiaba'>
+      <!-- Translators: This represents the time zone in the
+	   Brazilian state of Mato Grosso, which (as of 2008) is one
+	   hour behind Brasília, and includes daylight/summer time.
+	   This string is only used in places where "Brazil" is
+	   already clear from context.
+      -->
+      <_name>Mato Grosso</_name>
+      <offset>-4</offset>
+      <dst-offset>-3</dst-offset>
+    </zone>
+    <zone id='America/Eirunepe'>
+      <!-- Translators: This represents the time zone in the western
+	   part of the Brazilian state of Amazonas, which as of 2008
+	   is two hours behind Brasília, without daylight/summer
+	   time. This string is only used in places where "Brazil"
+	   is already clear from context.
+      -->
+      <_name>West Amazonas</_name>
+      <offset>-5</offset>
+    </zone>
+    <zone id='America/Fortaleza'>
+      <!-- Translators: This represents the time zone in the
+	   Brazilian states of Ceará, Maranhão, Paraíba, Piauí, and
+	   Rio Grande do Norte, which (as of 2008) is "Brasília
+	   Time" (ie, the same as Brasília), but without
+	   daylight/summer time. This string is only used in places
+	   where "Brazil" is already clear from context.
+      -->
+      <_name>Ceará, Maranhão, Paraíba, Piauí, Rio Grande do Norte</_name>
+      <offset>-3</offset>
+    </zone>
+    <zone id='America/Maceio'>
+      <!-- Translators: This represents the time zone in the
+	   Brazilian states of Alagoas and Sergipe, which (as of
+	   2008) is "Brasília Time" (ie, the same as Brasília), but
+	   without daylight/summer time. This string is only used in
+	   places where "Brazil" is already clear from context.
+      -->
+      <_name>Alagoas, Sergipe</_name>
+      <offset>-3</offset>
+    </zone>
+    <zone id='America/Manaus'>
+      <!-- Translators: This represents the time zone in the eastern
+	   part of the Brazilian state of Amazonas, which as of 2008
+	   is one hour behind Brasília, without daylight/summer
+	   time. This string is only used in places where "Brazil"
+	   is already clear from context.
+      -->
+      <_name>East Amazonas</_name>
+      <offset>-4</offset>
+    </zone>
+    <zone id='America/Noronha'>
+      <!-- Translators: This represents the time zone on the
+	   Brazilian island of Fernando de Noronha, which (as of
+	   2008) is one hour ahead of Brasília, without
+	   daylight/summer time. This string is only used in places
+	   where "Brazil" is already clear from context.
+      -->
+      <_name>Fernando de Noronha</_name>
+      <offset>-2</offset>
+    </zone>
+    <zone id='America/Porto_Velho'>
+      <!-- Translators: This represents the time zone in the
+	   Brazilian state of Rondônia and the western part of Pará,
+	   which as of 2008 is one hour behind Brasília, without
+	   daylight/summer time. This string is only used in places
+	   where "Brazil" is already clear from context.
+      -->
+      <_name>West Pará, Rondônia</_name>
+      <offset>-4</offset>
+    </zone>
+    <zone id='America/Recife'>
+      <!-- Translators: This represents the time zone in the
+	   Brazilian state of Pernambuco, which (as of 2008) is
+	   "Brasília Time" (ie, the same as Brasília), but without
+	   daylight/summer time. This string is only used in places
+	   where "Brazil" is already clear from context.
+      -->
+      <_name>Pernambuco</_name>
+      <offset>-3</offset>
+    </zone>
+    <zone id='America/Rio_Branco'>
+      <!-- Translators: This represents the time zone in the
+	   Brazilian state of Acre, which (as of 2008) is two hours
+	   behind Brasília, without daylight/summer time. This
+	   string is only used in places where "Brazil" is already
+	   clear from context.
+      -->
+      <_name>Acre</_name>
+      <offset>-5</offset>
+    </zone>
+    <zone id='America/Sao_Paulo'>
+      <!-- Translators: This represents the official "base" time
+	   zone in Brazil, covering the capital city of Brasília,
+	   and about a third of the states in Brazil (Distrito
+	   Federal, Espírito Santo, Goiás, Minas Gerais, Paraná, Rio
+	   de Janeiro, Rio Grande do Sul, Santa Catarina, and São
+	   Paulo, indicated here by their standard abbreviations).
+	   This string is only used in places where "Brazil" is
+	   already clear from context.
+      -->
+      <_name>Brasília Time (DF, ES, GO, MG, PR, RJ, RS, SC, SP)</_name>
+      <offset>-3</offset>
+      <dst-offset>-2</dst-offset>
+    </zone>
+  </country>
+  <country id='BS'>
+    <zone id='America/Nassau'>
+      <_name>Eastern Time</_name>
+      <offset>-5</offset>
+      <dst-offset>-4</dst-offset>
+    </zone>
+  </country>
+  <country id='BT'>
+    <zone id='Asia/Thimphu'>
+      <offset>+6</offset>
+    </zone>
+  </country>
+  <country id='BW'>
+    <zone id='Africa/Gaborone'>
+      <offset>+2</offset>
+    </zone>
+  </country>
+  <country id='BY'>
+    <zone id='Europe/Minsk'>
+      <offset>+2</offset>
+      <dst-offset>+3</dst-offset>
+    </zone>
+  </country>
+  <country id='BZ'>
+    <zone id='America/Belize'>
+      <offset>-6</offset>
+    </zone>
+  </country>
+  <country id='CA'>
+    <zone id='America/Vancouver'>
+      <!-- Translators: This is the time zone used on most of the west
+           coast of North America. In Mexico it is called "Tiempo del
+           Pacífico" and in French-speaking parts of Canada it is
+           called "Heure du Pacifique". The string is only used in
+           places where "US", "Canada" or "Mexico" is already clear
+           from the context.
+        -->
+      <_name>Pacific Time</_name>
+      <offset>-8</offset>
+      <dst-offset>-7</dst-offset>
+      <obsoletes>America/Dawson</obsoletes>
+      <obsoletes>America/Whitehorse</obsoletes>
+    </zone>
+    <zone id='America/Edmonton'>
+      <!-- Translators: This is the time zone used in the central-west
+           part of North America (ie, the Rocky Mountains). In Mexico
+           it is called "Tiempo de la Montaña", and in French-speaking
+           parts of Canada it is called "Heure des Rocheuses". The
+           string is only used in places where "US", "Canada" or
+           "Mexico" is already clear from the context.
+        -->
+      <_name>Mountain Time</_name>
+      <offset>-7</offset>
+      <dst-offset>-6</dst-offset>
+      <obsoletes>America/Cambridge_Bay</obsoletes>
+      <obsoletes>America/Inuvik</obsoletes>
+      <obsoletes>America/Yellowknife</obsoletes>
+    </zone>
+    <zone id='America/Dawson_Creek'>
+      <!-- Translators: This represents the time zone in the
+	   northeastern part of the Canadian province of British
+	   Columbia (BC), which is part of the "Mountain Time" zone,
+	   but does not observe Daylight Saving Time with the rest of
+	   the zone.
+      -->
+      <_name>Mountain Time, no DST (Northeast BC)</_name>
+      <offset>-7</offset>
+    </zone>
+    <zone id='America/Winnipeg'>
+      <!-- Translators: This is the time zone used in the central-east
+           part of North America. In Mexico it is called "Tiempo del
+           Centro", and in French-speaking parts of Canada it is
+           called "Heure du Centre". The string is only used in places
+           where "US", "Canada" or "Mexico" is already clear from the
+           context.
+        -->
+      <_name>Central Time</_name>
+      <offset>-6</offset>
+      <dst-offset>-5</dst-offset>
+      <obsoletes>America/Rainy_River</obsoletes>
+      <obsoletes>America/Rankin_Inlet</obsoletes>
+    </zone>
+    <zone id='America/Regina'>
+      <!-- Translators: This represents the time zone in the Canadian
+	   province of Saskatchewan, which is part of the "Central
+	   Time" zone, but does not observe Daylight Saving Time with
+	   the rest of the zone.
+      -->
+      <_name>Central Time, no DST (Saskatchewan)</_name>
+      <offset>-6</offset>
+      <obsoletes>America/Swift_Current</obsoletes>
+    </zone>
+    <zone id='America/Toronto'>
+      <!-- Translators: This is the time zone used on the east coast
+           of the United States, and the corresponding (non-coastal)
+           part of Canada. In French-speaking parts of Canada it is
+           called "Heure de l'Est". The string is only used in places
+           where "US" or "Canada" is already clear from the context.
+        -->
+      <_name>Eastern Time</_name>
+      <offset>-5</offset>
+      <dst-offset>-4</dst-offset>
+      <obsoletes>America/Iqaluit</obsoletes>
+      <obsoletes>America/Montreal</obsoletes>
+      <obsoletes>America/Nipigon</obsoletes>
+      <obsoletes>America/Pangnirtung</obsoletes>
+      <obsoletes>America/Thunder_Bay</obsoletes>
+    </zone>
+    <zone id='America/Atikokan'>
+      <!-- Translators: This represents the time zone in certain parts
+           of Canada (such as Southampton Island, Nunavut, and
+           Atikokan, Ontario) which are part of the "Eastern Time"
+           zone, but which do not observe Daylight Saving Time with
+           the rest of the zone.
+      -->
+      <_name>Eastern Time, no DST (Southampton Island, et al)</_name>
+      <offset>-5</offset>
+      <obsoletes>America/Resolute</obsoletes>
+    </zone>
+    <zone id='America/Halifax'>
+      <!-- Translators: This is the time zone used on the east coast
+           of Canada, in Bermuda, and on many Caribbean islands. In
+           French-speaking parts of Canada it is called "Heure de
+           l'Atlantique". The string is only used in places where a
+           country is already clear from the context.
+        -->
+      <_name>Atlantic Time</_name>
+      <offset>-4</offset>
+      <dst-offset>-3</dst-offset>
+      <obsoletes>America/Glace_Bay</obsoletes>
+      <obsoletes>America/Goose_Bay</obsoletes>
+      <obsoletes>America/Moncton</obsoletes>
+    </zone>
+    <zone id='America/Blanc-Sablon'>
+      <!-- Translators: This represents the time zone in the far
+	   eastern portion of the Canadian province of Quebec, which
+	   is part of the "Atlantic Time" zone, but does not observe
+	   Daylight Saving Time with the rest of the zone.
+      -->
+      <_name>Atlantic Time, no DST (Eastern Quebec)</_name>
+      <offset>-4</offset>
+    </zone>
+    <zone id='America/St_Johns'>
+      <!-- Translators: This is the time zone used in the Canadian
+           province of Newfoundland. In French-speaking parts of
+           Canada it is called "Heure de Terre-Neuve".
+      -->
+      <_name>Newfoundland Time</_name>
+      <offset>-4:30</offset>
+      <dst-offset>-3:30</dst-offset>
+    </zone>
+  </country>
+  <country id='CC'>
+    <zone id='Indian/Cocos'>
+      <offset>+6:30</offset>
+    </zone>
+  </country>
+  <country id='CD'>
+    <zone id='Africa/Kinshasa'>
+      <!-- Translators: This is the time zone used in the western half
+           of the Democratic Republic of the Congo. The string is only
+           used in places where "DR Congo" is already clear from
+           context. FIXME: is there an official name for this zone?
+      -->
+      <_name>Western Congo</_name>
+      <offset>+1</offset>
+    </zone>
+    <zone id='Africa/Lubumbashi'>
+      <!-- Translators: This is the time zone used in the eastern half
+           of the Democratic Republic of the Congo. The string is only
+           used in places where "DR Congo" is already clear from
+           context. FIXME: is there an official name for this zone?
+      -->
+      <_name>Eastern Congo</_name>
+      <offset>+2</offset>
+    </zone>
+  </country>
+  <country id='CF'>
+    <zone id='Africa/Bangui'>
+      <offset>+1</offset>
+    </zone>
+  </country>
+  <country id='CG'>
+    <zone id='Africa/Brazzaville'>
+      <offset>+1</offset>
+    </zone>
+  </country>
+  <country id='CH'>
+    <zone id='Europe/Zurich'>
+      <offset>+1</offset>
+      <dst-offset>+2</dst-offset>
+    </zone>
+  </country>
+  <country id='CI'>
+    <zone id='Africa/Abidjan'>
+      <offset>+0</offset>
+    </zone>
+  </country>
+  <country id='CK'>
+    <zone id='Pacific/Rarotonga'>
+      <offset>-10</offset>
+    </zone>
+  </country>
+  <country id='CL'>
+    <zone id='America/Santiago'>
+      <!-- Translators: This refers to the time zone for mainland
+           Chile (as opposed to the time zone for Easter Island).
+      -->
+      <_name>Mainland Chile</_name>
+      <offset>-4</offset>
+      <dst-offset>-3</dst-offset>
+    </zone>
+    <zone id='Pacific/Easter'>
+      <_name>Easter Island</_name>
+      <offset>-6</offset>
+      <dst-offset>-5</dst-offset>
+    </zone>
+  </country>
+  <country id='CM'>
+    <zone id='Africa/Douala'>
+      <offset>+1</offset>
+    </zone>
+  </country>
+  <country id='CN'>
+    <zone id='Asia/Shanghai'>
+      <offset>+8</offset>
+      <obsoletes>Asia/Chongqing</obsoletes>
+      <obsoletes>Asia/Harbin</obsoletes>
+      <obsoletes>Asia/Kashgar</obsoletes>
+      <obsoletes>Asia/Urumqi</obsoletes>
+    </zone>
+  </country>
+  <country id='CO'>
+    <zone id='America/Bogota'>
+      <offset>-5</offset>
+    </zone>
+  </country>
+  <country id='CR'>
+    <zone id='America/Costa_Rica'>
+      <offset>-6</offset>
+    </zone>
+  </country>
+  <country id='CU'>
+    <zone id='America/Havana'>
+      <offset>-5</offset>
+      <dst-offset>-4</dst-offset>
+    </zone>
+  </country>
+  <country id='CV'>
+    <zone id='Atlantic/Cape_Verde'>
+      <offset>-1</offset>
+    </zone>
+  </country>
+  <country id='CX'>
+    <zone id='Indian/Christmas'>
+      <offset>+7</offset>
+    </zone>
+  </country>
+  <country id='CY'>
+    <zone id='Asia/Nicosia'>
+      <offset>+2</offset>
+      <dst-offset>+3</dst-offset>
+    </zone>
+  </country>
+  <country id='CZ'>
+    <zone id='Europe/Prague'>
+      <offset>+1</offset>
+      <dst-offset>+2</dst-offset>
+    </zone>
+  </country>
+  <country id='DE'>
+    <zone id='Europe/Berlin'>
+      <offset>+1</offset>
+      <dst-offset>+2</dst-offset>
+    </zone>
+  </country>
+  <country id='DJ'>
+    <zone id='Africa/Djibouti'>
+      <offset>+3</offset>
+    </zone>
+  </country>
+  <country id='DK'>
+    <zone id='Europe/Copenhagen'>
+      <offset>+1</offset>
+      <dst-offset>+2</dst-offset>
+    </zone>
+  </country>
+  <country id='DM'>
+    <zone id='America/Dominica'>
+      <_name>Atlantic Time</_name>
+      <offset>-4</offset>
+    </zone>
+  </country>
+  <country id='DO'>
+    <zone id='America/Santo_Domingo'>
+      <_name>Atlantic Time</_name>
+      <offset>-4</offset>
+    </zone>
+  </country>
+  <country id='DZ'>
+    <zone id='Africa/Algiers'>
+      <offset>+1</offset>
+    </zone>
+  </country>
+  <country id='EC'>
+    <zone id='America/Guayaquil'>
+      <!-- Translators: This refers to the time zone for mainland
+           Ecuador (as opposed to the time zone for the Galapagos
+           Islands).
+      -->
+      <_name>Mainland Ecuador</_name>
+      <offset>-5</offset>
+    </zone>
+    <zone id='Pacific/Galapagos'>
+      <!-- Translators: This is the time zone for the Galapagos Islands. -->
+      <_name>Galapagos Islands</_name>
+      <offset>-6</offset>
+    </zone>
+  </country>
+  <country id='EE'>
+    <zone id='Europe/Tallinn'>
+      <offset>+2</offset>
+      <dst-offset>+3</dst-offset>
+    </zone>
+  </country>
+  <country id='EG'>
+    <zone id='Africa/Cairo'>
+      <offset>+2</offset>
+      <dst-offset>+3</dst-offset>
+    </zone>
+  </country>
+  <country id='EH'>
+    <zone id='Africa/El_Aaiun'>
+      <offset>+0</offset>
+    </zone>
+  </country>
+  <country id='ER'>
+    <zone id='Africa/Asmara'>
+      <offset>+3</offset>
+    </zone>
+  </country>
+  <country id='ES'>
+    <zone id='Atlantic/Canary'>
+      <_name>Canary Islands</_name>
+      <offset>+0</offset>
+      <dst-offset>+1</dst-offset>
+    </zone>
+    <zone id='Europe/Madrid'>
+      <!-- Translators: This refers to the time zone for mainland
+	   Spain (as opposed to the time zone for the Canary
+	   Islands).
+      -->
+      <_name>Mainland Spain</_name>
+      <offset>+1</offset>
+      <dst-offset>+2</dst-offset>
+    </zone>
+    <zone id='Africa/Ceuta'>
+      <!-- Translators: This is the time zone for the Spanish cities
+           of Ceuta and Melilla, on the coast of Africa. The string is
+           only used in places where "Spain" is already clear from
+           context.
+      -->
+      <_name>Ceuta and Melilla</_name>
+      <offset>+1</offset>
+      <dst-offset>+2</dst-offset>
+    </zone>
+  </country>
+  <country id='ET'>
+    <zone id='Africa/Addis_Ababa'>
+      <offset>+3</offset>
+    </zone>
+  </country>
+  <country id='FI'>
+    <zone id='Europe/Helsinki'>
+      <offset>+2</offset>
+      <dst-offset>+3</dst-offset>
+    </zone>
+  </country>
+  <country id='FJ'>
+    <zone id='Pacific/Fiji'>
+      <offset>+12</offset>
+    </zone>
+  </country>
+  <country id='FK'>
+    <zone id='Atlantic/Stanley'>
+      <offset>-4</offset>
+      <dst-offset>-3</dst-offset>
+    </zone>
+  </country>
+  <country id='FM'>
+    <zone id='Pacific/Ponape'>
+      <!-- Translators: This is one of two time zones in the
+	   Federated States of Micronesia, including the islands of
+	   Pohnpei and Kosrae. The string is only used in places
+	   where "Micronesia" is already clear from context.
+      -->
+      <_name>Pohnpei / Kosrae</_name>
+      <offset>+11</offset>
+      <obsoletes>Pacific/Kosrae</obsoletes>
+    </zone>
+    <zone id='Pacific/Truk'>
+      <!-- Translators: This is one of two time zones in the Federated
+	   States of Micronesia, including the islands of Yap and
+	   Chuuk. The string is only used in places where "Micronesia"
+	   is already clear from context.
+      -->
+      <_name>Yap / Chuuk</_name>
+      <offset>+10</offset>
+    </zone>
+  </country>
+  <country id='FO'>
+    <zone id='Atlantic/Faroe'>
+      <offset>+0</offset>
+      <dst-offset>+1</dst-offset>
+    </zone>
+  </country>
+  <country id='FR'>
+    <zone id='Europe/Paris'>
+      <offset>+1</offset>
+      <dst-offset>+2</dst-offset>
+    </zone>
+  </country>
+  <country id='GA'>
+    <zone id='Africa/Libreville'>
+      <offset>+1</offset>
+    </zone>
+  </country>
+  <country id='GB'>
+    <zone id='Europe/London'>
+      <_name>GMT/BST</_name>
+      <offset>+0</offset>
+      <dst-offset>+1</dst-offset>
+    </zone>
+  </country>
+  <country id='GD'>
+    <zone id='America/Grenada'>
+      <_name>Atlantic Time</_name>
+      <offset>-4</offset>
+    </zone>
+  </country>
+  <country id='GE'>
+    <zone id='Asia/Tbilisi'>
+      <offset>+4</offset>
+    </zone>
+  </country>
+  <country id='GF'>
+    <zone id='America/Cayenne'>
+      <offset>-3</offset>
+    </zone>
+  </country>
+  <country id='GG'>
+    <zone id='Europe/Guernsey'>
+      <_name>GMT/BST</_name>
+      <offset>+0</offset>
+      <dst-offset>+1</dst-offset>
+    </zone>
+  </country>
+  <country id='GH'>
+    <zone id='Africa/Accra'>
+      <offset>+0</offset>
+    </zone>
+  </country>
+  <country id='GI'>
+    <zone id='Europe/Gibraltar'>
+      <offset>+1</offset>
+      <dst-offset>+2</dst-offset>
+    </zone>
+  </country>
+  <country id='GL'>
+    <zone id='America/Danmarkshavn'>
+      <!-- Translators: This is the timezone around Danmarkshavn
+	   station in Greenland. The string is only used in places
+	   where "Greenland" is already clear from context.
+      -->
+      <_name>Danmarkshavn</_name>
+      <offset>0</offset>
+    </zone>
+    <zone id='America/Godthab'>
+      <!-- Translators: This is the primary timezone for Greenland,
+	   although sources seem to point towards calling the area
+	   "Western Greenland" rathern than just "Greenland".
+      -->
+      <_name>Western Greenland</_name>
+      <offset>-3</offset>
+      <dst-offset>-2</dst-offset>
+    </zone>
+    <zone id='America/Scoresbysund'>
+      <!-- Translators: This is the timezone around Scoresbysund /
+	   Ittoqqortoormiit on the east coast of Greenland.
+      -->
+      <_name>Eastern Greenland</_name>
+      <offset>-1</offset>
+      <dst-offset>0</dst-offset>
+    </zone>
+    <zone id='America/Thule'>
+      <!-- Translators: This is the timezone at the Thule US Air Force
+	   Base on the west coast of Greenland.
+      -->
+      <_name>Thule AFB</_name>
+      <offset>-4</offset>
+      <dst-offset>-3</dst-offset>
+    </zone>
+  </country>
+  <country id='GM'>
+    <zone id='Africa/Banjul'>
+      <offset>+0</offset>
+    </zone>
+  </country>
+  <country id='GN'>
+    <zone id='Africa/Conakry'>
+      <offset>+0</offset>
+    </zone>
+  </country>
+  <country id='GP'>
+    <zone id='America/Guadeloupe'>
+      <_name>Atlantic Time</_name>
+      <offset>-4</offset>
+    </zone>
+  </country>
+  <country id='GQ'>
+    <zone id='Africa/Malabo'>
+      <offset>+1</offset>
+    </zone>
+  </country>
+  <country id='GR'>
+    <zone id='Europe/Athens'>
+      <offset>+2</offset>
+      <dst-offset>+3</dst-offset>
+    </zone>
+  </country>
+  <country id='GS'>
+    <zone id='Atlantic/South_Georgia'>
+      <offset>-2</offset>
+    </zone>
+  </country>
+  <country id='GT'>
+    <zone id='America/Guatemala'>
+      <offset>-6</offset>
+    </zone>
+  </country>
+  <country id='GU'>
+    <zone id='Pacific/Guam'>
+      <offset>+10</offset>
+    </zone>
+  </country>
+  <country id='GW'>
+    <zone id='Africa/Bissau'>
+      <offset>+0</offset>
+    </zone>
+  </country>
+  <country id='GY'>
+    <zone id='America/Guyana'>
+      <offset>-4</offset>
+    </zone>
+  </country>
+  <country id='HK'>
+    <zone id='Asia/Hong_Kong'>
+      <offset>+8</offset>
+    </zone>
+  </country>
+  <country id='HN'>
+    <zone id='America/Tegucigalpa'>
+      <offset>-6</offset>
+    </zone>
+  </country>
+  <country id='HR'>
+    <zone id='Europe/Zagreb'>
+      <offset>+1</offset>
+      <dst-offset>+2</dst-offset>
+    </zone>
+  </country>
+  <country id='HT'>
+    <zone id='America/Port-au-Prince'>
+      <offset>-5</offset>
+    </zone>
+  </country>
+  <country id='HU'>
+    <zone id='Europe/Budapest'>
+      <offset>+1</offset>
+      <dst-offset>+2</dst-offset>
+    </zone>
+  </country>
+  <country id='ID'>
+    <zone id='Asia/Jakarta'>
+      <!-- Translators: this is the timezone on the western islands of
+	   Indonesia. The name in Indonesian is "Waktu Indonesia
+	   Bagian Barat".
+      -->
+      <_name>Western Indonesia Time</_name>
+      <offset>+7</offset>
+      <obsoletes>Asia/Pontianak</obsoletes>
+    </zone>
+    <zone id='Asia/Makassar'>
+      <!-- Translators: this is the timezone on the central islands of
+	   Indonesia. The name in Indonesian is "Waktu Indonesia
+	   Bagian Tengah".
+      -->
+      <_name>Central Indonesia Time</_name>
+      <offset>+8</offset>
+    </zone>
+    <zone id='Asia/Jayapura'>
+      <!-- Translators: this is the timezone on the eastern islands of
+	   Indonesia. The name in Indonesian is "Waktu Indonesia
+	   Bagian Timur".
+      -->
+      <_name>Eastern Indonesia Time</_name>
+      <offset>+9</offset>
+    </zone>
+  </country>
+  <country id='IE'>
+    <zone id='Europe/Dublin'>
+      <!-- Translators: This is the time zone in Ireland (GMT in the
+	   winter, and Irish Summer Time in the summer.)
+      -->
+      <_name>GMT/IST</_name>
+      <offset>+0</offset>
+      <dst-offset>+1</dst-offset>
+    </zone>
+  </country>
+  <country id='IL'>
+    <zone id='Asia/Jerusalem'>
+      <offset>+2</offset>
+      <dst-offset>+3</dst-offset>
+    </zone>
+  </country>
+  <country id='IM'>
+    <zone id='Europe/Isle_of_Man'>
+      <_name>GMT/BST</_name>
+      <offset>+0</offset>
+      <dst-offset>+1</dst-offset>
+    </zone>
+  </country>
+  <country id='IN'>
+    <zone id='Asia/Kolkata'>
+      <offset>+5:30</offset>
+    </zone>
+  </country>
+  <country id='IO'>
+    <zone id='Indian/Chagos'>
+      <offset>+6</offset>
+    </zone>
+  </country>
+  <country id='IQ'>
+    <zone id='Asia/Baghdad'>
+      <offset>+3</offset>
+    </zone>
+  </country>
+  <country id='IR'>
+    <zone id='Asia/Tehran'>
+      <offset>+3:30</offset>
+      <dst-offset>+4:30</dst-offset>
+    </zone>
+  </country>
+  <country id='IS'>
+    <zone id='Atlantic/Reykjavik'>
+      <offset>+0</offset>
+    </zone>
+  </country>
+  <country id='IT'>
+    <zone id='Europe/Rome'>
+      <offset>+1</offset>
+      <dst-offset>+2</dst-offset>
+    </zone>
+  </country>
+  <country id='JE'>
+    <zone id='Europe/Jersey'>
+      <_name>GMT/BST</_name>
+      <offset>+0</offset>
+      <dst-offset>+1</dst-offset>
+    </zone>
+  </country>
+  <country id='JM'>
+    <zone id='America/Jamaica'>
+      <offset>-5</offset>
+    </zone>
+  </country>
+  <country id='JO'>
+    <zone id='Asia/Amman'>
+      <offset>+2</offset>
+      <dst-offset>+3</dst-offset>
+    </zone>
+  </country>
+  <country id='JP'>
+    <zone id='Asia/Tokyo'>
+      <offset>+9</offset>
+    </zone>
+  </country>
+  <country id='KE'>
+    <zone id='Africa/Nairobi'>
+      <offset>+3</offset>
+    </zone>
+  </country>
+  <country id='KG'>
+    <zone id='Asia/Bishkek'>
+      <offset>+6</offset>
+    </zone>
+  </country>
+  <country id='KH'>
+    <zone id='Asia/Phnom_Penh'>
+      <offset>+7</offset>
+    </zone>
+  </country>
+  <country id='KI'>
+    <zone id='Pacific/Tarawa'>
+      <!-- Translators: This is the time zone in the Gilbert
+	   Islands, one of the three main island groups of Kiribati.
+	   This string is only used in places where "Kiribati" is
+	   already clear from context.
+      -->
+      <_name>Gilbert Islands</_name>
+      <offset>+12</offset>
+    </zone>
+    <zone id='Pacific/Enderbury'>
+      <!-- Translators: This is the time zone in the Phoenix
+	   Islands, one of the three main island groups of Kiribati.
+	   This string is only used in places where "Kiribati" is
+	   already clear from context.
+      -->
+      <_name>Phoenix Islands</_name>
+      <offset>+13</offset>
+    </zone>
+    <zone id='Pacific/Kiritimati'>
+      <!-- Translators: This is the time zone in the Line Islands,
+	   one of the three main island groups of Kiribati. This
+	   string is only used in places where "Kiribati" is already
+	   clear from context.
+      -->
+      <_name>Line Islands</_name>
+      <offset>+14</offset>
+    </zone>
+  </country>
+  <country id='KM'>
+    <zone id='Indian/Comoro'>
+      <offset>+3</offset>
+    </zone>
+  </country>
+  <country id='KN'>
+    <zone id='America/St_Kitts'>
+      <_name>Atlantic Time</_name>
+      <offset>-4</offset>
+    </zone>
+  </country>
+  <country id='KP'>
+    <zone id='Asia/Pyongyang'>
+      <offset>+9</offset>
+    </zone>
+  </country>
+  <country id='KR'>
+    <zone id='Asia/Seoul'>
+      <offset>+9</offset>
+    </zone>
+  </country>
+  <country id='KW'>
+    <zone id='Asia/Kuwait'>
+      <offset>+3</offset>
+    </zone>
+  </country>
+  <country id='KY'>
+    <zone id='America/Cayman'>
+      <offset>-5</offset>
+    </zone>
+  </country>
+  <country id='KZ'>
+    <zone id='Asia/Almaty'>
+      <!-- Translators: This is the time zone used in the eastern
+	   half of Kazakhstan. FIXME: is there an official name for
+	   this zone?
+      -->
+      <_name>Eastern Kazakhstan</_name>
+      <offset>+6</offset>
+      <obsoletes>Asia/Qyzylorda</obsoletes>
+    </zone>
+    <zone id='Asia/Aqtobe'>
+      <!-- Translators: This is the time zone used in the western
+	   half of Kazakhstan. FIXME: is there an official name for
+	   this zone?
+      -->
+      <_name>Western Kazakhstan</_name>
+      <offset>+5</offset>
+      <obsoletes>Asia/Aqtau</obsoletes>
+      <obsoletes>Asia/Oral</obsoletes>
+    </zone>
+  </country>
+  <country id='LA'>
+    <zone id='Asia/Vientiane'>
+      <offset>+7</offset>
+    </zone>
+  </country>
+  <country id='LB'>
+    <zone id='Asia/Beirut'>
+      <offset>+2</offset>
+      <dst-offset>+3</dst-offset>
+    </zone>
+  </country>
+  <country id='LC'>
+    <zone id='America/St_Lucia'>
+      <_name>Atlantic Time</_name>
+      <offset>-4</offset>
+    </zone>
+  </country>
+  <country id='LI'>
+    <zone id='Europe/Vaduz'>
+      <offset>+1</offset>
+      <dst-offset>+2</dst-offset>
+    </zone>
+  </country>
+  <country id='LK'>
+    <zone id='Asia/Colombo'>
+      <offset>+5:30</offset>
+    </zone>
+  </country>
+  <country id='LR'>
+    <zone id='Africa/Monrovia'>
+      <offset>+0</offset>
+    </zone>
+  </country>
+  <country id='LS'>
+    <zone id='Africa/Maseru'>
+      <offset>+2</offset>
+    </zone>
+  </country>
+  <country id='LT'>
+    <zone id='Europe/Vilnius'>
+      <offset>+2</offset>
+      <dst-offset>+3</dst-offset>
+    </zone>
+  </country>
+  <country id='LU'>
+    <zone id='Europe/Luxembourg'>
+      <offset>+1</offset>
+      <dst-offset>+2</dst-offset>
+    </zone>
+  </country>
+  <country id='LV'>
+    <zone id='Europe/Riga'>
+      <offset>+2</offset>
+      <dst-offset>+3</dst-offset>
+    </zone>
+  </country>
+  <country id='LY'>
+    <zone id='Africa/Tripoli'>
+      <offset>+2</offset>
+    </zone>
+  </country>
+  <country id='MA'>
+    <zone id='Africa/Casablanca'>
+      <offset>+0</offset>
+      <dst-offset>+1</dst-offset>
+    </zone>
+  </country>
+  <country id='MC'>
+    <zone id='Europe/Monaco'>
+      <offset>+1</offset>
+      <dst-offset>+2</dst-offset>
+    </zone>
+  </country>
+  <country id='MD'>
+    <zone id='Europe/Chisinau'>
+      <offset>+2</offset>
+      <dst-offset>+3</dst-offset>
+    </zone>
+  </country>
+  <country id='ME'>
+    <zone id='Europe/Podgorica'>
+      <offset>+1</offset>
+      <dst-offset>+2</dst-offset>
+    </zone>
+  </country>
+  <country id='MF'>
+    <zone id='America/Marigot'>
+      <_name>Atlantic Time</_name>
+      <offset>-4</offset>
+    </zone>
+  </country>
+  <country id='MG'>
+    <zone id='Indian/Antananarivo'>
+      <offset>+3</offset>
+    </zone>
+  </country>
+  <country id='MH'>
+    <zone id='Pacific/Majuro'>
+      <offset>+12</offset>
+      <obsoletes>Pacific/Kwajalein</obsoletes>
+    </zone>
+  </country>
+  <country id='MK'>
+    <zone id='Europe/Skopje'>
+      <offset>+1</offset>
+      <dst-offset>+2</dst-offset>
+    </zone>
+  </country>
+  <country id='ML'>
+    <zone id='Africa/Bamako'>
+      <offset>+0</offset>
+    </zone>
+  </country>
+  <country id='MM'>
+    <zone id='Asia/Rangoon'>
+      <offset>+6:30</offset>
+    </zone>
+  </country>
+  <country id='MN'>
+    <zone id='Asia/Choibalsan'>
+      <!-- Translators: This is the time zone used in the eastern part
+           of Mongolia. FIXME: Is there an official name for this
+           zone?
+      -->
+      <_name>Eastern Mongolia</_name>
+      <offset>+8</offset>
+    </zone>
+    <zone id='Asia/Hovd'>
+      <!-- Translators: This is the time zone used in the western part
+           of Mongolia. FIXME: Is there an official name for this
+           zone?
+      -->
+      <_name>Western Mongolia</_name>
+      <offset>+7</offset>
+    </zone>
+    <zone id='Asia/Ulaanbaatar'>
+      <!-- Translators: This is the time zone used in the central part
+           of Mongolia. FIXME: Is there an official name for this
+           zone?
+      -->
+      <_name>Central Mongolia</_name>
+      <offset>+8</offset>
+    </zone>
+  </country>
+  <country id='MO'>
+    <zone id='Asia/Macau'>
+      <offset>+8</offset>
+    </zone>
+  </country>
+  <country id='MP'>
+    <zone id='Pacific/Saipan'>
+      <offset>+10</offset>
+    </zone>
+  </country>
+  <country id='MQ'>
+    <zone id='America/Martinique'>
+      <_name>Atlantic Time</_name>
+      <offset>-4</offset>
+    </zone>
+  </country>
+  <country id='MR'>
+    <zone id='Africa/Nouakchott'>
+      <offset>+0</offset>
+    </zone>
+  </country>
+  <country id='MS'>
+    <zone id='America/Montserrat'>
+      <_name>Atlantic Time</_name>
+      <offset>-4</offset>
+    </zone>
+  </country>
+  <country id='MT'>
+    <zone id='Europe/Malta'>
+      <offset>+1</offset>
+      <dst-offset>+2</dst-offset>
+    </zone>
+  </country>
+  <country id='MU'>
+    <zone id='Indian/Mauritius'>
+      <offset>+4</offset>
+    </zone>
+  </country>
+  <country id='MV'>
+    <zone id='Indian/Maldives'>
+      <offset>+5</offset>
+    </zone>
+  </country>
+  <country id='MW'>
+    <zone id='Africa/Blantyre'>
+      <offset>+2</offset>
+    </zone>
+  </country>
+  <country id='MX'>
+    <!-- Note that descriptions of PST, MST, and CST appear above in
+         the entry for Canada, where the strings are first used.
+      -->
+    <zone id='America/Tijuana'>
+      <_name>Pacific Time</_name>
+      <offset>-8</offset>
+      <dst-offset>-7</dst-offset>
+    </zone>
+    <zone id='America/Mazatlan'>
+      <_name>Mountain Time</_name>
+      <offset>-7</offset>
+      <dst-offset>-6</dst-offset>
+      <obsoletes>America/Chihuahua</obsoletes>
+      <obsoletes>America/Hermosillo</obsoletes>
+    </zone>
+    <zone id='America/Mexico_City'>
+      <_name>Central Time</_name>
+      <offset>-6</offset>
+      <dst-offset>-5</dst-offset>
+      <obsoletes>America/Cancun</obsoletes>
+      <obsoletes>America/Merida</obsoletes>
+      <obsoletes>America/Monterrey</obsoletes>
+    </zone>
+  </country>
+  <country id='MY'>
+    <zone id='Asia/Kuala_Lumpur'>
+      <offset>+8</offset>
+      <obsoletes>Asia/Kuching</obsoletes>
+    </zone>
+  </country>
+  <country id='MZ'>
+    <zone id='Africa/Maputo'>
+      <offset>+2</offset>
+    </zone>
+  </country>
+  <country id='NA'>
+    <zone id='Africa/Windhoek'>
+      <offset>+1</offset>
+      <dst-offset>+2</dst-offset>
+    </zone>
+  </country>
+  <country id='NC'>
+    <zone id='Pacific/Noumea'>
+      <offset>+11</offset>
+    </zone>
+  </country>
+  <country id='NE'>
+    <zone id='Africa/Niamey'>
+      <offset>+1</offset>
+    </zone>
+  </country>
+  <country id='NF'>
+    <zone id='Pacific/Norfolk'>
+      <offset>+11:30</offset>
+    </zone>
+  </country>
+  <country id='NG'>
+    <zone id='Africa/Lagos'>
+      <offset>+1</offset>
+    </zone>
+  </country>
+  <country id='NI'>
+    <zone id='America/Managua'>
+      <offset>-6</offset>
+    </zone>
+  </country>
+  <country id='NL'>
+    <zone id='Europe/Amsterdam'>
+      <offset>+1</offset>
+      <dst-offset>+2</dst-offset>
+    </zone>
+  </country>
+  <country id='NO'>
+    <zone id='Europe/Oslo'>
+      <offset>+1</offset>
+      <dst-offset>+2</dst-offset>
+    </zone>
+  </country>
+  <country id='NP'>
+    <zone id='Asia/Katmandu'>
+      <offset>+5:45</offset>
+    </zone>
+  </country>
+  <country id='NR'>
+    <zone id='Pacific/Nauru'>
+      <offset>+12</offset>
+    </zone>
+  </country>
+  <country id='NU'>
+    <zone id='Pacific/Niue'>
+      <offset>-11</offset>
+    </zone>
+  </country>
+  <country id='NZ'>
+    <zone id='Pacific/Auckland'>
+      <!-- Translators: This refers to the "mainland" of New Zealand
+           (North Island and South Island), to distinguish it from the
+           Chatham Islands. The string is only used in places where
+           "New Zealand" is already clear from context. FIXME: is
+           there a better name for this?
+      -->
+      <_name>Main Islands</_name>
+      <offset>+12</offset>
+      <dst-offset>+13</dst-offset>
+    </zone>
+    <zone id='Pacific/Chatham'>
+      <!-- Translators: This refers to the time zone in the Chatham
+	   Islands of New Zealand.
+      -->
+      <_name>Chatham Islands</_name>
+      <offset>+12:45</offset>
+      <dst-offset>+13:45</dst-offset>
+    </zone>
+  </country>
+  <country id='OM'>
+    <zone id='Asia/Muscat'>
+      <offset>+4</offset>
+    </zone>
+  </country>
+  <country id='PA'>
+    <zone id='America/Panama'>
+      <offset>-5</offset>
+    </zone>
+  </country>
+  <country id='PE'>
+    <zone id='America/Lima'>
+      <offset>-5</offset>
+    </zone>
+  </country>
+  <country id='PF'>
+    <zone id='Pacific/Tahiti'>
+      <!-- Translators: This refers to the time zone in Tahiti and
+	   the surrounding "Society Islands" of French Polynesia.
+	   This string is only used in places where "French
+	   Polynesia" is already clear from context.
+      -->
+      <_name>Tahiti / Society Islands</_name>
+      <offset>-10</offset>
+    </zone>
+    <zone id='Pacific/Marquesas'>
+      <!-- Translators: This refers to the time zone in the
+	   Marquesas Islands of French Polynesia. This string is
+	   only used in places where "French Polynesia" is already
+	   clear from context.
+      -->
+      <_name>Marquesas Islands</_name>
+      <offset>-9:30</offset>
+    </zone>
+    <zone id='Pacific/Gambier'>
+      <!-- Translators: This refers to the time zone in the Gambier
+	   Islands of French Polynesia. This string is only used in
+	   places where "French Polynesia" is already clear from
+	   context.
+      -->
+      <_name>Gambier Islands</_name>
+      <offset>-9</offset>
+    </zone>
+  </country>
+  <country id='PG'>
+    <zone id='Pacific/Port_Moresby'>
+      <offset>+10</offset>
+    </zone>
+  </country>
+  <country id='PH'>
+    <zone id='Asia/Manila'>
+      <offset>+8</offset>
+    </zone>
+  </country>
+  <country id='PK'>
+    <zone id='Asia/Karachi'>
+      <offset>+5</offset>
+      <dst-offset>+6</dst-offset>
+    </zone>
+  </country>
+  <country id='PL'>
+    <zone id='Europe/Warsaw'>
+      <offset>+1</offset>
+      <dst-offset>+2</dst-offset>
+    </zone>
+  </country>
+  <country id='PM'>
+    <zone id='America/Miquelon'>
+      <offset>-3</offset>
+      <dst-offset>-2</dst-offset>
+    </zone>
+  </country>
+  <country id='PN'>
+    <zone id='Pacific/Pitcairn'>
+      <offset>+8</offset>
+    </zone>
+  </country>
+  <country id='PR'>
+    <zone id='America/Puerto_Rico'>
+      <_name>Atlantic Time</_name>
+      <offset>-4</offset>
+    </zone>
+  </country>
+  <country id='PS'>
+    <zone id='Asia/Gaza'>
+      <offset>+2</offset>
+      <dst-offset>+3</dst-offset>
+    </zone>
+  </country>
+  <country id='PT'>
+    <zone id='Atlantic/Azores'>
+      <!-- Translators: This refers to the time zone for the Azores.
+           The string is only used in places where "Portugal" is
+           already understood from context.
+        -->
+      <_name>Azores</_name>
+      <offset>-1</offset>
+      <dst-offset>+0</dst-offset>
+    </zone>
+    <zone id='Atlantic/Madeira'>
+      <!-- Translators: This refers to the time zone for the
+           Portuguese island of Madeira. The string is only used in
+           places where "Portugal" is already understood from context.
+      -->
+      <_name>Madeira</_name>
+      <offset>+0</offset>
+      <dst-offset>+1</dst-offset>
+    </zone>
+    <zone id='Europe/Lisbon'>
+      <!-- Translators: This refers to the time zone for mainland
+	   Portugal (as opposed to the time zone for the Azores).
+      -->
+      <_name>Mainland Portugal</_name>
+      <offset>+0</offset>
+      <dst-offset>+1</dst-offset>
+    </zone>
+  </country>
+  <country id='PW'>
+    <zone id='Pacific/Palau'>
+      <offset>+9</offset>
+    </zone>
+  </country>
+  <country id='PY'>
+    <zone id='America/Asuncion'>
+      <offset>-4</offset>
+      <dst-offset>-3</dst-offset>
+    </zone>
+  </country>
+  <country id='QA'>
+    <zone id='Asia/Qatar'>
+      <offset>+3</offset>
+    </zone>
+  </country>
+  <country id='RE'>
+    <zone id='Indian/Reunion'>
+      <offset>+4</offset>
+    </zone>
+  </country>
+  <country id='RO'>
+    <zone id='Europe/Bucharest'>
+      <offset>+2</offset>
+      <dst-offset>+3</dst-offset>
+    </zone>
+  </country>
+  <country id='RS'>
+    <zone id='Europe/Belgrade'>
+      <offset>+1</offset>
+      <dst-offset>+2</dst-offset>
+    </zone>
+  </country>
+  <country id='RU'>
+    <zone id='Europe/Kaliningrad'>
+      <!-- Translators: This is a Russian time zone, used in the city
+	   and oblast of Kaliningrad on the Baltic sea. The Russian
+	   name is "Калининградское время". This string is only used
+	   in places where "Russia" is already clear from context.
+      -->
+      <_name>Kaliningrad Time</_name>
+      <offset>+2</offset>
+      <dst-offset>+3</dst-offset>
+    </zone>
+    <zone id='Europe/Moscow'>
+      <!-- Translators: This is a Russian time zone, used in most of
+	   the European part of Russia, including Moscow. The Russian
+	   name is "Московское время". This string is only used in
+	   places where "Russia" is already clear from context.
+      -->
+      <_name>Moscow Time</_name>
+      <offset>+3</offset>
+      <dst-offset>+4</dst-offset>
+      <obsoletes>Europe/Volgograd</obsoletes>
+    </zone>
+    <zone id='Europe/Samara'>
+      <!-- Translators: This is a Russian time zone, used in the
+	   Samara oblast and Udmurtia, on the eastern edge of European
+	   Russia. The Russian name is "Самарское время". This string
+	   is only used in places where "Russia" is already clear from
+	   context.
+      -->
+      <_name>Samara Time</_name>
+      <offset>+4</offset>
+      <dst-offset>+5</dst-offset>
+    </zone>
+    <zone id='Asia/Yekaterinburg'>
+      <!-- Translators: This is a Russian time zone, used along the
+	   Ural mountains, including the city of Yekaterinburg. The
+	   Russian name is "Екатеринбургское время". This string is
+	   only used in places where "Russia" is already clear from
+	   context.
+      -->
+      <_name>Yekaterinburg Time</_name>
+      <offset>+5</offset>
+      <dst-offset>+6</dst-offset>
+    </zone>
+    <zone id='Asia/Omsk'>
+      <!-- Translators: This is a Russian time zone, used in the Omsk
+	   and Novosibirsk oblasts and surrounding areas of
+	   south-central Russia. The Russian name is "Омское время".
+	   This string is only used in places where "Russia" is
+	   already clear from context.
+      -->
+      <_name>Omsk Time</_name>
+      <offset>+6</offset>
+      <dst-offset>+7</dst-offset>
+      <obsoletes>Asia/Novosibirsk</obsoletes>
+    </zone>
+    <zone id='Asia/Krasnoyarsk'>
+      <!-- Translators: This is a Russian time zone, used in the
+	   Krasnoyarsk krai and surrounding areas of central Russia.
+	   The Russian name is "Красноярское время". This string is
+	   only used in places where "Russia" is already clear from
+	   context.
+      -->
+      <_name>Krasnoyarsk Time</_name>
+      <offset>+7</offset>
+      <dst-offset>+8</dst-offset>
+    </zone>
+    <zone id='Asia/Irkutsk'>
+      <!-- Translators: This is a Russian time zone, used in the
+	   Irkutsk oblast and surrounding areas of south-central
+	   Russia. The Russian name is "Иркутское время". This string
+	   is only used in places where "Russia" is already clear from
+	   context.
+      -->
+      <_name>Irkutsk Time</_name>
+      <offset>+8</offset>
+      <dst-offset>+9</dst-offset>
+    </zone>
+    <zone id='Asia/Yakutsk'>
+      <!-- Translators: This is a Russian time zone, used in the city
+	   of Yakutsk and surrounding areas of east-central Russia.
+	   The Russian name is "Якутское время". This string is only
+	   used in places where "Russia" is already clear from
+	   context.
+      -->
+      <_name>Yakutsk Time</_name>
+      <offset>+9</offset>
+      <dst-offset>+10</dst-offset>
+    </zone>
+    <zone id='Asia/Vladivostok'>
+      <!-- Translators: This is a Russian time zone, used in the city
+	   of Vladivostok and surrounding areas of eastern Russia. The
+	   Russian name is "Владивостокское время". This string is
+	   only used in places where "Russia" is already clear from
+	   context.
+      -->
+      <_name>Vladivostok Time</_name>
+      <offset>+10</offset>
+      <dst-offset>+11</dst-offset>
+      <obsoletes>Asia/Sakhalin</obsoletes>
+    </zone>
+    <zone id='Asia/Magadan'>
+      <!-- Translators: This is a Russian time zone, used in the
+	   Magadan oblast and surrounding areas of eastern Russia. The
+	   Russian name is "Магаданское время". This string is only
+	   used in places where "Russia" is already clear from
+	   context.
+      -->
+      <_name>Magadan Time</_name>
+      <offset>+11</offset>
+      <dst-offset>+12</dst-offset>
+    </zone>
+    <zone id='Asia/Kamchatka'>
+      <!-- Translators: This is a Russian time zone, used in the
+	   Kamchatka krai and Chukotka okrug of far-eastern Russia.
+	   The Russian name is "Камчатское время". This string is only
+	   used in places where "Russia" is already clear from
+	   context.
+      -->
+      <_name>Kamchatka Time</_name>
+      <offset>+12</offset>
+      <dst-offset>+13</dst-offset>
+      <obsoletes>Asia/Anadyr</obsoletes>
+    </zone>
+  </country>
+  <country id='RW'>
+    <zone id='Africa/Kigali'>
+      <offset>+2</offset>
+    </zone>
+  </country>
+  <country id='SA'>
+    <zone id='Asia/Riyadh'>
+      <offset>+3</offset>
+    </zone>
+  </country>
+  <country id='SB'>
+    <zone id='Pacific/Guadalcanal'>
+      <offset>+11</offset>
+    </zone>
+  </country>
+  <country id='SC'>
+    <zone id='Indian/Mahe'>
+      <offset>+4</offset>
+    </zone>
+  </country>
+  <country id='SD'>
+    <zone id='Africa/Khartoum'>
+      <offset>+3</offset>
+    </zone>
+  </country>
+  <country id='SE'>
+    <zone id='Europe/Stockholm'>
+      <offset>+1</offset>
+      <dst-offset>+2</dst-offset>
+    </zone>
+  </country>
+  <country id='SG'>
+    <zone id='Asia/Singapore'>
+      <offset>+8</offset>
+    </zone>
+  </country>
+  <country id='SH'>
+    <zone id='Atlantic/St_Helena'>
+      <offset>+0</offset>
+    </zone>
+  </country>
+  <country id='SI'>
+    <zone id='Europe/Ljubljana'>
+      <offset>+1</offset>
+      <dst-offset>+2</dst-offset>
+    </zone>
+  </country>
+  <country id='SJ'>
+    <zone id='Arctic/Longyearbyen'>
+      <offset>+1</offset>
+      <dst-offset>+2</dst-offset>
+    </zone>
+  </country>
+  <country id='SK'>
+    <zone id='Europe/Bratislava'>
+      <offset>+1</offset>
+      <dst-offset>+2</dst-offset>
+    </zone>
+  </country>
+  <country id='SL'>
+    <zone id='Africa/Freetown'>
+      <offset>+0</offset>
+    </zone>
+  </country>
+  <country id='SM'>
+    <zone id='Europe/San_Marino'>
+      <offset>+1</offset>
+      <dst-offset>+2</dst-offset>
+    </zone>
+  </country>
+  <country id='SN'>
+    <zone id='Africa/Dakar'>
+      <offset>+0</offset>
+    </zone>
+  </country>
+  <country id='SO'>
+    <zone id='Africa/Mogadishu'>
+      <offset>+3</offset>
+    </zone>
+  </country>
+  <country id='SR'>
+    <zone id='America/Paramaribo'>
+      <offset>-3</offset>
+    </zone>
+  </country>
+  <country id='ST'>
+    <zone id='Africa/Sao_Tome'>
+      <offset>+0</offset>
+    </zone>
+  </country>
+  <country id='SV'>
+    <zone id='America/El_Salvador'>
+      <offset>-6</offset>
+    </zone>
+  </country>
+  <country id='SY'>
+    <zone id='Asia/Damascus'>
+      <offset>+2</offset>
+      <dst-offset>+3</dst-offset>
+    </zone>
+  </country>
+  <country id='SZ'>
+    <zone id='Africa/Mbabane'>
+      <offset>+2</offset>
+    </zone>
+  </country>
+  <country id='TC'>
+    <zone id='America/Grand_Turk'>
+      <_name>Eastern Time</_name>
+      <offset>-5</offset>
+      <dst-offset>-4</dst-offset>
+    </zone>
+  </country>
+  <country id='TD'>
+    <zone id='Africa/Ndjamena'>
+      <offset>+1</offset>
+    </zone>
+  </country>
+  <country id='TF'>
+    <zone id='Indian/Kerguelen'>
+      <offset>+5</offset>
+    </zone>
+  </country>
+  <country id='TG'>
+    <zone id='Africa/Lome'>
+      <offset>+0</offset>
+    </zone>
+  </country>
+  <country id='TH'>
+    <zone id='Asia/Bangkok'>
+      <offset>+7</offset>
+    </zone>
+  </country>
+  <country id='TJ'>
+    <zone id='Asia/Dushanbe'>
+      <offset>+5</offset>
+    </zone>
+  </country>
+  <country id='TK'>
+    <zone id='Pacific/Fakaofo'>
+      <offset>-10</offset>
+    </zone>
+  </country>
+  <country id='TL'>
+    <zone id='Asia/Dili'>
+      <offset>+9</offset>
+    </zone>
+  </country>
+  <country id='TM'>
+    <zone id='Asia/Ashgabat'>
+      <offset>+5</offset>
+    </zone>
+  </country>
+  <country id='TN'>
+    <zone id='Africa/Tunis'>
+      <offset>+1</offset>
+      <dst-offset>+2</dst-offset>
+    </zone>
+  </country>
+  <country id='TO'>
+    <zone id='Pacific/Tongatapu'>
+      <offset>+13</offset>
+    </zone>
+  </country>
+  <country id='TR'>
+    <zone id='Europe/Istanbul'>
+      <offset>+2</offset>
+      <dst-offset>+3</dst-offset>
+    </zone>
+  </country>
+  <country id='TT'>
+    <zone id='America/Port_of_Spain'>
+      <offset>-4</offset>
+    </zone>
+  </country>
+  <country id='TV'>
+    <zone id='Pacific/Funafuti'>
+      <offset>+12</offset>
+    </zone>
+  </country>
+  <country id='TW'>
+    <zone id='Asia/Taipei'>
+      <offset>+8</offset>
+    </zone>
+  </country>
+  <country id='TZ'>
+    <zone id='Africa/Dar_es_Salaam'>
+      <offset>+3</offset>
+    </zone>
+  </country>
+  <country id='UA'>
+    <zone id='Europe/Kiev'>
+      <offset>+2</offset>
+      <dst-offset>+3</dst-offset>
+      <obsoletes>Europe/Simferopol</obsoletes>
+      <obsoletes>Europe/Uzhgorod</obsoletes>
+      <obsoletes>Europe/Zaporozhye</obsoletes>
+    </zone>
+  </country>
+  <country id='UG'>
+    <zone id='Africa/Kampala'>
+      <offset>+3</offset>
+    </zone>
+  </country>
+  <country id='UM'>
+    <zone id='Pacific/Johnston'>
+      <!-- Translators: This is the time zone for the Johnston Atoll
+	   in the United States Minor Outlying Islands, which keeps
+	   the same time as the US state of Hawaii. The string is only
+	   used in places where "US Minor Outlying Islands" is already
+	   clear from context.
+      -->
+      <_name>Johnston Atoll (Hawaii Time)</_name>
+      <offset>-10</offset>
+    </zone>
+    <zone id='Pacific/Midway'>
+      <!-- Translators: This is the time zone for the Midway Atoll in
+	   the United States Minor Outlying Islands, which uses the
+	   same time as American Samoa. The string is only used in
+	   places where "US Minor Outlying Islands" is already clear
+	   from context.
+      -->
+      <_name>Midway Atoll (Samoa Time)</_name>
+      <offset>-11</offset>
+    </zone>
+    <zone id='Pacific/Wake'>
+      <!-- Translators: This is the time zone for Wake Island in the
+	   United States Minor Outlying Islands. The string is only
+	   used in places where "US Minor Outlying Islands" is already
+	   clear from context.
+      -->
+      <_name>Wake Island</_name>
+      <offset>+12</offset>
+    </zone>
+  </country>
+  <country id='US'>
+    <!-- Note that descriptions of PST, MST, CST, and EST appear above
+         in the entry for Canada, where the strings are first used.
+      -->
+
+    <zone id='America/Adak'>
+      <!-- Translators: "Hawaiian-Aleutian Time" is the official name
+	   of the time zone used in Hawaii and the Aleutian Islands of
+	   Alaska in the United States. This string is for the time
+	   zone as it is observed in the Aleutian Islands (with
+	   Daylight Saving Time). It is only used in places where
+	   "United States" is already clear from context.
+      -->
+      <_name>Hawaiian-Aleutian Time (Aleutian Islands)</_name>
+      <offset>-10</offset>
+      <dst-offset>-9</dst-offset>
+    </zone>
+    <zone id='Pacific/Honolulu'>
+      <!-- Translators: "Hawaiian-Aleutian Time" is the official name
+	   of the time zone used in Hawaii and the Aleutian Islands of
+	   Alaska in the United States. This string is for the time
+	   zone as it is observed in Hawaii, where they do not use
+	   Daylight Saving Time. It is only used in places where
+	   "United States" is already clear from context.
+      -->
+      <_name>Hawaiian-Aleutian Time, no DST (Hawaii)</_name>
+      <offset>-10</offset>
+    </zone>
+    <zone id='America/Anchorage'>
+      <!-- Translators: This is the time zone used in the majority of
+	   Alaska in the United States. The string is only used in
+	   places where "United States" is already clear from context.
+      -->
+      <_name>Alaska Time</_name>
+      <offset>-9</offset>
+      <dst-offset>-8</dst-offset>
+      <obsoletes>America/Juneau</obsoletes>
+      <obsoletes>America/Nome</obsoletes>
+      <obsoletes>America/Yakutat</obsoletes>
+    </zone>
+    <zone id='America/Los_Angeles'>
+      <_name>Pacific Time</_name>
+      <offset>-8</offset>
+      <dst-offset>-7</dst-offset>
+    </zone>
+    <zone id='America/Denver'>
+      <_name>Mountain Time</_name>
+      <offset>-7</offset>
+      <dst-offset>-6</dst-offset>
+      <obsoletes>America/Boise</obsoletes>
+      <obsoletes>America/Shiprock</obsoletes>
+    </zone>
+    <zone id='America/Phoenix'>
+      <!-- Translators: This represents the time zone in the US state
+	   of Arizona, which is part of the "Mountain Time" zone, but
+	   does not observe Daylight Saving Time with the rest of the
+	   zone. The string is only used in places where "United
+	   States" is already clear from context.
+      -->
+      <_name>Mountain Time, no DST (Arizona)</_name>
+      <offset>-7</offset>
+    </zone>
+    <zone id='America/Chicago'>
+      <_name>Central Time</_name>
+      <offset>-6</offset>
+      <dst-offset>-5</dst-offset>
+      <obsoletes>America/Indiana/Knox</obsoletes>
+      <obsoletes>America/Indiana/Tell_City</obsoletes>
+      <obsoletes>America/Menominee</obsoletes> <!-- doot DOOO do do doo! -->
+      <obsoletes>America/North_Dakota/Center</obsoletes>
+      <obsoletes>America/North_Dakota/New_Salem</obsoletes>
+    </zone>
+    <zone id='America/New_York'>
+      <_name>Eastern Time</_name>
+      <offset>-5</offset>
+      <dst-offset>-4</dst-offset>
+      <obsoletes>America/Detroit</obsoletes>
+      <obsoletes>America/Indiana/Indianapolis</obsoletes>
+      <obsoletes>America/Indiana/Marengo</obsoletes>
+      <obsoletes>America/Indiana/Petersburg</obsoletes>
+      <obsoletes>America/Indiana/Vevay</obsoletes>
+      <obsoletes>America/Indiana/Vincennes</obsoletes>
+      <obsoletes>America/Indiana/Winamac</obsoletes>
+      <obsoletes>America/Kentucky/Louisville</obsoletes>
+      <obsoletes>America/Kentucky/Monticello</obsoletes>
+    </zone>
+  </country>
+  <country id='UY'>
+    <zone id='America/Montevideo'>
+      <offset>-3</offset>
+      <dst-offset>-2</dst-offset>
+    </zone>
+  </country>
+  <country id='UZ'>
+    <zone id='Asia/Tashkent'>
+      <offset>+5</offset>
+      <obsoletes>Asia/Samarkand</obsoletes>
+    </zone>
+  </country>
+  <country id='VA'>
+    <zone id='Europe/Vatican'>
+      <offset>+1</offset>
+      <dst-offset>+2</dst-offset>
+    </zone>
+  </country>
+  <country id='VC'>
+    <zone id='America/St_Vincent'>
+      <_name>Atlantic Time</_name>
+      <offset>-4</offset>
+    </zone>
+  </country>
+  <country id='VE'>
+    <zone id='America/Caracas'>
+      <offset>-5:30</offset>
+    </zone>
+  </country>
+  <country id='VG'>
+    <zone id='America/Tortola'>
+      <_name>Atlantic Time</_name>
+      <offset>-4</offset>
+    </zone>
+  </country>
+  <country id='VI'>
+    <zone id='America/St_Thomas'>
+      <_name>Atlantic Time</_name>
+      <offset>-4</offset>
+    </zone>
+  </country>
+  <country id='VN'>
+    <zone id='Asia/Ho_Chi_Minh'>
+      <offset>+7</offset>
+    </zone>
+  </country>
+  <country id='VU'>
+    <zone id='Pacific/Efate'>
+      <offset>+11</offset>
+    </zone>
+  </country>
+  <country id='WF'>
+    <zone id='Pacific/Wallis'>
+      <offset>+12</offset>
+    </zone>
+  </country>
+  <country id='WS'>
+    <zone id='Pacific/Apia'>
+      <offset>-11</offset>
+    </zone>
+  </country>
+  <country id='YE'>
+    <zone id='Asia/Aden'>
+      <offset>+3</offset>
+    </zone>
+  </country>
+  <country id='YT'>
+    <zone id='Indian/Mayotte'>
+      <offset>+3</offset>
+    </zone>
+  </country>
+  <country id='ZA'>
+    <zone id='Africa/Johannesburg'>
+      <offset>+2</offset>
+    </zone>
+  </country>
+  <country id='ZM'>
+    <zone id='Africa/Lusaka'>
+      <offset>+2</offset>
+    </zone>
+  </country>
+  <country id='ZW'>
+    <zone id='Africa/Harare'>
+      <offset>+2</offset>
+    </zone>
+  </country>
+</timezones>
Index: libgweather/timezone-menu.h
===================================================================
--- libgweather/timezone-menu.h	(revision 0)
+++ libgweather/timezone-menu.h	(revision 0)
@@ -0,0 +1,36 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 4 -*- */
+
+#ifndef GWEATHER_TIMEZONE_MENU_H
+#define GWEATHER_TIMEZONE_MENU_H 1
+
+#include <gtk/gtk.h>
+#include <libgweather/weather.h>
+
+#define GWEATHER_TYPE_TIMEZONE_MENU            (gweather_timezone_menu_get_type ())
+#define GWEATHER_TIMEZONE_MENU(object)         (G_TYPE_CHECK_INSTANCE_CAST ((object), GWEATHER_TYPE_TIMEZONE_MENU, GWeatherTimezoneMenu))
+#define GWEATHER_TIMEZONE_MENU_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass), GWEATHER_TYPE_TIMEZONE_MENU, GWeatherTimezoneMenuClass))
+#define GWEATHER_IS_TIMEZONE_MENU(object)      (G_TYPE_CHECK_INSTANCE_TYPE ((object), GWEATHER_TYPE_TIMEZONE_MENU))
+#define GWEATHER_IS_TIMEZONE_MENU_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GWEATHER_TYPE_TIMEZONE_MENU))
+#define GWEATHER_TIMEZONE_MENU_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj), GWEATHER_TYPE_TIMEZONE_MENU, GWeatherTimezoneMenuClass))
+
+typedef struct {
+    GtkComboBox parent;
+
+    /*< private >*/
+    char *tzid, *country_code;
+} GWeatherTimezoneMenu;
+
+typedef struct {
+    GtkComboBoxClass parent_class;
+
+} GWeatherTimezoneMenuClass;
+
+GType       gweather_timezone_menu_get_type         (void);
+
+GtkWidget  *gweather_timezone_menu_new              (void);
+
+void        gweather_timezone_menu_set_timezone     (GWeatherTimezoneMenu *menu,
+						     const char           *tzid);
+const char *gweather_timezone_menu_get_timezone     (GWeatherTimezoneMenu *menu);
+
+#endif
Index: libgweather/timezone-menu.c
===================================================================
--- libgweather/timezone-menu.c	(revision 0)
+++ libgweather/timezone-menu.c	(revision 0)
@@ -0,0 +1,500 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 4 -*- */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#define GWEATHER_I_KNOW_THIS_IS_UNSTABLE
+#include "timezone-menu.h"
+#include "gweather-xml.h"
+#include "xml-utils.h"
+
+#include <string.h>
+#include <libxml/xmlreader.h>
+
+G_DEFINE_TYPE (GWeatherTimezoneMenu, gweather_timezone_menu, GTK_TYPE_COMBO_BOX)
+
+enum {
+    PROP_0,
+
+    PROP_TZID,
+    PROP_COUNTRY_CODE,
+
+    LAST_PROP
+};
+
+static void set_property (GObject *object, guint prop_id,
+			  const GValue *value, GParamSpec *pspec);
+static void get_property (GObject *object, guint prop_id,
+			  GValue *value, GParamSpec *pspec);
+
+static void changed      (GtkComboBox *combo);
+
+static GtkTreeModel *gweather_timezone_model_new (void);
+static void is_sensitive (GtkCellLayout *cell_layout, GtkCellRenderer *cell,
+			  GtkTreeModel *tree_model, GtkTreeIter *iter, gpointer data);
+
+static void
+gweather_timezone_menu_init (GWeatherTimezoneMenu *menu)
+{
+    GtkTreeModel *model;
+    GtkCellRenderer *renderer;
+
+    model = gweather_timezone_model_new ();
+    gtk_combo_box_set_model (GTK_COMBO_BOX (menu), model);
+    g_object_unref (model);
+
+    renderer = gtk_cell_renderer_text_new ();
+    gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (menu), renderer, TRUE);
+    gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (menu), renderer,
+				    "text", 0,
+				    NULL);
+    gtk_cell_layout_set_cell_data_func (GTK_CELL_LAYOUT (menu),
+					renderer, is_sensitive, NULL, NULL);
+}
+
+static void
+finalize (GObject *object)
+{
+    GWeatherTimezoneMenu *menu = GWEATHER_TIMEZONE_MENU (object);
+
+    if (menu->tzid)
+	g_free (menu->tzid);
+    if (menu->country_code)
+	g_free (menu->country_code);
+
+    G_OBJECT_CLASS (gweather_timezone_menu_parent_class)->finalize (object);
+}
+
+static void
+gweather_timezone_menu_class_init (GWeatherTimezoneMenuClass *timezone_menu_class)
+{
+    GObjectClass *object_class = G_OBJECT_CLASS (timezone_menu_class);
+    GtkComboBoxClass *combo_class = GTK_COMBO_BOX_CLASS (timezone_menu_class);
+
+    object_class->finalize = finalize;
+    object_class->set_property = set_property;
+    object_class->get_property = get_property;
+
+    combo_class->changed = changed;
+
+    /* properties */
+    g_object_class_install_property (
+	object_class, PROP_TZID,
+	g_param_spec_string ("tzid",
+			     "TZID",
+			     "The selected TZID",
+			     NULL,
+			     G_PARAM_READWRITE));
+    g_object_class_install_property (
+	object_class, PROP_COUNTRY_CODE,
+	g_param_spec_string ("country-code",
+			     "Country code",
+			     "The ISO country code associated with the tzid",
+			     NULL,
+			     G_PARAM_READABLE));
+}
+
+static void
+set_property (GObject *object, guint prop_id,
+	      const GValue *value, GParamSpec *pspec)
+{
+    switch (prop_id) {
+    case PROP_TZID:
+	gweather_timezone_menu_set_timezone (GWEATHER_TIMEZONE_MENU (object),
+					     g_value_get_string (value));
+	break;
+    default:
+	G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+	break;
+    }
+}
+
+static void
+get_property (GObject *object, guint prop_id,
+	      GValue *value, GParamSpec *pspec)
+{
+    GWeatherTimezoneMenu *menu = GWEATHER_TIMEZONE_MENU (object);
+
+    switch (prop_id) {
+    case PROP_TZID:
+	g_value_set_string (value, menu->tzid);
+	break;
+    case PROP_COUNTRY_CODE:
+	g_value_set_string (value, menu->country_code);
+	break;
+    default:
+	G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+	break;
+    }
+}
+
+enum {
+    GWEATHER_TIMEZONE_MENU_NAME,
+    GWEATHER_TIMEZONE_MENU_COUNTRY_CODE,
+    GWEATHER_TIMEZONE_MENU_TZID
+};
+
+static void
+changed (GtkComboBox *combo)
+{
+    GWeatherTimezoneMenu *menu = GWEATHER_TIMEZONE_MENU (combo);
+    GtkTreeIter iter;
+
+    if (menu->tzid)
+	g_free (menu->tzid);
+    if (menu->country_code)
+	g_free (menu->country_code);
+
+    gtk_combo_box_get_active_iter (combo, &iter);
+    gtk_tree_model_get (gtk_combo_box_get_model (combo), &iter,
+			GWEATHER_TIMEZONE_MENU_COUNTRY_CODE, &menu->country_code,
+			GWEATHER_TIMEZONE_MENU_TZID, &menu->tzid,
+			-1);
+    g_object_notify (G_OBJECT (combo), "tzid");
+    g_object_notify (G_OBJECT (combo), "country-code");
+}
+
+typedef struct {
+    GtkComboBox *combo;
+    const char  *tzid;
+} SetTimezoneData;
+
+static gboolean check_tzid (GtkTreeModel *model, GtkTreePath *path,
+			    GtkTreeIter *iter, gpointer data)
+{
+    SetTimezoneData *tzd = data;
+    char *iter_tzid;
+
+    gtk_tree_model_get (model, iter,
+			GWEATHER_TIMEZONE_MENU_TZID, &iter_tzid,
+			-1);
+    if (!iter_tzid)
+	return FALSE;
+
+    if (!strcmp (iter_tzid, tzd->tzid)) {
+	gtk_combo_box_set_active_iter (tzd->combo, iter);
+	g_free (iter_tzid);
+	return TRUE;
+    } else {
+	g_free (iter_tzid);
+	return FALSE;
+    }
+}
+
+void
+gweather_timezone_menu_set_timezone (GWeatherTimezoneMenu *menu,
+				     const char           *tzid)
+{
+    SetTimezoneData tzd;
+
+    tzd.combo = GTK_COMBO_BOX (menu);
+    tzd.tzid = tzid;
+    gtk_tree_model_foreach (gtk_combo_box_get_model (tzd.combo),
+			    check_tzid, &tzd);
+}
+
+const char *
+gweather_timezone_menu_get_timezone (GWeatherTimezoneMenu *menu)
+{
+    return menu->tzid;
+}
+
+typedef struct {
+    char *id, *offset, *description;
+} Zone;
+
+typedef struct {
+    char *name, *code;
+    GPtrArray *zones;
+} Country;
+
+static Country **countries;
+static int num_countries;
+
+static void
+append_offset (GString *desc, const char *offset)
+{
+    int hours, minutes;
+    char *p;
+
+    hours = strtoul (offset, &p, 10);
+    if (p && *p == ':')
+	minutes = strtoul (p + 1, NULL, 10);
+    else
+	minutes = 0;
+
+    if (minutes)
+	g_string_append_printf (desc, "GMT%+d:%02d", hours, minutes);
+    else if (hours)
+	g_string_append_printf (desc, "GMT%+d", hours);
+    else
+	g_string_append (desc, "GMT");
+}
+
+static Zone *
+parse_zone (xmlTextReader *xml)
+{
+    char *id, *name = NULL;
+    char *offset = NULL, *dst_offset = NULL;
+    Zone *z = NULL;
+
+    id = (char *) xmlTextReaderGetAttribute (xml, (xmlChar *) "id");
+    if (!id) {
+	xmlTextReaderNext (xml);
+	return NULL;
+    }
+    if (xmlTextReaderRead (xml) != 1) {
+	xmlFree (id);
+	return NULL;
+    }
+
+    while (xmlTextReaderNodeType (xml) != XML_READER_TYPE_END_ELEMENT) {
+	if (xmlTextReaderNodeType (xml) != XML_READER_TYPE_ELEMENT) {
+	    if (xmlTextReaderRead (xml) != 1)
+		break;
+	    continue;
+	}
+
+	if (!strcmp ((const char *) xmlTextReaderConstName (xml), "name") ||
+	    /* FIXME */
+	    !strcmp ((const char *) xmlTextReaderConstName (xml), "_name"))
+	    name = gweather_xml_get_localized_value (xml);
+	else if (!strcmp ((const char *) xmlTextReaderConstName (xml), "offset"))
+	    offset = gweather_xml_get_value (xml);
+	else if (!strcmp ((const char *) xmlTextReaderConstName (xml), "dst-offset"))
+	    dst_offset = gweather_xml_get_value (xml);
+	else {
+	    if (xmlTextReaderNext (xml) != 1 || xmlTextReaderRead (xml) != 1)
+		break;
+	}
+    }
+
+    if (offset) {
+	GString *desc;
+
+	z = g_slice_new0 (Zone);
+	z->id = g_strdup (id);
+
+	desc = g_string_new (NULL);
+	append_offset (desc, offset);
+	if (dst_offset) {
+	    g_string_append (desc, " / ");
+	    append_offset (desc, dst_offset);
+	}
+	z->offset = g_strdup (desc->str);
+
+	if (name) {
+	    g_string_prepend (desc, " (");
+	    g_string_prepend (desc, name);
+	} else
+	    g_string_prepend (desc, "(");
+	g_string_append (desc, ")");
+	z->description = g_string_free (desc, FALSE);
+    }
+
+    xmlFree (id);
+    if (name)
+	xmlFree (name);
+    if (offset)
+	xmlFree (offset);
+    if (dst_offset)
+	xmlFree (dst_offset);
+
+    return z;
+}
+
+static void
+parse_timezone_country (xmlTextReader *xml, Country *c)
+{
+    Zone *z;
+
+    while (xmlTextReaderRead (xml) == 1 &&
+	   xmlTextReaderNodeType (xml) != XML_READER_TYPE_END_ELEMENT) {
+	if (xmlTextReaderNodeType (xml) != XML_READER_TYPE_ELEMENT)
+	    continue;
+	if (strcmp ((const char *) xmlTextReaderConstName (xml), "zone") != 0) {
+	    xmlTextReaderNext (xml);
+	    continue;
+	}
+
+	z = parse_zone (xml);
+	if (z)
+	    g_ptr_array_add (c->zones, z);
+    }
+}
+
+static int
+compare_countries (gconstpointer a, gconstpointer b)
+{
+    Country **ca = (Country **)a;
+    Country **cb = (Country **)b;
+
+    return g_utf8_collate ((*ca)->name, (*cb)->name);
+}
+
+static gboolean
+find_countries (GtkTreeModel *model, GtkTreePath *path,
+		GtkTreeIter *iter, gpointer user_data)
+{
+    GHashTable *country_hash = user_data;
+    WeatherLocation *loc;
+    Country *c;
+    GtkTreeIter child_iter, parent_iter;
+    int depth;
+
+    gtk_tree_model_get (model, iter,
+			GWEATHER_XML_COL_POINTER, &loc,
+			-1);
+    if (loc && loc->country_code &&
+	!g_hash_table_lookup (country_hash, loc->country_code)) {
+	c = g_slice_new0 (Country);
+
+	/* The country name is the COL_LOC value of the ancestor of
+	 * this node with depth 2...
+	 */
+	depth = gtk_tree_path_get_depth (path);
+	child_iter = *iter;
+	while (depth > 2) {
+	    gtk_tree_model_iter_parent (model, &parent_iter, &child_iter);
+	    child_iter = parent_iter;
+	    depth--;
+	}
+	gtk_tree_model_get (model, &parent_iter,
+			    GWEATHER_XML_COL_LOC, &c->name,
+			    -1);
+
+	c->code = g_strdup (loc->country_code);
+	c->zones = g_ptr_array_new ();
+	g_hash_table_insert (country_hash, c->code, c);
+    }
+
+    return FALSE;
+}
+
+static void
+init_from_xml (void)
+{
+    GtkTreeModel *model;
+    GHashTable *country_hash;
+    GPtrArray *country_array;
+    GHashTableIter iter;
+    gpointer key, value;
+    xmlTextReader *xml;
+    char *id;
+    Country *c;
+
+    country_hash = g_hash_table_new (g_str_hash, g_str_equal);
+    country_array = g_ptr_array_new ();
+
+    /* Parse Locations.xml into a GtkTreeModel and then extract the info
+     * we need out of that.
+     */
+    model = gweather_xml_load_locations ();
+    g_return_if_fail (model != NULL);
+
+    gtk_tree_model_foreach (model, find_countries, country_hash);
+    g_object_unref (model);
+
+    g_hash_table_iter_init (&iter, country_hash);
+    while (g_hash_table_iter_next (&iter, &key, &value))
+	g_ptr_array_add (country_array, value);
+    g_ptr_array_sort (country_array, compare_countries);
+
+    /* Parse timezones.xml */
+    /* FIXME: use the installed file */
+    xml = xmlNewTextReaderFilename ("../data/timezones.xml");
+    g_return_if_fail (xml != NULL);
+
+    while (xmlTextReaderRead (xml) == 1) {
+	if (xmlTextReaderNodeType (xml) != XML_READER_TYPE_ELEMENT)
+	    continue;
+	if (strcmp ((const char *) xmlTextReaderConstName (xml), "country") != 0)
+	    continue;
+
+	id = (char *) xmlTextReaderGetAttribute (xml, (xmlChar *) "id");
+	if (!id)
+	    continue;
+
+	c = g_hash_table_lookup (country_hash, id);
+	xmlFree (id);
+	if (!c)
+	    continue;
+	parse_timezone_country (xml, c);
+    }
+
+    xmlFreeTextReader (xml);
+    g_hash_table_destroy (country_hash);
+
+    num_countries = country_array->len;
+    countries = (Country **)g_ptr_array_free (country_array, FALSE);
+}
+
+static GtkTreeModel *
+gweather_timezone_model_new (void)
+{
+    GtkTreeStore *store;
+    GtkTreeModel *model;
+    GtkTreeIter iter;
+    Zone *zone;
+    char *name;
+    int i, j;
+
+    if (num_countries == 0)
+	init_from_xml ();
+
+    store = gtk_tree_store_new (3, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING);
+    model = GTK_TREE_MODEL (store);
+
+    for (i = 0; i < num_countries; i++) {
+	if (countries[i]->zones->len == 0)
+	    continue;
+	else if (countries[i]->zones->len == 1) {
+	    zone = countries[i]->zones->pdata[0];
+	    name = g_strdup_printf ("%s (%s)", countries[i]->name,
+				    zone->offset);
+	    gtk_tree_store_append (store, &iter, NULL);
+	    gtk_tree_store_set (store, &iter,
+				GWEATHER_TIMEZONE_MENU_NAME, name,
+				GWEATHER_TIMEZONE_MENU_COUNTRY_CODE, countries[i]->code,
+				GWEATHER_TIMEZONE_MENU_TZID, zone->id,
+				-1);
+	    g_free (name);
+	} else {
+	    GtkTreeIter country;
+
+	    gtk_tree_store_append (store, &country, NULL);
+	    gtk_tree_store_set (store, &country,
+				0, countries[i]->name,
+				1, countries[i]->code,
+				-1);
+	    for (j = 0; j < countries[i]->zones->len; j++) {
+		zone = countries[i]->zones->pdata[j];
+		gtk_tree_store_append (store, &iter, &country);
+		gtk_tree_store_set (store, &iter,
+				    GWEATHER_TIMEZONE_MENU_NAME, zone->description,
+				    GWEATHER_TIMEZONE_MENU_COUNTRY_CODE, countries[i]->code,
+				    GWEATHER_TIMEZONE_MENU_TZID, zone->id,
+				    -1);
+	    }
+	}
+    }
+
+    return model;
+}
+
+static void
+is_sensitive (GtkCellLayout *cell_layout, GtkCellRenderer *cell,
+	      GtkTreeModel *tree_model, GtkTreeIter *iter, gpointer data)
+{
+    gboolean sensitive;
+
+    sensitive = !gtk_tree_model_iter_has_child (tree_model, iter);
+    g_object_set (cell, "sensitive", sensitive, NULL);
+}
+
+GtkWidget *
+gweather_timezone_menu_new (void)
+{
+    return g_object_new (GWEATHER_TYPE_TIMEZONE_MENU, NULL);
+}
Index: libgweather/xml-utils.h
===================================================================
--- libgweather/xml-utils.h	(revision 0)
+++ libgweather/xml-utils.h	(revision 0)
@@ -0,0 +1,11 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 4 -*- */
+
+#ifndef GWEATHER_XML_UTILS_H
+#define GWEATHER_XML_UTILS_H 1
+
+#include <libxml/xmlreader.h>
+
+char *gweather_xml_get_value           (xmlTextReaderPtr xml);
+char *gweather_xml_get_localized_value (xmlTextReaderPtr xml);
+
+#endif
Index: libgweather/xml-utils.c
===================================================================
--- libgweather/xml-utils.c	(revision 0)
+++ libgweather/xml-utils.c	(revision 0)
@@ -0,0 +1,127 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 4 -*- */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "xml-utils.h"
+
+#include <string.h>
+#include <glib.h>
+#include <libxml/xmlreader.h>
+
+/**
+ * gweather_xml_get_value:
+ * @xml: an #xmlTextReaderPtr
+ *
+ * Gets the text of the element whose start tag @xml is pointing to.
+ * Leaves @xml pointing at the next node after the element's end tag.
+ *
+ * Return value: the text of the current node, as a libxml-allocated
+ * string, or %NULL if the node is empty.
+ **/
+char *
+gweather_xml_get_value (xmlTextReaderPtr xml)
+{
+    char *value;
+
+    /* check for null node */
+    if (xmlTextReaderIsEmptyElement (xml))
+	return NULL;
+
+    /* the next "node" is the text node containing the value we want to get */
+    if (xmlTextReaderRead (xml) != 1)
+	return NULL;
+
+    value = (char *) xmlTextReaderValue (xml);
+
+    /* move on to the end of this node */
+    while (xmlTextReaderNodeType (xml) != XML_READER_TYPE_END_ELEMENT) {
+	if (xmlTextReaderRead (xml) != 1) {
+	    xmlFree (value);
+	    return NULL;
+	}
+    }
+
+    /* consume the end element too */
+    if (xmlTextReaderRead (xml) != 1) {
+	xmlFree (value);
+	return NULL;
+    }
+
+    return value;
+}
+
+/**
+ * gweather_xml_get_localized_value:
+ * @xml: an #xmlTextReaderPtr
+ *
+ * Looks at the name of the element @xml is currently pointing to, and
+ * returns the content of either that node, or a following node with
+ * the same name but an "xml:lang" attribute naming one of the locale
+ * languages. Leaves @xml pointing to the next node after the last
+ * consecutive element with the same name as the original element.
+ *
+ * Return value: the localized (or unlocalized) text, as a
+ * libxml-allocated string, or %NULL if the node is empty.
+ **/
+char *
+gweather_xml_get_localized_value (xmlTextReaderPtr xml)
+{
+    const char * const *locales;
+    const char *this_language;
+    int best_match = INT_MAX;
+    const char *lang;
+    char *tagname, *next_tagname;
+    gboolean keep_going;
+    char *name = NULL;
+    int i;
+
+    locales = g_get_language_names ();
+    tagname = (char *) xmlTextReaderName (xml);
+
+    do {
+	/* First let's get the language */
+	lang = (const char *) xmlTextReaderConstXmlLang (xml);
+
+	if (lang == NULL)
+	    this_language = "C";
+	else
+	    this_language = lang;
+
+	/* the next "node" is text node containing the actual name */
+	if (xmlTextReaderRead (xml) != 1) {
+	    if (name)
+		xmlFree (name);
+	    return NULL;
+	}
+
+	for (i = 0; locales[i] && i < best_match; i++) {
+	    if (!strcmp (locales[i], this_language)) {
+		/* if we've already encounted a less accurate
+		   translation, then free it */
+		g_free (name);
+
+		name = (char *) xmlTextReaderValue (xml);
+		best_match = i;
+
+		break;
+	    }
+	}
+
+	while (xmlTextReaderNodeType (xml) != XML_READER_TYPE_ELEMENT) {
+	    if (xmlTextReaderRead (xml) != 1) {
+		xmlFree (name);
+		return NULL;
+	    }
+	}
+
+	/* if the next tag has the same name then keep going */
+	next_tagname = (char *) xmlTextReaderName (xml);
+	keep_going = !strcmp (next_tagname, tagname);
+	xmlFree (next_tagname);
+
+    } while (keep_going);
+
+    return name;
+}
Index: libgweather/gweather-xml.c
===================================================================
--- libgweather/gweather-xml.c	(revision 227)
+++ libgweather/gweather-xml.c	(working copy)
@@ -72,6 +72,7 @@
 
 #define GWEATHER_I_KNOW_THIS_IS_UNSTABLE
 #include "gweather-xml.h"
+#include "xml-utils.h"
 
 static gint
 gweather_xml_location_sort_func( GtkTreeModel *model, GtkTreeIter *a,
@@ -97,101 +98,6 @@
     return res;
 }
  
-static char*
-gweather_xml_get_value( xmlTextReaderPtr xml )
-{
-  char* value;
-
-  /* check for null node */
-  if ( xmlTextReaderIsEmptyElement( xml ) )
-    return NULL;
-    
-  /* the next "node" is the text node containing the value we want to get */
-  if( xmlTextReaderRead( xml ) != 1 )
-    return NULL;
-
-  value = (char *) xmlTextReaderValue( xml );
-
-  /* move on to the end of this node */
-  while( xmlTextReaderNodeType( xml ) != XML_READER_TYPE_END_ELEMENT )
-    if( xmlTextReaderRead( xml ) != 1 )
-    {
-      xmlFree( value );
-      return NULL;
-    }
-
-  /* consume the end element too */
-  if( xmlTextReaderRead( xml ) != 1 )
-  {
-    xmlFree( value );
-    return NULL;
-  }
-    
-  return value;
-}
-
-static char *
-gweather_xml_parse_name( xmlTextReaderPtr xml )
-{
-  const char * const *locales;
-  const char *this_language;
-  int best_match = INT_MAX;
-  char *lang, *tagname;
-  gboolean keep_going;
-  char *name = NULL;
-  int i;
-
-  locales = g_get_language_names();
-
-  do
-  {
-    /* First let's get the language */
-    lang = (char *) xmlTextReaderXmlLang( xml );
-
-    if( lang == NULL )
-      this_language = "C";
-    else
-      this_language = lang;
-
-    /* the next "node" is text node containing the actual name */
-    if( xmlTextReaderRead( xml ) != 1 )
-    {
-      xmlFree( lang );
-      return NULL;
-    }
-
-    for( i = 0; locales[i] && i < best_match; i++ )
-      if( !strcmp( locales[i], this_language ) )
-      {
-        /* if we've already encounted a less accurate
-           translation, then free it */
-        xmlFree( name );
-
-        name = (char *) xmlTextReaderValue( xml );
-        best_match = i;
-
-        break;
-      }
-
-    xmlFree( lang );
-
-    while( xmlTextReaderNodeType( xml ) != XML_READER_TYPE_ELEMENT )
-      if( xmlTextReaderRead( xml ) != 1 )
-      {
-        xmlFree( name );
-        return NULL;
-      }
-
-    /* if the next tag is another <name> then keep going */
-    tagname = (char *) xmlTextReaderName( xml );
-    keep_going = !strcmp( tagname, "name" );
-    xmlFree( tagname );
-
-  } while( keep_going );
-
-  return name;
-}
-
 static gboolean
 gweather_xml_parse_node (xmlTextReaderPtr xml,
 			 GtkTreeStore *store, GtkTreeIter *parent,
@@ -272,7 +178,7 @@
     else if ( !strcmp( tagname, "name" ) )
     {
       xmlFree( name );
-      if( (name = gweather_xml_parse_name( xml )) == NULL )
+      if( (name = gweather_xml_get_localized_value( xml )) == NULL )
         goto error_out;
     }
     else if ( !strcmp( tagname, "iso-code" ) )
@@ -347,7 +253,7 @@
     gtk_tree_store_set( store, &iter, GWEATHER_XML_COL_POINTER, new_loc, -1 );
   }
   /* if this is not a location and there's no child, then it's useless */
-  else if ( !gtk_tree_model_iter_has_child( GTK_TREE_MODEL (store), &iter ) )
+  else if ( self && !gtk_tree_model_iter_has_child( GTK_TREE_MODEL (store), &iter ) )
   {
     gtk_tree_store_remove( store, &iter );
   }
Index: libgweather/Makefile.am
===================================================================
--- libgweather/Makefile.am	(revision 227)
+++ libgweather/Makefile.am	(working copy)
@@ -13,7 +13,9 @@
 	weather-sun.c \
 	gweather-prefs.c gweather-prefs.h \
 	gweather-gconf.c gweather-gconf.h \
-	gweather-xml.c gweather-xml.h
+	gweather-xml.c gweather-xml.h \
+	timezone-menu.c timezone-menu.h \
+	xml-utils.c xml-utils.h
 
 libgweather_la_CFLAGS = \
 	-I$(top_srcdir)			\
@@ -48,8 +50,20 @@
 	$(GNOME_VFS_APPLETS_LIB) \
 	libgweather.la
 
+test_zones_SOURCES = test_zones.c
+
+test_zones_CFLAGS = \
+	-I$(top_srcdir)			\
+	-I$(srcdir)			\
+	$(WARN_CFLAGS)			\
+	$(GTK_CFLAGS)			\
+	$(GNOME_VFS_APPLETS_CFLAGS)	\
+	-DG_LOG_DOMAIN=\"GWeather\"
+
+test_zones_LDADD = libgweather.la
+
 noinst_HEADERS = weather-priv.h
-noinst_PROGRAMS = test_metar
+noinst_PROGRAMS = test_metar test_zones
 
 schemadir   = @GCONF_SCHEMA_FILE_DIR@
 schema_in_files = gweather.schemas.in
Index: libgweather/test_zones.c
===================================================================
--- libgweather/test_zones.c	(revision 0)
+++ libgweather/test_zones.c	(revision 0)
@@ -0,0 +1,35 @@
+
+#define GWEATHER_I_KNOW_THIS_IS_UNSTABLE
+#include "timezone-menu.h"
+
+static void
+deleted (GtkWidget *widget, GdkEvent *event, gpointer data)
+{
+    gtk_main_quit ();
+}
+
+int
+main (int argc, char **argv)
+{
+    GtkWidget *window, *vbox, *combo;
+
+    gtk_init (&argc, &argv);
+
+    window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+    gtk_window_set_title (GTK_WINDOW (window), "test_zones");
+    gtk_container_set_border_width (GTK_CONTAINER (window), 8);
+    g_signal_connect (window, "delete-event",
+		      G_CALLBACK (deleted), NULL);
+
+    vbox = gtk_vbox_new (FALSE, 8);
+    gtk_container_add (GTK_CONTAINER (window), vbox);
+
+    combo = gweather_timezone_menu_new ();
+    gtk_box_pack_start (GTK_BOX (vbox), combo, FALSE, TRUE, 0);
+
+    gtk_widget_show_all (window);
+
+    gtk_main ();
+
+    return 0;
+}
