aboutsummaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorChristian Persch <chpe@cvs.gnome.org>2004-11-25 21:51:57 +0800
committerChristian Persch <chpe@src.gnome.org>2004-11-25 21:51:57 +0800
commit7ee1915ef8101e1cac5b9a2d5c858aac371d6367 (patch)
tree7b2331141eb8748f415b130375f20a8f047cd542 /lib
parentb0521a16c246aea0742fb25e5195c817de1d2326 (diff)
downloadgsoc2013-epiphany-7ee1915ef8101e1cac5b9a2d5c858aac371d6367.tar
gsoc2013-epiphany-7ee1915ef8101e1cac5b9a2d5c858aac371d6367.tar.gz
gsoc2013-epiphany-7ee1915ef8101e1cac5b9a2d5c858aac371d6367.tar.bz2
gsoc2013-epiphany-7ee1915ef8101e1cac5b9a2d5c858aac371d6367.tar.lz
gsoc2013-epiphany-7ee1915ef8101e1cac5b9a2d5c858aac371d6367.tar.xz
gsoc2013-epiphany-7ee1915ef8101e1cac5b9a2d5c858aac371d6367.tar.zst
gsoc2013-epiphany-7ee1915ef8101e1cac5b9a2d5c858aac371d6367.zip
Check for iso-codes package.
2004-11-25 Christian Persch <chpe@cvs.gnome.org> * configure.ac: Check for iso-codes package. * data/glade/prefs-dialog.glade: * lib/ephy-langs.c: (ephy_langs_bind_iso_domains), (read_iso_639_entry), (read_iso_3166_entry), (load_iso_entries), (ephy_langs_iso_639_table), (ephy_langs_iso_3166_table): * lib/ephy-langs.h: Load language and locales list from iso-codes package, if available. * src/prefs-dialog.c: (prefs_dialog_finalize), (add_lang_dialog_selection_changed), (add_lang_dialog_response_cb), (get_name_for_lang_code), (add_system_language_entry), (setup_add_language_dialog), (create_language_section): If the iso-codes package is available, use that to translate language names and offer a wider variety of languages. Fixes bug #155498.
Diffstat (limited to 'lib')
-rw-r--r--lib/ephy-langs.c204
-rw-r--r--lib/ephy-langs.h7
2 files changed, 211 insertions, 0 deletions
diff --git a/lib/ephy-langs.c b/lib/ephy-langs.c
index 129ab525d..793f179ce 100644
--- a/lib/ephy-langs.c
+++ b/lib/ephy-langs.c
@@ -22,10 +22,16 @@
#include "ephy-langs.h"
+#include "ephy-debug.h"
+
#include <glib/gi18n.h>
#include <string.h>
+#ifdef HAVE_ISO_CODES
+#include <libxml/xmlreader.h>
+#endif
+
static const EphyFontsLanguageInfo font_languages [] =
{
{ N_("Arabic"), "ar" },
@@ -195,3 +201,201 @@ ephy_langs_get_languages (void)
return (char **) g_array_free (array, FALSE);
}
+
+#ifdef HAVE_ISO_CODES
+
+#define ISOCODESLOCALEDIR ISO_CODES_PREFIX "/share/locale"
+
+static void
+ephy_langs_bind_iso_domains (void)
+{
+#ifdef ENABLE_NLS
+ static gboolean bound = FALSE;
+
+ if (bound == FALSE)
+ {
+ bindtextdomain (ISO_639_DOMAIN, ISOCODESLOCALEDIR);
+ bind_textdomain_codeset (ISO_639_DOMAIN, "UTF-8");
+
+ bindtextdomain(ISO_3166_DOMAIN, ISOCODESLOCALEDIR);
+ bind_textdomain_codeset (ISO_3166_DOMAIN, "UTF-8");
+
+ bound = TRUE;
+ }
+#endif
+}
+
+static void
+read_iso_639_entry (xmlTextReaderPtr reader,
+ GHashTable *table)
+{
+ xmlChar *code, *name;
+
+ code = xmlTextReaderGetAttribute (reader, (const xmlChar *) "iso_639_1_code");
+ name = xmlTextReaderGetAttribute (reader, (const xmlChar *) "name");
+
+ /* Get iso-639-2 code */
+ if (code == NULL || code[0] == '\0')
+ {
+ xmlFree (code);
+ /* FIXME: use the 2T or 2B code? */
+ code = xmlTextReaderGetAttribute (reader, (const xmlChar *) "iso_639_2T_code");
+ }
+
+ if (code != NULL && code[0] != '\0' && name != NULL && name[0] != '\0')
+ {
+ g_hash_table_insert (table, code, name);
+ }
+ else
+ {
+ xmlFree (code);
+ xmlFree (name);
+ }
+}
+
+static void
+read_iso_3166_entry (xmlTextReaderPtr reader,
+ GHashTable *table)
+{
+ xmlChar *code, *name;
+
+ code = xmlTextReaderGetAttribute (reader, (const xmlChar *) "alpha_2_code");
+ name = xmlTextReaderGetAttribute (reader, (const xmlChar *) "name");
+
+ if (code != NULL && code[0] != '\0' && name != NULL && name[0] != '\0')
+ {
+ char *lcode;
+
+ lcode = g_ascii_strdown ((char *) code, -1);
+ xmlFree (code);
+
+ g_hash_table_insert (table, lcode, name);
+ }
+ else
+ {
+ xmlFree (code);
+ xmlFree (name);
+ }
+
+}
+
+typedef enum
+{
+ STATE_START,
+ STATE_STOP,
+ STATE_ENTRIES,
+} ParserState;
+
+static gboolean
+load_iso_entries (int iso,
+ GFunc read_entry_func,
+ gpointer user_data)
+{
+ xmlTextReaderPtr reader;
+ ParserState state = STATE_START;
+ xmlChar iso_entries[32], iso_entry[32];
+ char *filename;
+ int ret = -1;
+
+ LOG ("Loading ISO-%d codes", iso)
+
+ START_PROFILER ("Loading ISO codes")
+
+ filename = g_strdup_printf (ISO_CODES_PREFIX "/share/xml/iso-codes/iso_%d.xml", iso);
+ reader = xmlNewTextReaderFilename (filename);
+ if (reader == NULL) goto out;
+
+ xmlStrPrintf (iso_entries, sizeof (iso_entries), "iso_%d_entries", iso);
+ xmlStrPrintf (iso_entry, sizeof (iso_entry), "iso_%d_entry", iso);
+
+ ret = xmlTextReaderRead (reader);
+
+ while (ret == 1)
+ {
+ const xmlChar *tag;
+ xmlReaderTypes type;
+
+ tag = xmlTextReaderConstName (reader);
+ type = xmlTextReaderNodeType (reader);
+
+ if (state == STATE_ENTRIES &&
+ type == XML_READER_TYPE_ELEMENT &&
+ xmlStrEqual (tag, iso_entry))
+ {
+ read_entry_func (reader, user_data);
+ }
+ else if (state == STATE_START &&
+ type == XML_READER_TYPE_ELEMENT &&
+ xmlStrEqual (tag, iso_entries))
+ {
+ state = STATE_ENTRIES;
+ }
+ else if (state == STATE_ENTRIES &&
+ type == XML_READER_TYPE_END_ELEMENT &&
+ xmlStrEqual (tag, iso_entries))
+ {
+ state = STATE_STOP;
+ }
+ else if (type == XML_READER_TYPE_SIGNIFICANT_WHITESPACE ||
+ type == XML_READER_TYPE_WHITESPACE ||
+ type == XML_READER_TYPE_TEXT ||
+ type == XML_READER_TYPE_COMMENT)
+ {
+ /* eat it */
+ }
+ else
+ {
+ /* ignore it */
+ }
+
+ ret = xmlTextReaderRead (reader);
+ }
+
+ xmlFreeTextReader (reader);
+
+out:
+ if (ret < 0 || state != STATE_STOP)
+ {
+ g_warning ("Failed to load ISO-%d codes from %s!\n",
+ iso, filename);
+ return FALSE;
+ }
+
+ g_free (filename);
+
+ STOP_PROFILER ("Loading ISO codes")
+
+ return TRUE;
+}
+
+GHashTable *
+ephy_langs_iso_639_table (void)
+{
+ GHashTable *table;
+
+ ephy_langs_bind_iso_domains ();
+ table = g_hash_table_new_full (g_str_hash, g_str_equal,
+ (GDestroyNotify) xmlFree,
+ (GDestroyNotify) xmlFree);
+
+ load_iso_entries (639, (GFunc) read_iso_639_entry, table);
+
+ return table;
+}
+
+GHashTable *
+ephy_langs_iso_3166_table (void)
+{
+ GHashTable *table;
+
+ ephy_langs_bind_iso_domains ();
+ table = g_hash_table_new_full (g_str_hash, g_str_equal,
+ (GDestroyNotify) g_free,
+ (GDestroyNotify) xmlFree);
+
+ load_iso_entries (3166, (GFunc) read_iso_3166_entry, table);
+
+ return table;
+}
+
+#endif /* HAVE_ISO_CODES */
diff --git a/lib/ephy-langs.h b/lib/ephy-langs.h
index baefdd78d..758501509 100644
--- a/lib/ephy-langs.h
+++ b/lib/ephy-langs.h
@@ -26,6 +26,9 @@
G_BEGIN_DECLS
+#define ISO_639_DOMAIN "iso_639"
+#define ISO_3166_DOMAIN "iso_3166"
+
typedef struct
{
char *title;
@@ -42,6 +45,10 @@ void ephy_langs_sanitise (GArray *array);
char **ephy_langs_get_languages (void);
+GHashTable *ephy_langs_iso_639_table (void);
+
+GHashTable *ephy_langs_iso_3166_table (void);
+
G_END_DECLS
#endif