[gcompris] Multigraph support for gletters
- From: Bruno Coudoin <bcoudoin src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gcompris] Multigraph support for gletters
- Date: Fri, 10 May 2013 13:15:24 +0000 (UTC)
commit 4a434e5f91f3b89521e03579451057cf35b0742b
Author: GunChleoc <fios foramnagaidhlig net>
Date: Tue May 7 23:02:09 2013 +0100
Multigraph support for gletters
- letters are now defined in XML for flexible level design
- moved the data over from the po files where alphabet had been localized, but localizers should still
fine-tune
- bugs that still need fixing:
--- mode switching to mixed/uppercase -> load new wordlist!
--- uppercase_only: second element of digraph has to be typed uppercase
--- check hash compare again
src/gletters-activity/gletters.c | 1115 +++++++++++---------
.../resources/gletters/Makefile.am | 38 +-
.../resources/gletters/default-ar.xml | 87 ++
.../resources/gletters/default-ast.xml | 231 ++++
.../resources/gletters/default-bg.xml | 287 +++++
.../resources/gletters/default-br.xml | 259 +++++
.../resources/gletters/default-ca.xml | 263 +++++
.../resources/gletters/default-cs.xml | 375 +++++++
.../resources/gletters/default-da.xml | 279 +++++
.../resources/gletters/default-de.xml | 279 +++++
.../resources/gletters/default-el.xml | 239 +++++
.../resources/gletters/default-en.xml | 255 +++++
.../resources/gletters/default-es.xml | 263 +++++
.../resources/gletters/default-et.xml | 303 ++++++
.../resources/gletters/default-fa.xml | 99 ++
.../resources/gletters/default-fi.xml | 279 +++++
.../resources/gletters/default-gd.xml | 271 +++++
.../resources/gletters/default-gl.xml | 243 +++++
.../resources/gletters/default-gu.xml | 46 +
.../resources/gletters/default-he.xml | 83 ++
.../resources/gletters/default-hu.xml | 323 ++++++
.../resources/gletters/default-ka.xml | 97 ++
.../resources/gletters/default-lt.xml | 299 ++++++
.../resources/gletters/default-lv.xml | 311 ++++++
.../resources/gletters/default-nn.xml | 279 +++++
.../resources/gletters/default-pl.xml | 311 ++++++
.../resources/gletters/default-ru.xml | 287 +++++
.../resources/gletters/default-sk.xml | 391 +++++++
.../resources/gletters/default-sl.xml | 124 +++
.../resources/gletters/default-so.xml | 231 ++++
.../resources/gletters/default-sr.xml | 287 +++++
.../resources/gletters/default-sr latin xml | 347 ++++++
.../resources/gletters/default-sv.xml | 244 +++++
.../resources/gletters/default-ta.xml | 91 ++
.../resources/gletters/default-uk.xml | 311 ++++++
.../resources/gletters/default-vi.xml | 279 +++++
.../resources/gletters/upper-en.xml | 151 +++
.../resources/gletters/upper-gd.xml | 167 +++
38 files changed, 9318 insertions(+), 506 deletions(-)
---
diff --git a/src/gletters-activity/gletters.c b/src/gletters-activity/gletters.c
index a6c6a01..226f193 100644
--- a/src/gletters-activity/gletters.c
+++ b/src/gletters-activity/gletters.c
@@ -19,18 +19,49 @@
#include <string.h>
#include "gcompris/gcompris.h"
+#include "gcompris/gameutil.h"
+
#define SOUNDLISTFILE PACKAGE
-#define MAX_RAND_ATTEMPTS 5
+#define MAXWORDSLENGTH 50
+static GcomprisWordlist *gc_wordlist = NULL;
+
+#if GLIB_CHECK_VERSION(2, 31, 0)
+static GMutex items_lock; /* No init needed for static GMutexes */
+#else
+GStaticMutex items_lock = G_STATIC_MUTEX_INIT;
+#endif
+
+/*
+ word - letters/multigraph to type
+ overword - part of word already typed
+ count - number of already typed letters in word
+ pos - pointer to current position in word
+ letter - current expected letter to type
+*/
+typedef struct {
+ GooCanvasItem *rootitem;
+ GooCanvasItem *overwriteItem;
+ gchar *word;
+ gchar *overword;
+ gint count;
+ gchar *pos;
+ gchar *letter;
+} LettersItem;
+
+/*
+ items - array of displayed items
+ items2del - array of items where moved offscreen
+ item_on_focus - item on focus in array items. NULL - not set.
+*/
+
+static GPtrArray *items=NULL;
+static GPtrArray *items2del=NULL;
+static LettersItem *item_on_focus=NULL;
-static GList *item_list = NULL;
-static GList *item2del_list = NULL;
-static guint actors_count = 0;
static GcomprisBoard *gcomprisBoard = NULL;
-static gint dummy_id = 0;
-static gint drop_items_id = 0;
/* Sublevels are now allocated dynamically
* based on the number of chars at that level
@@ -47,9 +78,7 @@ static gint drop_items_id = 0;
*/
#define FALL_RATE_BASE 40
-static float fallRateBase = FALL_RATE_BASE;
#define FALL_RATE_MULT 100
-static float fallRateMult = FALL_RATE_MULT;
/* these constants control how often letters are dropped
* the base rate is fixed
@@ -57,72 +86,45 @@ static float fallRateMult = FALL_RATE_MULT;
*/
#define DROP_RATE_BASE 1000
-static float dropRateBase = DROP_RATE_BASE;
#define DROP_RATE_MULT 8000
-static float dropRateMult = DROP_RATE_MULT;
-
-/* both letters_array and keymap are read in
- * dynamically at run-time from files based on
- * user locale
- */
-/* letters_array contains letters you want shown
- * on each play level
- * there can be an arbitrary number of levels,
- * but there are only graphics to level 9
- * so that's where we stop
- */
-
-#define MAXLEVEL 10
-static int maxLevel;
-static char *letters_array[MAXLEVEL];
-
-/* keymap contains pairs of chars. The first char is
- * on the keyboard map, the second is the unichar that
- * is also represented by that key. That way, if there is more
- * than one character represented by a key, the user doesn't
- * have to use alternate input methods.
- * It turns out that some keyboards generate long unichars,
- * so keymap has to be big enough for 2 unichars
- * both chars are packed into the same string; this makes it
- * easier to deal with.
- */
+static gint dummy_id = 0;
+static gint drop_items_id = 0;
+static gboolean uppercase_only;
-static int keyMapSize;
-static char **keyMap;
-/* Hash table of all displayed letters */
+/* Hash table of all displayed letters, so each letter will be chosen at least once
+ * before uplicate letters are used */
static GHashTable *letters_table= NULL;
-static void start_board (GcomprisBoard *agcomprisBoard);
-static void pause_board (gboolean pause);
-static void end_board (void);
-static gboolean is_our_board (GcomprisBoard *gcomprisBoard);
-static void set_level (guint level);
-static gint key_press(guint keyval, gchar *commit_str, gchar *preedit_str);
-static void gletter_config_start(GcomprisBoard *agcomprisBoard,
+static void start_board (GcomprisBoard *agcomprisBoard);
+static void pause_board (gboolean pause);
+static void end_board (void);
+static gboolean is_our_board (GcomprisBoard *gcomprisBoard);
+static void set_level (guint level);
+static gint key_press(guint keyval, gchar *commit_str, gchar *preedit_str);
+
+static GooCanvasItem *gletters_create_item(GooCanvasItem *parent);
+static gint gletters_drop_items (gpointer data);
+static gint gletters_move_items (gpointer data);
+static void gletters_destroy_item(LettersItem *item);
+static gboolean gletters_delete_items(gpointer user_data);
+static void gletters_destroy_all_items(void);
+static void gletters_next_level(void);
+static void gletters_add_new_item(void);
+static void gletters_config_start(GcomprisBoard *agcomprisBoard,
GcomprisProfile *aProfile);
-static void gletter_config_stop(void);
-
-static GooCanvasItem *gletters_create_item(GooCanvasItem *parent);
-static gboolean gletters_drop_items (gpointer data);
-static gboolean gletters_move_items (gpointer data);
-static void gletters_destroy_item(GooCanvasItem *item);
-static void gletters_destroy_items(void);
-static void gletters_destroy_all_items(void);
-static void gletters_next_level(void);
-static void gletters_add_new_item(void);
-
-static void player_win(GooCanvasItem *item);
-static void player_loose(void);
-static GooCanvasItem *item_find_by_title (const gunichar *title);
-static gunichar *key_find_by_item (const GooCanvasItem *item);
+static void gletters_config_stop(void);
+
+
+static void player_win(LettersItem *item);
+static void player_lose(void);
+
static guint32 fallSpeed = 0;
static double speed = 0.0;
-static int gamewon;
-static gboolean with_sound = FALSE;
+static GooCanvasItem *preedit_text = NULL;
/* Description of this plugin */
static BoardPlugin menu_bp =
@@ -145,8 +147,8 @@ static BoardPlugin menu_bp =
set_level,
NULL,
NULL,
- gletter_config_start,
- gletter_config_stop
+ gletters_config_start,
+ gletters_config_stop
};
/*
@@ -161,25 +163,9 @@ GET_BPLUGIN_INFO(gletters)
* in : boolean TRUE = PAUSE : FALSE = UNPAUSE
*
*/
-
-static void level_set_score() {
- int l;
-
- g_message("letters_array length for level %d is %ld\n",
- gcomprisBoard->level,
- g_utf8_strlen(letters_array[gcomprisBoard->level-1],-1));
- l = g_utf8_strlen(letters_array[gcomprisBoard->level-1],-1)/3;
- gcomprisBoard->number_of_sublevel = (DEFAULT_SUBLEVEL>l?DEFAULT_SUBLEVEL:l);
-
- gc_score_start(SCORESTYLE_NOTE,
- BOARDWIDTH - 195,
- BOARDHEIGHT - 30,
- gcomprisBoard->number_of_sublevel);
- gc_bar_set(GC_BAR_CONFIG|GC_BAR_LEVEL);
-}
-
static void pause_board (gboolean pause)
{
+
if(gcomprisBoard==NULL)
return;
@@ -196,156 +182,106 @@ static void pause_board (gboolean pause)
}
else
{
- if(gamewon == TRUE) /* the game is won */
- {
- level_set_score();
- gletters_next_level();
- }
-
if(!drop_items_id) {
- drop_items_id = g_timeout_add (1000,
- gletters_drop_items, NULL);
+ drop_items_id = g_timeout_add (0,
+ (GSourceFunc) gletters_drop_items, NULL);
}
if(!dummy_id) {
- dummy_id = g_timeout_add (1000, gletters_move_items, NULL);
+ dummy_id = g_timeout_add (10, (GSourceFunc) gletters_move_items, NULL);
}
}
}
-static gboolean uppercase_only;
-
-int load_default_charset() {
- g_message("in load_default_charset\n");
-
- gchar *numbers;
- gchar *alphabet_lowercase;
- gchar *alphabet_uppercase;
-
- /* TRANSLATORS: Put here the numbers in your language */
- numbers=_("0123456789");
- g_assert(g_utf8_validate(numbers,-1,NULL)); // require by all utf8-functions
-
- /* TRANSLATORS: Put here the alphabet lowercase in your language */
- alphabet_lowercase=_("abcdefghijklmnopqrstuvwxyz");
- g_assert(g_utf8_validate(alphabet_lowercase,-1,NULL)); // require by all utf8-functions
-
- g_warning("Using lowercase %s", alphabet_lowercase);
-
- /* TRANSLATORS: Put here the alphabet uppercase in your language */
- alphabet_uppercase=_("ABCDEFGHIJKLMNOPQRSTUVWXYZ");
- g_assert(g_utf8_validate(alphabet_uppercase,-1,NULL)); // require by all utf8-functions
- g_warning("Using uppercase %s", alphabet_uppercase);
-
- letters_array[0] = g_strdup(alphabet_uppercase);
- letters_array[1] = g_strdup_printf("%s%s",
- alphabet_uppercase,
- numbers);
- if (!uppercase_only){
- letters_array[2] = g_strdup(alphabet_lowercase);
- letters_array[3] = g_strdup_printf("%s%s",
- alphabet_lowercase,
- numbers);
- letters_array[4] = g_strdup_printf("%s%s",
- alphabet_lowercase,
- alphabet_uppercase);
- letters_array[5] = g_strdup_printf("%s%s%s",
- alphabet_lowercase,
- alphabet_uppercase,
- numbers);
- } else{
- g_warning("Uppercase only is set");
- letters_array[2] = g_strdup(alphabet_uppercase);
- letters_array[3] = g_strdup_printf("%s%s",
- alphabet_uppercase,
- numbers);
- letters_array[4] = g_strdup_printf("%s%s",
- alphabet_uppercase,
- numbers);
- letters_array[5] = g_strdup_printf("%s%s",
- alphabet_uppercase,
- numbers);
- }
-
-
- keyMapSize = 0;
- maxLevel = 6;
- return TRUE;
-}
-
-int whitespace(char *buffer) {
- int i;
- i = 0;
- while(buffer[i] != '\0') {
- if(buffer[i] == ' ' || buffer[i] == '\t' || buffer[i++] == '\n')
- continue;
- else return FALSE;
- }
- return TRUE;
-}
-
/*
*/
static void start_board (GcomprisBoard *agcomprisBoard)
{
- GHashTable *config = gc_db_get_board_conf();
- gc_locale_set(g_hash_table_lookup( config, "locale"));
-
- gchar *up_init_str = g_hash_table_lookup( config, "uppercase_only");
+ if(agcomprisBoard!=NULL)
+ {
+ gcomprisBoard=agcomprisBoard;
- if (up_init_str && (strcmp(up_init_str, "True")==0))
- uppercase_only = TRUE;
- else
- uppercase_only = FALSE;
+ GHashTable *config = gc_db_get_board_conf();
+ gc_locale_set(g_hash_table_lookup( config, "locale"));
- gchar *control_sound = g_hash_table_lookup( config, "with_sound");
+ gchar *up_init_str = g_hash_table_lookup( config, "uppercase_only");
+ if (up_init_str && (strcmp(up_init_str, "True")==0))
+ uppercase_only = TRUE;
+ else
+ uppercase_only = FALSE;
- if (control_sound && strcmp(g_hash_table_lookup( config, "with_sound"),"True")==0)
- with_sound = TRUE;
- else
- with_sound = FALSE;
+ g_hash_table_destroy(config);
- g_hash_table_destroy(config);
+ /* disable im_context */
+ //gcomprisBoard->disable_im_context = TRUE;
- if(agcomprisBoard!=NULL)
- {
- gcomprisBoard=agcomprisBoard;
- load_default_charset();
gc_set_background(goo_canvas_get_root_item(gcomprisBoard->canvas),
"gletters/scenery_background.png");
- gcomprisBoard->maxlevel=maxLevel;
+
+
gcomprisBoard->level = 1;
- level_set_score();
+ gcomprisBoard->maxlevel = 6;
+ gcomprisBoard->sublevel = 0;
+ gc_bar_set(GC_BAR_LEVEL|GC_BAR_CONFIG);
+
+ gchar *filename = (uppercase_only) ? "gletters/upper-$LOCALE.xml" : "gletters/default-$LOCALE.xml";
+
+ gc_wordlist = gc_wordlist_get_from_file(filename);
+
+ if(!gc_wordlist)
+ {
+ /* Fallback to english */
+ filename = (uppercase_only) ? "gletters/upper-en.xml" : "gletters/default-en.xml";
+ gc_wordlist = gc_wordlist_get_from_file(filename);
+
+ if(!gc_wordlist)
+ {
+ gcomprisBoard = NULL;
+ gc_dialog(_("Error: We can't find\na list of letters to play this game.\n"), gc_board_end);
+ return;
+ }
+ }
+ if(gc_wordlist)
+ {
+ gcomprisBoard->maxlevel = gc_wordlist->number_of_level;
+ }
gletters_next_level();
- gamewon = FALSE;
- pause_board(FALSE);
}
}
-
-
static void
end_board ()
{
- int i;
+
if(gcomprisBoard!=NULL)
{
pause_board(TRUE);
gc_score_end();
+#if GLIB_CHECK_VERSION(2, 31, 0)
+ g_mutex_lock (&items_lock);
+#else
+ g_static_mutex_lock (&items_lock);
+#endif
gletters_destroy_all_items();
- g_message("freeing memory");
- for (i = 0; i < maxLevel; i++)
- g_free(letters_array[i]);
-
- for (i = 0; i < keyMapSize; i++)
- g_free(keyMap[i]);
+#if GLIB_CHECK_VERSION(2, 31, 0)
+ g_mutex_unlock (&items_lock);
+#else
+ g_static_mutex_unlock (&items_lock);
+#endif
+ if (preedit_text){
+ goo_canvas_item_remove(preedit_text);
+ preedit_text=NULL;
+ }
+ gc_im_reset();
+ gcomprisBoard = NULL;
- g_free(keyMap);
+ if (gc_wordlist != NULL){
+ gc_wordlist_free(gc_wordlist);
+ gc_wordlist = NULL;
+ }
}
gc_locale_set( NULL );
-
- gcomprisBoard = NULL;
}
static void
@@ -355,102 +291,186 @@ set_level (guint level)
if(gcomprisBoard!=NULL)
{
gcomprisBoard->level=level;
- level_set_score();
gletters_next_level();
}
}
-/* Append in char_list one of the falling letter */
-static void add_char(char *key, char *value, char *char_list)
-{
- strcat(char_list, key);
-}
-
-gboolean unichar_comp(gpointer key,
- gpointer value,
- gpointer user_data)
-{
- gunichar *target = (gunichar *) user_data;
- if (*((gunichar *)key) == *target)
- return TRUE;
-
- return FALSE;
-}
-gint is_falling_letter(gunichar unichar)
+static gint key_press(guint keyval, gchar *commit_str, gchar *preedit_str)
{
- GooCanvasItem *item;
-
- if ((item = g_hash_table_find(letters_table,
- unichar_comp,
- &unichar)))
- {
- player_win(item);
- return TRUE;
- }
- return FALSE;
-}
-
-static gint key_press(guint keyval, gchar *commit_str, gchar *preedit_str) {
- gint length_passed, i;
- gunichar c;
- gchar list_of_letters[255];
+ gchar *letter;
+ gint i;
+ LettersItem *item;
gchar *str;
+ gunichar unichar_letter;
+ gint retval = TRUE;
if(!gcomprisBoard)
return FALSE;
- /* i suppose even numbers are passed through IM_context */
- if ((commit_str == NULL) && (preedit_str == NULL))
- return FALSE;
+ if (keyval){
+ g_warning("keyval %d", keyval);
+ return TRUE;
+ }
- gchar *string_passed;
- if (commit_str)
- string_passed = commit_str;
- else
- string_passed = preedit_str;
- str = g_strdup(string_passed);
+ if (preedit_str){
+ g_warning("preedit_str %s", preedit_str);
+ /* show the preedit string on bottom of the window */
+ GcomprisProperties *properties = gc_prop_get ();
+ gchar *text;
+ PangoAttrList *attrs;
+ gint cursor_pos;
+ gtk_im_context_get_preedit_string (properties->context,
+ &text,
+ &attrs,
+ &cursor_pos);
+
+ if (!preedit_text)
+ preedit_text = \
+ goo_canvas_text_new (goo_canvas_get_root_item(gcomprisBoard->canvas),
+ "",
+ BOARDWIDTH/2,
+ BOARDHEIGHT - 100,
+ -1,
+ GTK_ANCHOR_N,
+ "font", gc_skin_font_board_huge_bold,
+ //"fill_color_rgba", 0xba00ffff,
+ NULL);
+
+
+ g_object_set (preedit_text,
+ "text", text,
+ "attributes", attrs,
+ NULL);
- length_passed = g_utf8_strlen(string_passed, -1);
+ return TRUE;
- for (i=0; i < length_passed; i++){
- c = g_utf8_get_char (string_passed);
- if (is_falling_letter(c)){
- gc_im_reset();
- return TRUE;
+ }
+
+ /* commit str */
+ g_warning("commit_str %s", commit_str);
+
+ str = commit_str;
+
+#if GLIB_CHECK_VERSION(2, 31, 0)
+ g_mutex_lock (&items_lock);
+#else
+ g_static_mutex_lock (&items_lock);
+#endif
+ for (i=0; i < g_utf8_strlen(commit_str,-1); i++){
+ unichar_letter = g_utf8_get_char(str);
+ str = g_utf8_next_char(str);
+ if(!g_unichar_isalnum (unichar_letter)){
+ player_lose();
+ retval = FALSE;
+ break;
}
- /* if uppercase_only is set we do not care about upper or lower case at all */
- gint level_uppercase;
- if (uppercase_only)
- level_uppercase = 10;
- else
- level_uppercase = 3;
+ letter = g_new0(gchar,6);
+ g_unichar_to_utf8 (unichar_letter, letter);
+
+ if(item_on_focus==NULL)
+ {
+ for (i=0;i<items->len;i++)
+ {
+ item=g_ptr_array_index(items,i);
+ g_assert (item!=NULL);
+
+ /* Force entered letter to the casing we expect
+ * Children is to small to manage the caps lock key for now
+ */
+ int success=FALSE;
+ if (uppercase_only)
+ {
+ gchar *old = letter;
+ letter = g_utf8_strup(old, -1);
+ g_free(old);
+ success = strcmp(item->letter,g_utf8_strdown(letter,-1))==0;
+ success = success || strcmp(item->letter,g_utf8_strup(letter,-1))==0;
+ }
+ else
+ {
+ success = strcmp(item->letter,letter)==0;
+ }
+ if (success)
+ {
+ item_on_focus=item;
+ break;
+ }
+ }
+ }
- /* for 2 (or all) first level don't care abour uppercase/lowercase */
- if ((gcomprisBoard->level < level_uppercase) &&
- (is_falling_letter(g_unichar_toupper(c)))){
- gc_im_reset();
- return TRUE;
- }
- string_passed = g_utf8_next_char (string_passed);
- }
+ if(item_on_focus!=NULL)
+ {
- list_of_letters[0] = '\0';
+ if(strcmp(item_on_focus->letter, letter)==0)
+ {
+ gchar *tmpstr;
+ item_on_focus->count++;
+ g_free(item_on_focus->overword);
+ tmpstr = g_utf8_strndup(item_on_focus->word,
+ item_on_focus->count);
+ /* Add the ZERO WIDTH JOINER to force joined char in Arabic and Hangul
+ * http://en.wikipedia.org/wiki/Zero-width_joiner
+ */
+ item_on_focus->overword = g_strdup_printf("%s%lc", tmpstr, 0x200D);
+ g_free(tmpstr);
+ g_object_set (item_on_focus->overwriteItem,
+ "text", item_on_focus->overword,
+ NULL);
- /* We have to loop to concat the letters */
- g_hash_table_foreach (letters_table,
- (GHFunc) add_char,
- list_of_letters);
- /* Log what happened, what was expected, what we got */
+ if (item_on_focus->count<g_utf8_strlen(item_on_focus->word,-1))
+ {
+ g_free(item_on_focus->letter);
+ item_on_focus->letter=g_utf8_strndup(item_on_focus->pos,1);
+ item_on_focus->pos=g_utf8_find_next_char(item_on_focus->pos,NULL);
+ }
+ else
+ {
+ player_win(item_on_focus);
+ item_on_focus=NULL;
+ }
+ }
+ else
+ {
+ /* It is a lose : unselect the word and defocus */
+ g_free(item_on_focus->overword);
+ item_on_focus->overword=g_strdup(" ");
+ item_on_focus->count=0;
+ g_free(item_on_focus->letter);
+ item_on_focus->letter=g_utf8_strndup(item_on_focus->word,1);
+
+ item_on_focus->pos=g_utf8_find_next_char(item_on_focus->word,NULL);
+
+ g_object_set (item_on_focus->overwriteItem,
+ "text", item_on_focus->overword,
+ NULL);
+ item_on_focus=NULL;
+ g_free(letter);
+ player_lose();
+ break;
+ }
+ }
+ else
+ {
+ /* Anyway kid you clicked on the wrong key */
+ player_lose();
+ g_free(letter);
+ break;
+ }
- gc_log_set_comment(gcomprisBoard, list_of_letters, str);
- g_free(str);
+ g_free(letter);
+ }
+#if GLIB_CHECK_VERSION(2, 31, 0)
+ g_mutex_unlock (&items_lock);
+#else
+ g_static_mutex_unlock (&items_lock);
+#endif
- return TRUE;
+ return retval;
}
static gboolean
@@ -475,295 +495,407 @@ is_our_board (GcomprisBoard *gcomprisBoard)
/*-------------------------------------------------------------------------------*/
/*-------------------------------------------------------------------------------*/
-/* set initial values for the next level */
-static void gletters_next_level()
+/* Called with items_lock locked */
+static void gletters_next_level_unlocked()
{
+ int l;
+
+ // get number of letters available
+ l=g_slist_length(gc_wordlist_get_levelwordlist(gc_wordlist, gcomprisBoard->level)->words);
+
+ g_message("wordlist length for level %d is %d\n",
+ gcomprisBoard->level,
+ l);
+ l = l/3; // make sure the level doesn't get too long
+ // set sublevels
+ gcomprisBoard->number_of_sublevel = (DEFAULT_SUBLEVEL>l?DEFAULT_SUBLEVEL:l);
+
+ gc_score_start(SCORESTYLE_NOTE,
+ BOARDWIDTH - 195,
+ BOARDHEIGHT - 30,
+ gcomprisBoard->number_of_sublevel);
- gamewon = FALSE;
gc_bar_set_level(gcomprisBoard);
+ gc_score_set(gcomprisBoard->sublevel);
gletters_destroy_all_items();
- /* Try the next level */
- speed=fallRateBase+(fallRateMult/gcomprisBoard->level);
- fallSpeed=dropRateBase+(dropRateMult/gcomprisBoard->level);
+ if (preedit_text){
+ goo_canvas_item_remove(preedit_text);
+ preedit_text=NULL;
+ }
+ gc_im_reset();
- gcomprisBoard->sublevel=1;
- gc_score_set(gcomprisBoard->sublevel);
+ items=g_ptr_array_new();
+ items2del=g_ptr_array_new();
+
+ /* Delete the letters_table */
+ if(letters_table) {
+ g_hash_table_destroy (letters_table);
+ letters_table=NULL;
+ }
+
+ pause_board(FALSE);
}
+/* set initial values for the next level */
+static void gletters_next_level()
+{
+#if GLIB_CHECK_VERSION(2, 31, 0)
+ g_mutex_lock (&items_lock);
+#else
+ g_static_mutex_lock (&items_lock);
+#endif
+ gletters_next_level_unlocked();
+#if GLIB_CHECK_VERSION(2, 31, 0)
+ g_mutex_unlock (&items_lock);
+#else
+ g_static_mutex_unlock (&items_lock);
+#endif
+ speed= ((double) FALL_RATE_BASE)+(((double) FALL_RATE_MULT)/gcomprisBoard->level);
+ fallSpeed= (guint32) DROP_RATE_BASE+(DROP_RATE_MULT/gcomprisBoard->level);
+}
-static void gletters_move_item(GooCanvasItem *item)
+/* Called with items_lock locked */
+static void gletters_move_item(LettersItem *item)
{
GooCanvasBounds bounds;
- goo_canvas_item_translate(item, 0, 2.0);
- goo_canvas_item_get_bounds (item,
+ goo_canvas_item_translate(item->rootitem, 0, 2.0);
+
+ goo_canvas_item_get_bounds (item->rootitem,
&bounds);
if(bounds.y1>BOARDHEIGHT) {
- item2del_list = g_list_append (item2del_list, item);
- player_loose();
+
+ if (item == item_on_focus)
+ item_on_focus = NULL;
+
+ g_ptr_array_remove (items, item);
+ g_ptr_array_add (items2del, item);
+ g_timeout_add (100,(GSourceFunc) gletters_delete_items, NULL);
+
+ player_lose();
}
}
-static void gletters_destroy_item(GooCanvasItem *item)
+/*
+ * This does the moves of the game items on the play canvas
+ *
+ */
+static gint gletters_move_items (gpointer data)
{
- gunichar *key;
-
- key = key_find_by_item(item);
+ g_assert (items!=NULL);
+ gint i;
+ LettersItem *item;
+
+#if GLIB_CHECK_VERSION(2, 31, 0)
+ g_mutex_lock (&items_lock);
+#else
+ g_static_mutex_lock (&items_lock);
+#endif
+ for (i=items->len-1;i>=0;i--)
+ {
+ item=g_ptr_array_index(items,i);
+ gletters_move_item(item);
+ }
+#if GLIB_CHECK_VERSION(2, 31, 0)
+ g_mutex_unlock (&items_lock);
+#else
+ g_static_mutex_unlock (&items_lock);
+#endif
+ dummy_id = g_timeout_add (gc_timing (speed, items->len),
+ (GSourceFunc) gletters_move_items, NULL);
+ return (FALSE);
+}
- item_list = g_list_remove (item_list, item);
- --actors_count;
- item2del_list = g_list_remove (item2del_list, item);
- /* Remove old letter; this destroy the canvas item */
- g_hash_table_remove (letters_table, key);
+static void gletters_destroy_item(LettersItem *item)
+{
+ /* The items are freed by player_win */
+ goo_canvas_item_remove(item->rootitem);
+ g_free(item->word);
+ g_free(item->overword);
+ g_free(item->letter);
+ g_free(item);
}
/* Destroy items that falls out of the canvas */
-static void gletters_destroy_items()
+static gboolean gletters_delete_items(gpointer user_data)
{
- GooCanvasItem *item;
+ LettersItem *item;
+
+#if GLIB_CHECK_VERSION(2, 31, 0)
+ g_mutex_lock (&items_lock);
+#else
+ g_static_mutex_lock (&items_lock);
+#endif
+ /* items2del may be NULL, as we can get called after
+ gletters_destroy_all_items() has been called (since we get called
+ as a timeout handler). */
+ if (items2del!=NULL){
+ while (items2del->len>0)
+ {
+ item = g_ptr_array_index(items2del,0);
+ g_ptr_array_remove_index_fast(items2del,0);
+ gletters_destroy_item(item);
+ }
+ }
+#if GLIB_CHECK_VERSION(2, 31, 0)
+ g_mutex_unlock (&items_lock);
+#else
+ g_static_mutex_unlock (&items_lock);
+#endif
- while(g_list_length(item2del_list)>0)
- {
- item = g_list_nth_data(item2del_list, 0);
- gletters_destroy_item(item);
- }
+ return (FALSE);
}
-/* Destroy all the items */
+/* Destroy all the items, called with items_lock locked */
static void gletters_destroy_all_items()
{
- GooCanvasItem *item;
+ LettersItem *item;
- if(item_list)
- while(g_list_length(item_list)>0)
+ if (items!=NULL){
+ while (items->len>0)
{
- item = g_list_nth_data(item_list, 0);
- gletters_destroy_item(item);
+ item = g_ptr_array_index(items,0);
+ g_ptr_array_remove_index_fast(items,0);
+ gletters_destroy_item(item);
}
+ g_ptr_array_free (items, TRUE);
+ items=NULL;
+ }
- actors_count= 0;
-
+ if (items2del!=NULL){
+ while (items2del->len>0)
+ {
+ item = g_ptr_array_index(items2del,0);
+ g_ptr_array_remove_index_fast(items2del,0);
+ gletters_destroy_item(item);
+ }
+ g_ptr_array_free (items2del, TRUE);
+ items2del=NULL;
+ }
+
/* Delete the letters_table */
if(letters_table) {
g_hash_table_destroy (letters_table);
letters_table=NULL;
}
+
}
/*
- * This does the moves of the game items on the play canvas
- *
+ * Comparison function to see if a letter has already been used in the current level
*/
-static gboolean gletters_move_items (gpointer data)
+static gboolean comp_gchar_for_hash(gpointer key, gpointer value, gpointer user_data)
{
- g_list_foreach (item_list, (GFunc) gletters_move_item, NULL);
-
- /* Destroy items that falls out of the canvas */
- gletters_destroy_items();
-
- dummy_id = g_timeout_add (gc_timing (speed, actors_count),
- gletters_move_items, NULL);
-
- return(FALSE);
+ gchar *target = (gchar *) user_data;
+ const gchar *compvalue = (gchar *) key;
+
+ return (g_strcmp0(compvalue, target)==0);
}
-void destroy_canvas_item(gpointer item)
-{
- //g_free(g_object_get_data (G_OBJECT(item),"unichar_key"));
- //g_free(g_object_get_data (G_OBJECT(item),"utf8_key"));
- goo_canvas_item_remove(item);
-}
-
static GooCanvasItem *gletters_create_item(GooCanvasItem *parent)
{
- GooCanvasItem *item;
- gint i,j,k;
- guint x;
- gunichar *lettersItem;
- gchar *str_p, *letter;
-
+ g_message("Createing new item");
+ LettersItem *item;
+ gchar *word = gc_wordlist_random_word_get(gc_wordlist, gcomprisBoard->level);
+ GtkAnchorType direction_anchor = GTK_ANCHOR_NW;
+
if (!letters_table)
{
- letters_table = g_hash_table_new_full (g_int_hash, g_int_equal, g_free, destroy_canvas_item);
+ letters_table = g_hash_table_new(g_int_hash, g_str_equal);
}
-
- /* Beware, since we put the letters in a hash table, we do not allow the same
- * letter to be displayed two times
- */
-
- g_warning("dump: %d, %s\n",gcomprisBoard->level,letters_array[gcomprisBoard->level-1]);
-
- k = g_utf8_strlen(letters_array[gcomprisBoard->level-1],-1);
-
- lettersItem = g_new(gunichar,1);
- gint attempt=0;
- do
- {
- attempt++;
- str_p = letters_array[gcomprisBoard->level-1];
- i = g_random_int_range(0,k);
-
- for(j = 0; j < i; j++)
- {
- str_p=g_utf8_next_char(str_p);
- }
-
- *lettersItem = g_utf8_get_char (str_p);
-
- } while((attempt<MAX_RAND_ATTEMPTS) && (item_find_by_title(lettersItem)!=NULL));
-
- if (item_find_by_title(lettersItem)!=NULL)
+
+ guint i;
+ if(word)
+ {
+ // Can't get hashtable lookup to work, so I have to use thee less efficient find
+ for (i=0;i<6 && word && g_hash_table_find(letters_table,comp_gchar_for_hash,word);++i)
+ {
+ word = gc_wordlist_random_word_get(gc_wordlist, gcomprisBoard->level);
+ }
+ /* Add letter to hash table of all falling letters. */
+ gchar *temp = word;
+ word = g_strdup(temp);
+ g_hash_table_insert (letters_table, word, word);
+ g_free(temp);
+ }
+
+ else
+ /* Should display the dialog box here */
+ return NULL;
+
+ // create and init item
+ item = g_new(LettersItem,1);
+
+ if (uppercase_only)
{
- g_free(lettersItem);
- return NULL;
+ gchar *old = word;
+ word = g_utf8_strup(old, -1);
+ g_free(old);
}
- letter = g_new0(gchar, 6);
- g_unichar_to_utf8 ( *lettersItem, letter);
+ item->word = word;
+ item->overword=g_strdup("");
+ item->count=0;
+ item->letter=g_utf8_strndup(item->word,1);
+ item->pos=g_utf8_find_next_char(item->word,NULL);
+
+ if (pango_unichar_direction(g_utf8_get_char(item->word)))
+ direction_anchor = GTK_ANCHOR_NE;
+
+ item->rootitem = goo_canvas_group_new (parent, NULL);
+ goo_canvas_item_translate(item->rootitem, 0, -12);
+
+
+ /* To 'erase' words, I create 2 times the text item. One is empty now */
+ /* It will be filled each time the user enters the right key */
+ goo_canvas_text_new (item->rootitem,
+ item->word,
+ (double) 0,
+ (double) 0,
+ -1,
+ direction_anchor,
+ "font", gc_skin_font_board_huge_bold,
+ "fill_color_rgba", 0x3e2587FF,
+ NULL);
+
+ item->overwriteItem = \
+ goo_canvas_text_new (item->rootitem,
+ item->overword,
+ (double) 0,
+ (double) 0,
+ -1,
+ direction_anchor,
+ "font", gc_skin_font_board_huge_bold,
+ "fill-color_rgba", 0xff0000ff,
+ NULL);
+
+ /*set right x position */
- if (with_sound)
- {
- gchar *str2 = NULL;
- gchar *letter_unichar_name = gc_sound_alphabet(letter);
-
- str2 = g_strdup_printf("voices/$LOCALE/alphabet/%s", letter_unichar_name);
+ GooCanvasBounds bounds;
- gc_sound_play_ogg(str2, NULL);
+ goo_canvas_item_get_bounds (item->rootitem,
+ &bounds);
- g_free(letter_unichar_name);
- g_free(str2);
- }
-
- item = \
- goo_canvas_group_new (parent,
- NULL);
- goo_canvas_item_translate(item, 0, -12);
-
- x = g_random_int_range( 80, BOARDWIDTH-160);
- goo_canvas_text_new (item,
- letter,
- x,
- -20,
- -1,
- GTK_ANCHOR_CENTER,
- "font", gc_skin_font_board_huge_bold,
- "fill_color_rgba", 0x8c8cFFFF,
- NULL);
- x -= 2;
- goo_canvas_text_new (item,
- letter,
- x,
- -22,
- -1,
- GTK_ANCHOR_CENTER,
- "font", gc_skin_font_board_huge_bold,
- "fill_color_rgba", 0x254c87FF,
- NULL);
-
- g_object_set_data (G_OBJECT(item), "unichar_key", lettersItem);
- g_object_set_data (G_OBJECT(item), "utf8_key", letter);
-
- item_list = g_list_append (item_list, item);
- ++actors_count;
-
- /* Add letter to hash table of all falling letters. */
- g_hash_table_insert (letters_table, lettersItem, item);
-
- g_free(letter);
-
- return (item);
+ if(direction_anchor == GTK_ANCHOR_NW)
+ goo_canvas_item_translate (item->rootitem,
+ (g_random_int()%(BOARDWIDTH-(gint)(bounds.x2))),
+ 0);
+ else
+ {
+ double new_x = (double)( g_random_int()%BOARDWIDTH);
+ if ( new_x < -bounds.x1 )
+ new_x -= bounds.x1;
+ goo_canvas_item_translate (item->rootitem,
+ new_x ,(double) 0);
+ }
+
+
+ #if GLIB_CHECK_VERSION(2, 31, 0)
+ g_mutex_lock (&items_lock);
+ #else
+ g_static_mutex_lock (&items_lock);
+ #endif
+ g_ptr_array_add(items, item);
+ #if GLIB_CHECK_VERSION(2, 31, 0)
+ g_mutex_unlock (&items_lock);
+ #else
+ g_static_mutex_unlock (&items_lock);
+ #endif
+
+ return (item->rootitem);
}
static void gletters_add_new_item()
{
+
+ g_assert(gcomprisBoard->canvas!=NULL);
gletters_create_item(goo_canvas_get_root_item(gcomprisBoard->canvas));
+
}
/*
* This is called on a low frequency and is used to drop new items
*
*/
-static gboolean gletters_drop_items (gpointer data)
+static gint gletters_drop_items (gpointer data)
{
gc_sound_play_ogg ("sounds/level.wav", NULL);
gletters_add_new_item();
+ g_source_remove(drop_items_id);
+ drop_items_id = g_timeout_add (fallSpeed,(GSourceFunc) gletters_drop_items, NULL);
- drop_items_id = g_timeout_add (fallSpeed,
- gletters_drop_items, NULL);
return (FALSE);
}
-static void player_win(GooCanvasItem *item)
+/* Called with items_lock locked */
+static void player_win(LettersItem *item)
{
- gletters_destroy_item(item);
+
gc_sound_play_ogg ("sounds/flip.wav", NULL);
+ g_assert(gcomprisBoard!=NULL);
+
gcomprisBoard->sublevel++;
+ gc_score_set(gcomprisBoard->sublevel);
+
+ g_ptr_array_remove(items,item);
+ g_ptr_array_add(items2del,item);
+
+ g_object_set (item->rootitem, "visibility", GOO_CANVAS_ITEM_INVISIBLE, NULL);
+ g_timeout_add (500,(GSourceFunc) gletters_delete_items, NULL);
if(gcomprisBoard->sublevel > gcomprisBoard->number_of_sublevel)
{
+
/* Try the next level */
gcomprisBoard->level++;
+ gcomprisBoard->sublevel = 0;
if(gcomprisBoard->level>gcomprisBoard->maxlevel)
gcomprisBoard->level = gcomprisBoard->maxlevel;
- gamewon = TRUE;
- gletters_destroy_all_items();
- gc_bonus_display(gamewon, GC_BONUS_SMILEY);
+ gletters_next_level_unlocked();
+ gc_sound_play_ogg ("sounds/bonus.wav", NULL);
}
else
{
- gc_score_set(gcomprisBoard->sublevel);
/* Drop a new item now to speed up the game */
- if(g_list_length(item_list)==0)
- {
- if (drop_items_id) {
- /* Remove pending new item creation to sync the falls */
- g_source_remove (drop_items_id);
- drop_items_id = 0;
- }
- if(!drop_items_id) {
- drop_items_id = g_timeout_add (0,
- gletters_drop_items, NULL);
- }
- }
+ if(items->len==0)
+ {
+ if (drop_items_id) {
+ /* Remove pending new item creation to sync the falls */
+ g_source_remove (drop_items_id);
+ drop_items_id = 0;
+ }
+
+ if(!drop_items_id) {
+ drop_items_id = g_timeout_add (0,
+ (GSourceFunc) gletters_drop_items,
+ NULL);
+ }
+
+ }
}
-}
-static void player_loose()
-{
- gc_sound_play_ogg ("sounds/crash.wav", NULL);
-}
-
-static gunichar *
-key_find_by_item (const GooCanvasItem *item)
-{
- return g_object_get_data (G_OBJECT(item), "unichar_key");
}
-static GooCanvasItem *
-item_find_by_title (const gunichar *title)
+static void player_lose()
{
- if (!letters_table)
- return NULL;
-
- return g_hash_table_lookup (letters_table, title);
+ gc_sound_play_ogg ("sounds/crash.wav", NULL);
}
+/* ************************************* */
+/* * Configuration * */
+/* ************************************* */
-/***********************************
-************************************
- Config
-************************************/
/* ======================= */
/* = config_start = */
@@ -771,7 +903,6 @@ item_find_by_title (const gunichar *title)
static GcomprisProfile *profile_conf;
static GcomprisBoard *board_conf;
-
static void save_table (gpointer key,
gpointer value,
gpointer user_data)
@@ -782,9 +913,8 @@ static void save_table (gpointer key,
(gchar *) value);
}
-/* a GcomprisConfCallback
- */
-static gboolean conf_ok(GHashTable *table)
+static gboolean
+conf_ok(GHashTable *table)
{
if (!table){
if (gcomprisBoard)
@@ -792,7 +922,7 @@ static gboolean conf_ok(GHashTable *table)
return TRUE;
}
- g_hash_table_foreach(table, save_table, NULL);
+ g_hash_table_foreach(table, (GHFunc) save_table, NULL);
if (gcomprisBoard){
GHashTable *config;
@@ -805,29 +935,20 @@ static gboolean conf_ok(GHashTable *table)
gc_locale_set(g_hash_table_lookup( config, "locale"));
gchar *up_init_str = g_hash_table_lookup( config, "uppercase_only");
-
- if (up_init_str && (strcmp(up_init_str, "True")==0))
- uppercase_only = TRUE;
- else
- uppercase_only = FALSE;
-
- gchar *control_sound = g_hash_table_lookup( config, "with_sound");
-
- if (control_sound && strcmp(g_hash_table_lookup( config, "with_sound"),"True")==0)
- with_sound = TRUE;
- else
- with_sound = FALSE;
+ if (up_init_str)
+ {
+ if(strcmp(up_init_str, "True")==0)
+ uppercase_only = TRUE;
+ else
+ uppercase_only = FALSE;
+ }
if (profile_conf)
g_hash_table_destroy(config);
- load_default_charset();
-
- level_set_score();
gletters_next_level();
pause_board(FALSE);
-
}
board_conf = NULL;
@@ -836,21 +957,22 @@ static gboolean conf_ok(GHashTable *table)
}
static void
-gletter_config_start(GcomprisBoard *agcomprisBoard,
- GcomprisProfile *aProfile)
+gletters_config_start(GcomprisBoard *agcomprisBoard,
+ GcomprisProfile *aProfile)
{
+ GcomprisBoardConf *conf;
board_conf = agcomprisBoard;
profile_conf = aProfile;
- gchar *label;
-
if (gcomprisBoard)
pause_board(TRUE);
- label = g_strdup_printf(_("<b>%s</b> configuration\n for profile <b>%s</b>"),
- agcomprisBoard->name, aProfile ? aProfile->name : "");
+ gchar *label = g_strdup_printf(_("<b>%s</b> configuration\n for profile <b>%s</b>"),
+ agcomprisBoard->name,
+ aProfile? aProfile->name: "");
- GcomprisBoardConf *bconf = gc_board_config_window_display(label, (GcomprisConfCallback )conf_ok);
+ conf = gc_board_config_window_display( label,
+ conf_ok);
g_free(label);
@@ -859,38 +981,21 @@ gletter_config_start(GcomprisBoard *agcomprisBoard,
gchar *locale = g_hash_table_lookup( config, "locale");
- gc_board_config_combo_locales( bconf, locale);
-
+ gc_board_config_combo_locales(conf, locale);
+ gc_board_config_wordlist(conf, "gletters/default-$LOCALE.xml");
+ /* upper case */
gboolean up_init = FALSE;
-
gchar *up_init_str = g_hash_table_lookup( config, "uppercase_only");
if (up_init_str && (strcmp(up_init_str, "True")==0))
up_init = TRUE;
- gc_board_conf_separator(bconf);
-
- gchar *control_sound = g_hash_table_lookup( config, "with_sound");
- if (control_sound && strcmp(g_hash_table_lookup( config, "with_sound"),"True")==0)
- with_sound = TRUE;
- else
- with_sound = FALSE;
-
- gc_board_config_boolean_box(bconf, _("Enable sounds"), "with_sound", with_sound);
-
- gc_board_conf_separator(bconf);
-
- gc_board_config_boolean_box(bconf, _("Uppercase only text"),
- "uppercase_only",
- up_init);
-
+ gc_board_config_boolean_box(conf, _("Uppercase only text"),
+ "uppercase_only",
+ up_init);
}
-
-/* ======================= */
-/* = config_stop = */
-/* ======================= */
-static void
-gletter_config_stop()
+static void gletters_config_stop(void)
{
}
+
diff --git a/src/gletters-activity/resources/gletters/Makefile.am
b/src/gletters-activity/resources/gletters/Makefile.am
index 62b2b72..4bb7337 100644
--- a/src/gletters-activity/resources/gletters/Makefile.am
+++ b/src/gletters-activity/resources/gletters/Makefile.am
@@ -1,5 +1,41 @@
imgdir = $(pkgdatadir)/@PACKAGE_DATA_DIR@/gletters
img_DATA = \
- scenery_background.png
+ scenery_background.png \
+ default-en.xml \
+ upper-en.xml \
+ default-ar.xml \
+ default-ast.xml \
+ default-bg.xml \
+ default-br.xml \
+ default-ca.xml \
+ default-cs.xml \
+ default-da.xml \
+ default-de.xml \
+ default-el.xml \
+ default-es.xml \
+ default-et.xml \
+ default-fa.xml \
+ default-fi.xml \
+ default-gd.xml \
+ upper-gd.xml \
+ default-gl.xml \
+ default-gu.xml \
+ default-he.xml \
+ default-hu.xml \
+ default-ka.xml \
+ default-lt.xml \
+ default-lv.xml \
+ default-nn.xml \
+ default-pl.xml \
+ default-ru.xml \
+ default-sk.xml \
+ default-sl.xml \
+ default-so.xml \
+ default-sr.xml \
+ default-sr latin xml \
+ default-sv.xml \
+ default-ta.xml \
+ default-uk.xml \
+ default-vi.xml
EXTRA_DIST = $(img_DATA)
diff --git a/src/gletters-activity/resources/gletters/default-ar.xml
b/src/gletters-activity/resources/gletters/default-ar.xml
new file mode 100644
index 0000000..5e35e87
--- /dev/null
+++ b/src/gletters-activity/resources/gletters/default-ar.xml
@@ -0,0 +1,87 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<GCompris>
+<Wordlist name="default-ar" description="Arabic" locale="ar">
+<level value="1">
+٠
+١
+٢
+٣
+٤
+٥
+٦
+٧
+٨
+٩
+</level>
+<level value="2">
+ا
+ب
+ت
+ث
+ج
+ح
+خ
+د
+ذ
+ر
+ز
+س
+ش
+ص
+ض
+ط
+ظ
+ع
+غ
+ف
+ق
+ك
+ل
+م
+ن
+ه
+و
+ي
+</level>
+<level value="3">
+ا
+ب
+ت
+ث
+ج
+ح
+خ
+د
+ذ
+ر
+ز
+س
+ش
+ص
+ض
+ط
+ظ
+ع
+غ
+ف
+ق
+ك
+ل
+م
+ن
+ه
+و
+ي
+٠
+١
+٢
+٣
+٤
+٥
+٦
+٧
+٨
+٩
+</level>
+</Wordlist>
+</GCompris>
\ No newline at end of file
diff --git a/src/gletters-activity/resources/gletters/default-ast.xml
b/src/gletters-activity/resources/gletters/default-ast.xml
new file mode 100644
index 0000000..41b55f3
--- /dev/null
+++ b/src/gletters-activity/resources/gletters/default-ast.xml
@@ -0,0 +1,231 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<GCompris>
+<Wordlist name="default-ast" description="Default Asturian" locale="ast">
+<level value="1">
+a
+b
+c
+d
+e
+f
+g
+h
+i
+l
+m
+n
+o
+p
+q
+r
+s
+t
+u
+v
+x
+y
+z
+</level>
+<level value="2">
+a
+b
+c
+d
+e
+f
+g
+h
+i
+l
+m
+n
+o
+p
+q
+r
+s
+t
+u
+v
+x
+y
+z
+1
+2
+3
+4
+5
+6
+7
+8
+9
+0
+</level>
+<level value="3">
+A
+B
+C
+D
+E
+F
+G
+H
+I
+L
+M
+N
+O
+P
+Q
+R
+S
+T
+U
+V
+X
+Y
+Z
+</level>
+<level value="4">
+A
+B
+C
+D
+E
+F
+G
+H
+I
+L
+M
+N
+O
+P
+Q
+R
+S
+T
+U
+V
+X
+Y
+Z
+1
+2
+3
+4
+5
+6
+7
+8
+9
+0
+</level>
+<level value="5">
+a
+b
+c
+d
+e
+f
+g
+h
+i
+l
+m
+n
+o
+p
+q
+r
+s
+t
+u
+v
+x
+y
+z
+A
+B
+C
+D
+E
+F
+G
+H
+I
+L
+M
+N
+O
+P
+Q
+R
+S
+T
+U
+V
+X
+Y
+Z
+</level>
+<level value="6">
+a
+b
+c
+d
+e
+f
+g
+h
+i
+l
+m
+n
+o
+p
+q
+r
+s
+t
+u
+v
+x
+y
+z
+A
+B
+C
+D
+E
+F
+G
+H
+I
+L
+M
+N
+O
+P
+Q
+R
+S
+T
+U
+V
+X
+Y
+Z
+1
+2
+3
+4
+5
+6
+7
+8
+9
+0
+</level>
+</Wordlist>
+</GCompris>
\ No newline at end of file
diff --git a/src/gletters-activity/resources/gletters/default-bg.xml
b/src/gletters-activity/resources/gletters/default-bg.xml
new file mode 100644
index 0000000..6b19cbc
--- /dev/null
+++ b/src/gletters-activity/resources/gletters/default-bg.xml
@@ -0,0 +1,287 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<GCompris>
+<Wordlist name="default-bg" description="Default Bulgarian" locale="bg">
+<level value="1">
+а
+б
+в
+г
+д
+е
+ж
+з
+и
+й
+к
+л
+м
+н
+о
+п
+р
+с
+т
+у
+ф
+х
+ц
+ч
+ш
+щ
+ъ
+ь
+ю
+я
+</level>
+<level value="2">
+а
+б
+в
+г
+д
+е
+ж
+з
+и
+й
+к
+л
+м
+н
+о
+п
+р
+с
+т
+у
+ф
+х
+ц
+ч
+ш
+щ
+ъ
+ь
+ю
+я
+1
+2
+3
+4
+5
+6
+7
+8
+9
+0
+</level>
+<level value="3">
+А
+Б
+В
+Г
+Д
+Е
+Ж
+З
+И
+Й
+К
+Л
+М
+Н
+О
+П
+Р
+С
+Т
+У
+Ф
+Х
+Ц
+Ч
+Ш
+Щ
+Ъ
+Ь
+Ю
+Я
+</level>
+<level value="4">
+А
+Б
+В
+Г
+Д
+Е
+Ж
+З
+И
+Й
+К
+Л
+М
+Н
+О
+П
+Р
+С
+Т
+У
+Ф
+Х
+Ц
+Ч
+Ш
+Щ
+Ъ
+Ь
+Ю
+Я
+1
+2
+3
+4
+5
+6
+7
+8
+9
+0
+</level>
+<level value="5">
+а
+б
+в
+г
+д
+е
+ж
+з
+и
+й
+к
+л
+м
+н
+о
+п
+р
+с
+т
+у
+ф
+х
+ц
+ч
+ш
+щ
+ъ
+ь
+ю
+я
+А
+Б
+В
+Г
+Д
+Е
+Ж
+З
+И
+Й
+К
+Л
+М
+Н
+О
+П
+Р
+С
+Т
+У
+Ф
+Х
+Ц
+Ч
+Ш
+Щ
+Ъ
+Ь
+Ю
+Я
+</level>
+<level value="6">
+а
+б
+в
+г
+д
+е
+ж
+з
+и
+й
+к
+л
+м
+н
+о
+п
+р
+с
+т
+у
+ф
+х
+ц
+ч
+ш
+щ
+ъ
+ь
+ю
+я
+А
+Б
+В
+Г
+Д
+Е
+Ж
+З
+И
+Й
+К
+Л
+М
+Н
+О
+П
+Р
+С
+Т
+У
+Ф
+Х
+Ц
+Ч
+Ш
+Щ
+Ъ
+Ь
+Ю
+Я
+1
+2
+3
+4
+5
+6
+7
+8
+9
+0
+</level>
+</Wordlist>
+</GCompris>
\ No newline at end of file
diff --git a/src/gletters-activity/resources/gletters/default-br.xml
b/src/gletters-activity/resources/gletters/default-br.xml
new file mode 100644
index 0000000..4b14053
--- /dev/null
+++ b/src/gletters-activity/resources/gletters/default-br.xml
@@ -0,0 +1,259 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<GCompris>
+<Wordlist name="default-br" description="Default Breton" locale="br">
+<level value="1">
+a
+b
+c
+d
+e
+f
+g
+h
+i
+j
+k
+l
+m
+n
+ñ
+o
+r
+s
+t
+u
+ù
+v
+w
+y
+z
+'
+</level>
+<level value="2">
+a
+b
+c
+d
+e
+f
+g
+h
+i
+j
+k
+l
+m
+n
+ñ
+o
+r
+s
+t
+u
+ù
+v
+w
+y
+z
+'
+1
+2
+3
+4
+5
+6
+7
+8
+9
+0
+</level>
+<level value="3">
+A
+B
+C
+D
+E
+F
+G
+H
+I
+J
+K
+L
+M
+N
+Ñ
+O
+P
+R
+S
+T
+U
+Ù
+V
+W
+Y
+Z
+'
+</level>
+<level value="4">
+A
+B
+C
+D
+E
+F
+G
+H
+I
+J
+K
+L
+M
+N
+Ñ
+O
+P
+R
+S
+T
+U
+Ù
+V
+W
+Y
+Z
+'
+1
+2
+3
+4
+5
+6
+7
+8
+9
+0
+</level>
+<level value="5">
+a
+b
+c
+d
+e
+f
+g
+h
+i
+j
+k
+l
+m
+n
+ñ
+o
+r
+s
+t
+u
+ù
+v
+w
+y
+z
+'
+A
+B
+C
+D
+E
+F
+G
+H
+I
+J
+K
+L
+M
+N
+Ñ
+O
+P
+R
+S
+T
+U
+Ù
+V
+W
+Y
+Z
+'
+</level>
+<level value="6">
+a
+b
+c
+d
+e
+f
+g
+h
+i
+j
+k
+l
+m
+n
+ñ
+o
+r
+s
+t
+u
+ù
+v
+w
+y
+z
+'
+A
+B
+C
+D
+E
+F
+G
+H
+I
+J
+K
+L
+M
+N
+Ñ
+O
+P
+R
+S
+T
+U
+Ù
+V
+W
+Y
+Z
+'
+1
+2
+3
+4
+5
+6
+7
+8
+9
+0
+</level>
+</Wordlist>
+</GCompris>
\ No newline at end of file
diff --git a/src/gletters-activity/resources/gletters/default-ca.xml
b/src/gletters-activity/resources/gletters/default-ca.xml
new file mode 100644
index 0000000..495dc27
--- /dev/null
+++ b/src/gletters-activity/resources/gletters/default-ca.xml
@@ -0,0 +1,263 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<GCompris>
+<Wordlist name="default-ca" description="Default Catalan" locale="ca">
+<level value="1">
+a
+b
+c
+ç
+d
+e
+f
+g
+h
+i
+j
+k
+l
+m
+n
+o
+p
+q
+r
+s
+t
+u
+v
+w
+x
+y
+z
+</level>
+<level value="2">
+a
+b
+c
+ç
+d
+e
+f
+g
+h
+i
+j
+k
+l
+m
+n
+o
+p
+q
+r
+s
+t
+u
+v
+w
+x
+y
+z
+1
+2
+3
+4
+5
+6
+7
+8
+9
+0
+</level>
+<level value="3">
+A
+B
+C
+Ç
+D
+E
+F
+G
+H
+I
+J
+K
+L
+M
+N
+O
+P
+Q
+R
+S
+T
+U
+V
+W
+X
+Y
+Z
+</level>
+<level value="4">
+A
+B
+C
+Ç
+D
+E
+F
+G
+H
+I
+J
+K
+L
+M
+N
+O
+P
+Q
+R
+S
+T
+U
+V
+W
+X
+Y
+Z
+1
+2
+3
+4
+5
+6
+7
+8
+9
+0
+</level>
+<level value="5">
+a
+b
+c
+ç
+d
+e
+f
+g
+h
+i
+j
+k
+l
+m
+n
+o
+p
+q
+r
+s
+t
+u
+v
+w
+x
+y
+z
+A
+B
+C
+Ç
+D
+E
+F
+G
+H
+I
+J
+K
+L
+M
+N
+O
+P
+Q
+R
+S
+T
+U
+V
+W
+X
+Y
+Z
+</level>
+<level value="6">
+a
+b
+c
+ç
+d
+e
+f
+g
+h
+i
+j
+k
+l
+m
+n
+o
+p
+q
+r
+s
+t
+u
+v
+w
+x
+y
+z
+A
+B
+C
+Ç
+D
+E
+F
+G
+H
+I
+J
+K
+L
+M
+N
+O
+P
+Q
+R
+S
+T
+U
+V
+W
+X
+Y
+Z
+1
+2
+3
+4
+5
+6
+7
+8
+9
+0
+</level>
+</Wordlist>
+</GCompris>
\ No newline at end of file
diff --git a/src/gletters-activity/resources/gletters/default-cs.xml
b/src/gletters-activity/resources/gletters/default-cs.xml
new file mode 100644
index 0000000..008b56f
--- /dev/null
+++ b/src/gletters-activity/resources/gletters/default-cs.xml
@@ -0,0 +1,375 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<GCompris>
+<Wordlist name="default-cs" description="Default Czech" locale="cs">
+<level value="1">
+a
+á
+b
+c
+č
+d
+ď
+e
+é
+ě
+f
+g
+h
+i
+í
+j
+k
+l
+m
+n
+ň
+o
+ó
+p
+q
+r
+ř
+s
+š
+t
+ť
+u
+ú
+ů
+v
+w
+x
+y
+ý
+z
+ž
+</level>
+<level value="2">
+a
+á
+b
+c
+č
+d
+ď
+e
+é
+ě
+f
+g
+h
+i
+í
+j
+k
+l
+m
+n
+ň
+o
+ó
+p
+q
+r
+ř
+s
+š
+t
+ť
+u
+ú
+ů
+v
+w
+x
+y
+ý
+z
+ž
+1
+2
+3
+4
+5
+6
+7
+8
+9
+0
+</level>
+<level value="3">
+A
+Á
+B
+C
+Č
+D
+Ď
+E
+É
+Ě
+F
+G
+H
+I
+Í
+J
+K
+L
+M
+N
+Ň
+O
+Ó
+P
+Q
+R
+Ř
+S
+Š
+T
+Ť
+U
+Ú
+Ů
+V
+W
+X
+Y
+Ý
+Z
+Ž
+</level>
+<level value="4">
+A
+Á
+B
+C
+Č
+D
+Ď
+E
+É
+Ě
+F
+G
+H
+I
+Í
+J
+K
+L
+M
+N
+Ň
+O
+Ó
+P
+Q
+R
+Ř
+S
+Š
+T
+Ť
+U
+Ú
+Ů
+V
+W
+X
+Y
+Ý
+Z
+Ž
+1
+2
+3
+4
+5
+6
+7
+8
+9
+0
+</level>
+<level value="5">
+a
+á
+b
+c
+č
+d
+ď
+e
+é
+ě
+f
+g
+h
+i
+í
+j
+k
+l
+m
+n
+ň
+o
+ó
+p
+q
+r
+ř
+s
+š
+t
+ť
+u
+ú
+ů
+v
+w
+x
+y
+ý
+z
+ž
+A
+Á
+B
+C
+Č
+D
+Ď
+E
+É
+Ě
+F
+G
+H
+I
+Í
+J
+K
+L
+M
+N
+Ň
+O
+Ó
+P
+Q
+R
+Ř
+S
+Š
+T
+Ť
+U
+Ú
+Ů
+V
+W
+X
+Y
+Ý
+Z
+Ž
+</level>
+<level value="6">
+a
+á
+b
+c
+č
+d
+ď
+e
+é
+ě
+f
+g
+h
+i
+í
+j
+k
+l
+m
+n
+ň
+o
+ó
+p
+q
+r
+ř
+s
+š
+t
+ť
+u
+ú
+ů
+v
+w
+x
+y
+ý
+z
+ž
+A
+Á
+B
+C
+Č
+D
+Ď
+E
+É
+Ě
+F
+G
+H
+I
+Í
+J
+K
+L
+M
+N
+Ň
+O
+Ó
+P
+Q
+R
+Ř
+S
+Š
+T
+Ť
+U
+Ú
+Ů
+V
+W
+X
+Y
+Ý
+Z
+Ž
+1
+2
+3
+4
+5
+6
+7
+8
+9
+0
+</level>
+</Wordlist>
+</GCompris>
\ No newline at end of file
diff --git a/src/gletters-activity/resources/gletters/default-da.xml
b/src/gletters-activity/resources/gletters/default-da.xml
new file mode 100644
index 0000000..e61b800
--- /dev/null
+++ b/src/gletters-activity/resources/gletters/default-da.xml
@@ -0,0 +1,279 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<GCompris>
+<Wordlist name="default-da" description="Default Danish" locale="da">
+<level value="1">
+a
+b
+c
+d
+e
+f
+g
+h
+i
+j
+k
+l
+m
+n
+o
+p
+q
+r
+s
+t
+u
+v
+w
+x
+y
+z
+æ
+ø
+å
+</level>
+<level value="2">
+a
+b
+c
+d
+e
+f
+g
+h
+i
+j
+k
+l
+m
+n
+o
+p
+q
+r
+s
+t
+u
+v
+w
+x
+y
+z
+æ
+ø
+å
+1
+2
+3
+4
+5
+6
+7
+8
+9
+0
+</level>
+<level value="3">
+A
+B
+C
+D
+E
+F
+G
+H
+I
+J
+K
+L
+M
+N
+O
+P
+Q
+R
+S
+T
+U
+V
+W
+X
+Y
+Z
+Æ
+Ø
+Å
+</level>
+<level value="4">
+A
+B
+C
+D
+E
+F
+G
+H
+I
+J
+K
+L
+M
+N
+O
+P
+Q
+R
+S
+T
+U
+V
+W
+X
+Y
+Z
+Æ
+Ø
+Å
+1
+2
+3
+4
+5
+6
+7
+8
+9
+0
+</level>
+<level value="5">
+a
+b
+c
+d
+e
+f
+g
+h
+i
+j
+k
+l
+m
+n
+o
+p
+q
+r
+s
+t
+u
+v
+w
+x
+y
+z
+æ
+ø
+å
+A
+B
+C
+D
+E
+F
+G
+H
+I
+J
+K
+L
+M
+N
+O
+P
+Q
+R
+S
+T
+U
+V
+W
+X
+Y
+Z
+Æ
+Ø
+Å
+</level>
+<level value="6">
+a
+b
+c
+d
+e
+f
+g
+h
+i
+j
+k
+l
+m
+n
+o
+p
+q
+r
+s
+t
+u
+v
+w
+x
+y
+z
+æ
+ø
+å
+A
+B
+C
+D
+E
+F
+G
+H
+I
+J
+K
+L
+M
+N
+O
+P
+Q
+R
+S
+T
+U
+V
+W
+X
+Y
+Z
+Æ
+Ø
+Å
+1
+2
+3
+4
+5
+6
+7
+8
+9
+0
+</level>
+</Wordlist>
+</GCompris>
\ No newline at end of file
diff --git a/src/gletters-activity/resources/gletters/default-de.xml
b/src/gletters-activity/resources/gletters/default-de.xml
new file mode 100644
index 0000000..ddba058
--- /dev/null
+++ b/src/gletters-activity/resources/gletters/default-de.xml
@@ -0,0 +1,279 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<GCompris>
+<Wordlist name="default_de" description="default deutsch" locale="de">
+<level value="1">
+a
+b
+c
+d
+e
+f
+g
+h
+i
+j
+k
+l
+m
+n
+o
+p
+q
+r
+s
+t
+u
+v
+w
+x
+y
+z
+ä
+ö
+ü
+</level>
+<level value="2">
+a
+b
+c
+d
+e
+f
+g
+h
+i
+j
+k
+l
+m
+n
+o
+p
+q
+r
+s
+t
+u
+v
+w
+x
+y
+z
+ä
+ö
+ü
+1
+2
+3
+4
+5
+6
+7
+8
+9
+0
+</level>
+<level value="3">
+A
+B
+C
+D
+E
+F
+G
+H
+I
+J
+K
+L
+M
+N
+O
+P
+Q
+R
+S
+T
+U
+V
+W
+X
+Y
+Z
+Ä
+Ö
+Ü
+</level>
+<level value="4">
+A
+B
+C
+D
+E
+F
+G
+H
+I
+J
+K
+L
+M
+N
+O
+P
+Q
+R
+S
+T
+U
+V
+W
+X
+Y
+Z
+Ä
+Ö
+Ü
+1
+2
+3
+4
+5
+6
+7
+8
+9
+0
+</level>
+<level value="5">
+a
+b
+c
+d
+e
+f
+g
+h
+i
+j
+k
+l
+m
+n
+o
+p
+q
+r
+s
+t
+u
+v
+w
+x
+y
+z
+ä
+ö
+ü
+A
+B
+C
+D
+E
+F
+G
+H
+I
+J
+K
+L
+M
+N
+O
+P
+Q
+R
+S
+T
+U
+V
+W
+X
+Y
+Z
+Ä
+Ö
+Ü
+</level>
+<level value="6">
+a
+b
+c
+d
+e
+f
+g
+h
+i
+j
+k
+l
+m
+n
+o
+p
+q
+r
+s
+t
+u
+v
+w
+x
+y
+z
+ä
+ö
+ü
+A
+B
+C
+D
+E
+F
+G
+H
+I
+J
+K
+L
+M
+N
+O
+P
+Q
+R
+S
+T
+U
+V
+W
+X
+Y
+Z
+Ä
+Ö
+Ü
+1
+2
+3
+4
+5
+6
+7
+8
+9
+0
+</level>
+</Wordlist>
+</GCompris>
\ No newline at end of file
diff --git a/src/gletters-activity/resources/gletters/default-el.xml
b/src/gletters-activity/resources/gletters/default-el.xml
new file mode 100644
index 0000000..7e0401b
--- /dev/null
+++ b/src/gletters-activity/resources/gletters/default-el.xml
@@ -0,0 +1,239 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<GCompris>
+<Wordlist name="default-el" description="Default Greek" locale="el">
+<level value="1">
+α
+β
+γ
+δ
+ε
+ζ
+η
+θ
+ι
+κ
+λ
+μ
+ν
+ξ
+ο
+π
+ρ
+σ
+τ
+υ
+φ
+χ
+ψ
+ω
+</level>
+<level value="2">
+α
+β
+γ
+δ
+ε
+ζ
+η
+θ
+ι
+κ
+λ
+μ
+ν
+ξ
+ο
+π
+ρ
+σ
+τ
+υ
+φ
+χ
+ψ
+ω
+1
+2
+3
+4
+5
+6
+7
+8
+9
+0
+</level>
+<level value="3">
+Α
+Β
+Γ
+Δ
+Ε
+Ζ
+Η
+Θ
+Ι
+Κ
+Λ
+Μ
+Ν
+Ξ
+Ο
+Π
+Ρ
+Σ
+Τ
+Υ
+Φ
+Χ
+Ψ
+Ω
+</level>
+<level value="4">
+Α
+Β
+Γ
+Δ
+Ε
+Ζ
+Η
+Θ
+Ι
+Κ
+Λ
+Μ
+Ν
+Ξ
+Ο
+Π
+Ρ
+Σ
+Τ
+Υ
+Φ
+Χ
+Ψ
+Ω
+1
+2
+3
+4
+5
+6
+7
+8
+9
+0
+</level>
+<level value="5">
+α
+β
+γ
+δ
+ε
+ζ
+η
+θ
+ι
+κ
+λ
+μ
+ν
+ξ
+ο
+π
+ρ
+σ
+τ
+υ
+φ
+χ
+ψ
+ω
+Α
+Β
+Γ
+Δ
+Ε
+Ζ
+Η
+Θ
+Ι
+Κ
+Λ
+Μ
+Ν
+Ξ
+Ο
+Π
+Ρ
+Σ
+Τ
+Υ
+Φ
+Χ
+Ψ
+Ω
+</level>
+<level value="6">
+α
+β
+γ
+δ
+ε
+ζ
+η
+θ
+ι
+κ
+λ
+μ
+ν
+ξ
+ο
+π
+ρ
+σ
+τ
+υ
+φ
+χ
+ψ
+ω
+Α
+Β
+Γ
+Δ
+Ε
+Ζ
+Η
+Θ
+Ι
+Κ
+Λ
+Μ
+Ν
+Ξ
+Ο
+Π
+Ρ
+Σ
+Τ
+Υ
+Φ
+Χ
+Ψ
+Ω
+1
+2
+3
+4
+5
+6
+7
+8
+9
+0
+</level>
+</Wordlist>
+</GCompris>
\ No newline at end of file
diff --git a/src/gletters-activity/resources/gletters/default-en.xml
b/src/gletters-activity/resources/gletters/default-en.xml
new file mode 100644
index 0000000..7867f76
--- /dev/null
+++ b/src/gletters-activity/resources/gletters/default-en.xml
@@ -0,0 +1,255 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<GCompris>
+<Wordlist name="default-en" description="English" locale="en">
+<level value="1">
+a
+b
+c
+d
+e
+f
+g
+h
+i
+j
+k
+l
+m
+n
+o
+p
+q
+r
+s
+t
+u
+v
+w
+x
+y
+z
+</level>
+<level value="2">
+a
+b
+c
+d
+e
+f
+g
+h
+i
+j
+k
+l
+m
+n
+o
+p
+q
+r
+s
+t
+u
+v
+w
+x
+y
+z
+0
+1
+2
+3
+4
+5
+6
+7
+8
+9
+</level>
+<level value="3">
+A
+B
+C
+D
+E
+F
+G
+H
+I
+J
+K
+L
+M
+N
+O
+P
+Q
+R
+S
+T
+U
+V
+W
+X
+Y
+Z
+</level>
+<level value="4">
+A
+B
+C
+D
+E
+F
+G
+H
+I
+J
+K
+L
+M
+N
+O
+P
+Q
+R
+S
+T
+U
+V
+W
+X
+Y
+Z
+0
+1
+2
+3
+4
+5
+6
+7
+8
+9
+</level>
+<level value="5">
+a
+b
+c
+d
+e
+f
+g
+h
+i
+j
+k
+l
+m
+n
+o
+p
+q
+r
+s
+t
+u
+v
+w
+x
+y
+z
+A
+B
+C
+D
+E
+F
+G
+H
+I
+J
+K
+L
+M
+N
+O
+P
+Q
+R
+S
+T
+U
+V
+W
+X
+Y
+Z
+</level>
+<level value="6">
+a
+b
+c
+d
+e
+f
+g
+h
+i
+j
+k
+l
+m
+n
+o
+p
+q
+r
+s
+t
+u
+v
+w
+x
+y
+z
+A
+B
+C
+D
+E
+F
+G
+H
+I
+J
+K
+L
+M
+N
+O
+P
+Q
+R
+S
+T
+U
+V
+W
+X
+Y
+Z
+0
+1
+2
+3
+4
+5
+6
+7
+8
+9
+</level>
+</Wordlist>
+</GCompris>
diff --git a/src/gletters-activity/resources/gletters/default-es.xml
b/src/gletters-activity/resources/gletters/default-es.xml
new file mode 100644
index 0000000..7b1eac0
--- /dev/null
+++ b/src/gletters-activity/resources/gletters/default-es.xml
@@ -0,0 +1,263 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<GCompris>
+<Wordlist name="default-es" description="Default Spanish" locale="es">
+<level value="1">
+a
+b
+c
+d
+e
+f
+g
+h
+i
+j
+k
+l
+m
+n
+ñ
+o
+p
+q
+r
+s
+t
+u
+v
+w
+x
+y
+z
+</level>
+<level value="2">
+a
+b
+c
+d
+e
+f
+g
+h
+i
+j
+k
+l
+m
+n
+ñ
+o
+p
+q
+r
+s
+t
+u
+v
+w
+x
+y
+z
+1
+2
+3
+4
+5
+6
+7
+8
+9
+0
+</level>
+<level value="3">
+A
+B
+C
+D
+E
+F
+G
+H
+I
+J
+K
+L
+M
+N
+Ñ
+O
+P
+Q
+R
+S
+T
+U
+V
+W
+X
+Y
+Z
+</level>
+<level value="4">
+A
+B
+C
+D
+E
+F
+G
+H
+I
+J
+K
+L
+M
+N
+Ñ
+O
+P
+Q
+R
+S
+T
+U
+V
+W
+X
+Y
+Z
+1
+2
+3
+4
+5
+6
+7
+8
+9
+0
+</level>
+<level value="5">
+a
+b
+c
+d
+e
+f
+g
+h
+i
+j
+k
+l
+m
+n
+ñ
+o
+p
+q
+r
+s
+t
+u
+v
+w
+x
+y
+z
+A
+B
+C
+D
+E
+F
+G
+H
+I
+J
+K
+L
+M
+N
+Ñ
+O
+P
+Q
+R
+S
+T
+U
+V
+W
+X
+Y
+Z
+</level>
+<level value="6">
+a
+b
+c
+d
+e
+f
+g
+h
+i
+j
+k
+l
+m
+n
+ñ
+o
+p
+q
+r
+s
+t
+u
+v
+w
+x
+y
+z
+A
+B
+C
+D
+E
+F
+G
+H
+I
+J
+K
+L
+M
+N
+Ñ
+O
+P
+Q
+R
+S
+T
+U
+V
+W
+X
+Y
+Z
+1
+2
+3
+4
+5
+6
+7
+8
+9
+0
+</level>
+</Wordlist>
+</GCompris>
\ No newline at end of file
diff --git a/src/gletters-activity/resources/gletters/default-et.xml
b/src/gletters-activity/resources/gletters/default-et.xml
new file mode 100644
index 0000000..f7c7310
--- /dev/null
+++ b/src/gletters-activity/resources/gletters/default-et.xml
@@ -0,0 +1,303 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<GCompris>
+<Wordlist name="default-et" description="Default Estonian" locale="et">
+<level value="1">
+a
+b
+c
+d
+e
+f
+g
+h
+i
+j
+k
+l
+m
+n
+o
+p
+q
+r
+s
+š
+z
+ž
+t
+u
+v
+w
+õ
+ä
+ö
+ü
+x
+y
+</level>
+<level value="2">
+a
+b
+c
+d
+e
+f
+g
+h
+i
+j
+k
+l
+m
+n
+o
+p
+q
+r
+s
+š
+z
+ž
+t
+u
+v
+w
+õ
+ä
+ö
+ü
+x
+y
+1
+2
+3
+4
+5
+6
+7
+8
+9
+0
+</level>
+<level value="3">
+A
+B
+C
+D
+E
+F
+G
+H
+I
+J
+K
+L
+M
+N
+O
+P
+Q
+R
+S
+Š
+Z
+Ž
+T
+U
+V
+W
+Õ
+Ä
+Ö
+Ü
+X
+Y
+</level>
+<level value="4">
+A
+B
+C
+D
+E
+F
+G
+H
+I
+J
+K
+L
+M
+N
+O
+P
+Q
+R
+S
+Š
+Z
+Ž
+T
+U
+V
+W
+Õ
+Ä
+Ö
+Ü
+X
+Y
+1
+2
+3
+4
+5
+6
+7
+8
+9
+0
+</level>
+<level value="5">
+a
+b
+c
+d
+e
+f
+g
+h
+i
+j
+k
+l
+m
+n
+o
+p
+q
+r
+s
+š
+z
+ž
+t
+u
+v
+w
+õ
+ä
+ö
+ü
+x
+y
+A
+B
+C
+D
+E
+F
+G
+H
+I
+J
+K
+L
+M
+N
+O
+P
+Q
+R
+S
+Š
+Z
+Ž
+T
+U
+V
+W
+Õ
+Ä
+Ö
+Ü
+X
+Y
+</level>
+<level value="6">
+a
+b
+c
+d
+e
+f
+g
+h
+i
+j
+k
+l
+m
+n
+o
+p
+q
+r
+s
+š
+z
+ž
+t
+u
+v
+w
+õ
+ä
+ö
+ü
+x
+y
+A
+B
+C
+D
+E
+F
+G
+H
+I
+J
+K
+L
+M
+N
+O
+P
+Q
+R
+S
+Š
+Z
+Ž
+T
+U
+V
+W
+Õ
+Ä
+Ö
+Ü
+X
+Y
+1
+2
+3
+4
+5
+6
+7
+8
+9
+0
+</level>
+</Wordlist>
+</GCompris>
\ No newline at end of file
diff --git a/src/gletters-activity/resources/gletters/default-fa.xml
b/src/gletters-activity/resources/gletters/default-fa.xml
new file mode 100644
index 0000000..0530a75
--- /dev/null
+++ b/src/gletters-activity/resources/gletters/default-fa.xml
@@ -0,0 +1,99 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<GCompris>
+<Wordlist name="default-fa" description="Default Farsi" locale="fa">
+<level value="1">
+1
+2
+3
+4
+5
+6
+7
+8
+9
+0
+</level>
+<level value="2">
+ا
+ل
+ف
+ب
+پ
+ت
+س
+ج
+چ
+ح
+خ
+د
+ذ
+ر
+ز
+ژ
+س
+ش
+ص
+ض
+ط
+ظ
+ع
+غ
+ف
+ق
+ک
+گ
+ل
+م
+ن
+و
+ه
+ی
+</level>
+<level value="3">
+ا
+ل
+ف
+ب
+پ
+ت
+س
+ج
+چ
+ح
+خ
+د
+ذ
+ر
+ز
+ژ
+س
+ش
+ص
+ض
+ط
+ظ
+ع
+غ
+ف
+ق
+ک
+گ
+ل
+م
+ن
+و
+ه
+ی
+1
+2
+3
+4
+5
+6
+7
+8
+9
+0
+</level>
+</Wordlist>
+</GCompris>
\ No newline at end of file
diff --git a/src/gletters-activity/resources/gletters/default-fi.xml
b/src/gletters-activity/resources/gletters/default-fi.xml
new file mode 100644
index 0000000..3b01c78
--- /dev/null
+++ b/src/gletters-activity/resources/gletters/default-fi.xml
@@ -0,0 +1,279 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<GCompris>
+<Wordlist name="default-fi" description="Default Finnish" locale="fi">
+<level value="1">
+a
+b
+c
+d
+e
+f
+g
+h
+i
+j
+k
+l
+m
+n
+o
+p
+q
+r
+s
+t
+u
+v
+w
+x
+y
+z
+å
+ä
+ö
+</level>
+<level value="2">
+a
+b
+c
+d
+e
+f
+g
+h
+i
+j
+k
+l
+m
+n
+o
+p
+q
+r
+s
+t
+u
+v
+w
+x
+y
+z
+å
+ä
+ö
+1
+2
+3
+4
+5
+6
+7
+8
+9
+0
+</level>
+<level value="3">
+A
+B
+C
+D
+E
+F
+G
+H
+I
+J
+K
+L
+M
+N
+O
+P
+Q
+R
+S
+T
+U
+V
+W
+X
+Y
+Z
+Å
+Ä
+Ö
+</level>
+<level value="4">
+A
+B
+C
+D
+E
+F
+G
+H
+I
+J
+K
+L
+M
+N
+O
+P
+Q
+R
+S
+T
+U
+V
+W
+X
+Y
+Z
+Å
+Ä
+Ö
+1
+2
+3
+4
+5
+6
+7
+8
+9
+0
+</level>
+<level value="5">
+a
+b
+c
+d
+e
+f
+g
+h
+i
+j
+k
+l
+m
+n
+o
+p
+q
+r
+s
+t
+u
+v
+w
+x
+y
+z
+å
+ä
+ö
+A
+B
+C
+D
+E
+F
+G
+H
+I
+J
+K
+L
+M
+N
+O
+P
+Q
+R
+S
+T
+U
+V
+W
+X
+Y
+Z
+Å
+Ä
+Ö
+</level>
+<level value="6">
+a
+b
+c
+d
+e
+f
+g
+h
+i
+j
+k
+l
+m
+n
+o
+p
+q
+r
+s
+t
+u
+v
+w
+x
+y
+z
+å
+ä
+ö
+A
+B
+C
+D
+E
+F
+G
+H
+I
+J
+K
+L
+M
+N
+O
+P
+Q
+R
+S
+T
+U
+V
+W
+X
+Y
+Z
+Å
+Ä
+Ö
+1
+2
+3
+4
+5
+6
+7
+8
+9
+0
+</level>
+</Wordlist>
+</GCompris>
\ No newline at end of file
diff --git a/src/gletters-activity/resources/gletters/default-gd.xml
b/src/gletters-activity/resources/gletters/default-gd.xml
new file mode 100644
index 0000000..292a8f4
--- /dev/null
+++ b/src/gletters-activity/resources/gletters/default-gd.xml
@@ -0,0 +1,271 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<GCompris>
+<Wordlist name="default-gd" description="Gàidhlig" locale="gd">
+<level value="1">
+a
+b
+c
+d
+e
+f
+g
+i
+l
+m
+n
+o
+p
+r
+s
+t
+u
+</level>
+<level value="2">
+a
+b
+c
+d
+e
+f
+g
+i
+l
+m
+n
+o
+p
+r
+s
+t
+u
+1
+2
+3
+4
+5
+6
+7
+8
+9
+0
+</level>
+<level value="3">
+A
+B
+C
+D
+E
+F
+G
+I
+L
+M
+N
+O
+P
+R
+S
+T
+U
+</level>
+<level value="4">
+A
+B
+C
+D
+E
+F
+G
+I
+L
+M
+N
+O
+P
+R
+S
+T
+U
+1
+2
+3
+4
+5
+6
+7
+8
+9
+0
+</level>
+<level value="5">
+a
+b
+c
+d
+e
+f
+g
+i
+l
+m
+n
+o
+p
+r
+s
+t
+u
+A
+B
+C
+D
+E
+F
+G
+I
+L
+M
+N
+O
+P
+R
+S
+T
+U
+</level>
+<level value="6">
+bh
+ch
+dh
+fh
+gh
+mh
+ph
+sh
+th
+à
+è
+ì
+ò
+ù
+</level>
+<level value="7">
+BH
+CH
+DH
+FH
+GH
+MH
+PH
+SH
+TH
+À
+È
+Ì
+Ò
+Ù
+</level>
+<level value="8">
+bh
+ch
+dh
+fh
+gh
+mh
+ph
+sh
+th
+à
+è
+ì
+ò
+ù
+BH
+CH
+DH
+FH
+GH
+MH
+PH
+SH
+TH
+À
+È
+Ì
+Ò
+Ù
+</level>
+a
+b
+c
+d
+e
+f
+g
+i
+l
+m
+n
+o
+p
+r
+s
+t
+u
+A
+B
+C
+D
+E
+F
+G
+I
+L
+M
+N
+O
+P
+R
+S
+T
+U
+bh
+ch
+dh
+fh
+gh
+mh
+ph
+sh
+th
+à
+è
+ì
+ò
+ù
+BH
+CH
+DH
+FH
+GH
+MH
+PH
+SH
+TH
+À
+È
+Ì
+Ò
+Ù
+1
+2
+3
+4
+5
+6
+7
+8
+9
+0
+</Wordlist>
+</GCompris>
\ No newline at end of file
diff --git a/src/gletters-activity/resources/gletters/default-gl.xml
b/src/gletters-activity/resources/gletters/default-gl.xml
new file mode 100644
index 0000000..457aa9a
--- /dev/null
+++ b/src/gletters-activity/resources/gletters/default-gl.xml
@@ -0,0 +1,243 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<GCompris>
+<Wordlist name="default-gl" description="Default Galician" locale="gl">
+<level value="1">
+a
+b
+c
+d
+e
+f
+g
+h
+i
+l
+m
+n
+ñ
+o
+p
+q
+r
+s
+t
+u
+v
+x
+z
+</level>
+<level value="2">
+a
+b
+c
+d
+e
+f
+g
+h
+i
+l
+m
+n
+ñ
+o
+p
+q
+r
+s
+t
+u
+v
+x
+z
+1
+2
+3
+4
+5
+6
+7
+8
+9
+0
+</level>
+<level value="3">
+A
+B
+C
+D
+E
+F
+G
+H
+I
+K
+L
+M
+N
+Ñ
+O
+P
+Q
+R
+S
+T
+U
+V
+W
+X
+Y
+Z
+</level>
+<level value="4">
+A
+B
+C
+D
+E
+F
+G
+H
+I
+K
+L
+M
+N
+Ñ
+O
+P
+Q
+R
+S
+T
+U
+V
+W
+X
+Y
+Z
+1
+2
+3
+4
+5
+6
+7
+8
+9
+0
+</level>
+<level value="5">
+a
+b
+c
+d
+e
+f
+g
+h
+i
+l
+m
+n
+ñ
+o
+p
+q
+r
+s
+t
+u
+v
+x
+z
+A
+B
+C
+D
+E
+F
+G
+H
+I
+K
+L
+M
+N
+Ñ
+O
+P
+Q
+R
+S
+T
+U
+V
+W
+X
+Y
+Z
+</level>
+<level value="6">
+a
+b
+c
+d
+e
+f
+g
+h
+i
+l
+m
+n
+ñ
+o
+p
+q
+r
+s
+t
+u
+v
+x
+z
+A
+B
+C
+D
+E
+F
+G
+H
+I
+K
+L
+M
+N
+Ñ
+O
+P
+Q
+R
+S
+T
+U
+V
+W
+X
+Y
+Z
+1
+2
+3
+4
+5
+6
+7
+8
+9
+0
+</level>
+</Wordlist>
+</GCompris>
\ No newline at end of file
diff --git a/src/gletters-activity/resources/gletters/default-gu.xml
b/src/gletters-activity/resources/gletters/default-gu.xml
new file mode 100644
index 0000000..9664c2f
--- /dev/null
+++ b/src/gletters-activity/resources/gletters/default-gu.xml
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<GCompris>
+<Wordlist name="default-gu" description="Default Gujarati" locale="gu">
+<level value="1">
+ક
+ખ
+ગ
+ઘ
+ચ
+છ
+જ
+ઝ
+ગ
+ટ
+ઠ
+ડ
+ઢ
+ણ
+ત
+થ
+દ
+ધ
+ન
+પ
+ફ
+બ
+ભ
+મ
+ય
+ર
+લ
+વ
+સ
+શ
+ષ
+હ
+ળ
+ક
+્
+ષ
+જ
+્
+ઞ
+</level>
+</Wordlist>
+</GCompris>
\ No newline at end of file
diff --git a/src/gletters-activity/resources/gletters/default-he.xml
b/src/gletters-activity/resources/gletters/default-he.xml
new file mode 100644
index 0000000..b089509
--- /dev/null
+++ b/src/gletters-activity/resources/gletters/default-he.xml
@@ -0,0 +1,83 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<GCompris>
+<Wordlist name="default-he" description="Default Hebrew" locale="he">
+<level value="1">
+1
+2
+3
+4
+5
+6
+7
+8
+9
+0
+</level>
+<level value="2">
+א
+ב
+ג
+ד
+ה
+ו
+ז
+ח
+ט
+י
+כ
+ך
+ל
+מ
+ם
+נ
+ס
+ע
+פ
+ף
+צ
+ץ
+ק
+ר
+ש
+ת
+</level>
+<level value="3">
+א
+ב
+ג
+ד
+ה
+ו
+ז
+ח
+ט
+י
+כ
+ך
+ל
+מ
+ם
+נ
+ס
+ע
+פ
+ף
+צ
+ץ
+ק
+ר
+ש
+ת
+1
+2
+3
+4
+5
+6
+7
+8
+9
+0
+</level>
+</Wordlist>
+</GCompris>
\ No newline at end of file
diff --git a/src/gletters-activity/resources/gletters/default-hu.xml
b/src/gletters-activity/resources/gletters/default-hu.xml
new file mode 100644
index 0000000..4243a3a
--- /dev/null
+++ b/src/gletters-activity/resources/gletters/default-hu.xml
@@ -0,0 +1,323 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<GCompris>
+<Wordlist name="default-hu" description="Default Hungarian" locale="hu">
+<level value="1">
+a
+á
+b
+c
+d
+e
+é
+f
+g
+h
+i
+í
+j
+k
+l
+m
+n
+o
+ó
+ö
+ő
+p
+q
+r
+s
+t
+u
+ú
+ü
+ű
+v
+w
+x
+y
+z
+</level>
+<level value="2">
+a
+á
+b
+c
+d
+e
+é
+f
+g
+h
+i
+í
+j
+k
+l
+m
+n
+o
+ó
+ö
+ő
+p
+q
+r
+s
+t
+u
+ú
+ü
+ű
+v
+w
+x
+y
+z
+1
+2
+3
+4
+5
+6
+7
+8
+9
+0
+</level>
+<level value="3">
+A
+Á
+B
+C
+D
+E
+É
+F
+G
+H
+I
+Í
+J
+K
+L
+M
+N
+O
+Ó
+Ö
+Ő
+P
+Q
+R
+S
+T
+U
+Ú
+Ü
+Ű
+X
+Y
+V
+Z
+</level>
+<level value="4">
+A
+Á
+B
+C
+D
+E
+É
+F
+G
+H
+I
+Í
+J
+K
+L
+M
+N
+O
+Ó
+Ö
+Ő
+P
+Q
+R
+S
+T
+U
+Ú
+Ü
+Ű
+X
+Y
+V
+Z
+1
+2
+3
+4
+5
+6
+7
+8
+9
+0
+</level>
+<level value="5">
+a
+á
+b
+c
+d
+e
+é
+f
+g
+h
+i
+í
+j
+k
+l
+m
+n
+o
+ó
+ö
+ő
+p
+q
+r
+s
+t
+u
+ú
+ü
+ű
+v
+w
+x
+y
+z
+A
+Á
+B
+C
+D
+E
+É
+F
+G
+H
+I
+Í
+J
+K
+L
+M
+N
+O
+Ó
+Ö
+Ő
+P
+Q
+R
+S
+T
+U
+Ú
+Ü
+Ű
+X
+Y
+V
+Z
+</level>
+<level value="6">
+a
+á
+b
+c
+d
+e
+é
+f
+g
+h
+i
+í
+j
+k
+l
+m
+n
+o
+ó
+ö
+ő
+p
+q
+r
+s
+t
+u
+ú
+ü
+ű
+v
+w
+x
+y
+z
+A
+Á
+B
+C
+D
+E
+É
+F
+G
+H
+I
+Í
+J
+K
+L
+M
+N
+O
+Ó
+Ö
+Ő
+P
+Q
+R
+S
+T
+U
+Ú
+Ü
+Ű
+X
+Y
+V
+Z
+1
+2
+3
+4
+5
+6
+7
+8
+9
+0
+</level>
+</Wordlist>
+</GCompris>
\ No newline at end of file
diff --git a/src/gletters-activity/resources/gletters/default-ka.xml
b/src/gletters-activity/resources/gletters/default-ka.xml
new file mode 100644
index 0000000..eb20eb1
--- /dev/null
+++ b/src/gletters-activity/resources/gletters/default-ka.xml
@@ -0,0 +1,97 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<GCompris>
+<Wordlist name="default-ka" description="Default Georgian" locale="ka">
+<level value="1">
+1
+2
+3
+4
+5
+6
+7
+8
+9
+0
+</level>
+<level value="2">
+ა
+ბ
+გ
+დ
+ე
+ვ
+ზ
+თ
+ი
+კ
+ლ
+მ
+ნ
+ო
+პ
+ჟ
+რ
+ს
+ტ
+უ
+ფ
+ქ
+ღ
+ყ
+შ
+ჩ
+ც
+ძ
+წ
+ჭ
+ხ
+ჯ
+ჰ
+</level>
+<level value="3">
+ა
+ბ
+გ
+დ
+ე
+ვ
+ზ
+თ
+ი
+კ
+ლ
+მ
+ნ
+ო
+პ
+ჟ
+რ
+ს
+ტ
+უ
+ფ
+ქ
+ღ
+ყ
+შ
+ჩ
+ც
+ძ
+წ
+ჭ
+ხ
+ჯ
+ჰ
+1
+2
+3
+4
+5
+6
+7
+8
+9
+0
+</level>
+</Wordlist>
+</GCompris>
\ No newline at end of file
diff --git a/src/gletters-activity/resources/gletters/default-lt.xml
b/src/gletters-activity/resources/gletters/default-lt.xml
new file mode 100644
index 0000000..e0d7e95
--- /dev/null
+++ b/src/gletters-activity/resources/gletters/default-lt.xml
@@ -0,0 +1,299 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<GCompris>
+<Wordlist name="default-lt" description="Default Lithuanian" locale="lt">
+<level value="1">
+a
+ą
+b
+c
+č
+d
+e
+ę
+ė
+f
+g
+h
+i
+į
+y
+j
+k
+l
+m
+n
+o
+p
+r
+s
+š
+t
+u
+ų
+ū
+v
+z
+ž
+</level>
+<level value="2">
+a
+ą
+b
+c
+č
+d
+e
+ę
+ė
+f
+g
+h
+i
+į
+y
+j
+k
+l
+m
+n
+o
+p
+r
+s
+š
+t
+u
+ų
+ū
+v
+z
+ž
+1
+2
+3
+4
+5
+6
+7
+8
+9
+0
+</level>
+<level value="3">
+A
+Ą
+C
+Č
+D
+E
+Ę
+Ė
+F
+G
+H
+I
+Į
+Y
+J
+K
+L
+M
+N
+O
+P
+R
+S
+Š
+T
+U
+Ų
+Ū
+V
+Z
+Ž
+</level>
+<level value="4">
+A
+Ą
+C
+Č
+D
+E
+Ę
+Ė
+F
+G
+H
+I
+Į
+Y
+J
+K
+L
+M
+N
+O
+P
+R
+S
+Š
+T
+U
+Ų
+Ū
+V
+Z
+Ž
+1
+2
+3
+4
+5
+6
+7
+8
+9
+0
+</level>
+<level value="5">
+a
+ą
+b
+c
+č
+d
+e
+ę
+ė
+f
+g
+h
+i
+į
+y
+j
+k
+l
+m
+n
+o
+p
+r
+s
+š
+t
+u
+ų
+ū
+v
+z
+ž
+A
+Ą
+C
+Č
+D
+E
+Ę
+Ė
+F
+G
+H
+I
+Į
+Y
+J
+K
+L
+M
+N
+O
+P
+R
+S
+Š
+T
+U
+Ų
+Ū
+V
+Z
+Ž
+</level>
+<level value="6">
+a
+ą
+b
+c
+č
+d
+e
+ę
+ė
+f
+g
+h
+i
+į
+y
+j
+k
+l
+m
+n
+o
+p
+r
+s
+š
+t
+u
+ų
+ū
+v
+z
+ž
+A
+Ą
+C
+Č
+D
+E
+Ę
+Ė
+F
+G
+H
+I
+Į
+Y
+J
+K
+L
+M
+N
+O
+P
+R
+S
+Š
+T
+U
+Ų
+Ū
+V
+Z
+Ž
+1
+2
+3
+4
+5
+6
+7
+8
+9
+0
+</level>
+</Wordlist>
+</GCompris>
\ No newline at end of file
diff --git a/src/gletters-activity/resources/gletters/default-lv.xml
b/src/gletters-activity/resources/gletters/default-lv.xml
new file mode 100644
index 0000000..c111b05
--- /dev/null
+++ b/src/gletters-activity/resources/gletters/default-lv.xml
@@ -0,0 +1,311 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<GCompris>
+<Wordlist name="default-lv" description="Default Latvian (Lettish)" locale="lv">
+<level value="1">
+a
+ā
+b
+c
+č
+d
+e
+ē
+f
+g
+ģ
+h
+i
+ī
+j
+k
+ķ
+l
+ļ
+m
+n
+ņ
+o
+p
+r
+s
+š
+t
+u
+ū
+v
+z
+ž
+</level>
+<level value="2">
+a
+ā
+b
+c
+č
+d
+e
+ē
+f
+g
+ģ
+h
+i
+ī
+j
+k
+ķ
+l
+ļ
+m
+n
+ņ
+o
+p
+r
+s
+š
+t
+u
+ū
+v
+z
+ž
+1
+2
+3
+4
+5
+6
+7
+8
+9
+0
+</level>
+<level value="3">
+A
+Ā
+B
+C
+Č
+D
+E
+Ē
+F
+G
+Ģ
+H
+I
+Ī
+J
+K
+Ķ
+L
+Ļ
+M
+N
+Ņ
+O
+P
+R
+S
+Š
+T
+U
+Ū
+V
+Z
+Ž
+</level>
+<level value="4">
+A
+Ā
+B
+C
+Č
+D
+E
+Ē
+F
+G
+Ģ
+H
+I
+Ī
+J
+K
+Ķ
+L
+Ļ
+M
+N
+Ņ
+O
+P
+R
+S
+Š
+T
+U
+Ū
+V
+Z
+Ž
+1
+2
+3
+4
+5
+6
+7
+8
+9
+0
+</level>
+<level value="5">
+a
+ā
+b
+c
+č
+d
+e
+ē
+f
+g
+ģ
+h
+i
+ī
+j
+k
+ķ
+l
+ļ
+m
+n
+ņ
+o
+p
+r
+s
+š
+t
+u
+ū
+v
+z
+ž
+A
+Ā
+B
+C
+Č
+D
+E
+Ē
+F
+G
+Ģ
+H
+I
+Ī
+J
+K
+Ķ
+L
+Ļ
+M
+N
+Ņ
+O
+P
+R
+S
+Š
+T
+U
+Ū
+V
+Z
+Ž
+</level>
+<level value="6">
+a
+ā
+b
+c
+č
+d
+e
+ē
+f
+g
+ģ
+h
+i
+ī
+j
+k
+ķ
+l
+ļ
+m
+n
+ņ
+o
+p
+r
+s
+š
+t
+u
+ū
+v
+z
+ž
+A
+Ā
+B
+C
+Č
+D
+E
+Ē
+F
+G
+Ģ
+H
+I
+Ī
+J
+K
+Ķ
+L
+Ļ
+M
+N
+Ņ
+O
+P
+R
+S
+Š
+T
+U
+Ū
+V
+Z
+Ž
+1
+2
+3
+4
+5
+6
+7
+8
+9
+0
+</level>
+</Wordlist>
+</GCompris>
\ No newline at end of file
diff --git a/src/gletters-activity/resources/gletters/default-nn.xml
b/src/gletters-activity/resources/gletters/default-nn.xml
new file mode 100644
index 0000000..1c2e0c8
--- /dev/null
+++ b/src/gletters-activity/resources/gletters/default-nn.xml
@@ -0,0 +1,279 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<GCompris>
+<Wordlist name="default-nn" description="Default Norwegian Nynorsk" locale="nn">
+<level value="1">
+a
+b
+c
+d
+e
+f
+g
+h
+i
+j
+k
+l
+m
+n
+o
+p
+q
+r
+s
+t
+u
+v
+w
+x
+y
+z
+æ
+ø
+å
+</level>
+<level value="2">
+a
+b
+c
+d
+e
+f
+g
+h
+i
+j
+k
+l
+m
+n
+o
+p
+q
+r
+s
+t
+u
+v
+w
+x
+y
+z
+æ
+ø
+å
+1
+2
+3
+4
+5
+6
+7
+8
+9
+0
+</level>
+<level value="3">
+A
+B
+C
+D
+E
+F
+G
+H
+I
+J
+K
+L
+M
+N
+O
+P
+Q
+R
+S
+T
+U
+V
+W
+X
+Y
+Z
+Æ
+Ø
+Å
+</level>
+<level value="4">
+A
+B
+C
+D
+E
+F
+G
+H
+I
+J
+K
+L
+M
+N
+O
+P
+Q
+R
+S
+T
+U
+V
+W
+X
+Y
+Z
+Æ
+Ø
+Å
+1
+2
+3
+4
+5
+6
+7
+8
+9
+0
+</level>
+<level value="5">
+a
+b
+c
+d
+e
+f
+g
+h
+i
+j
+k
+l
+m
+n
+o
+p
+q
+r
+s
+t
+u
+v
+w
+x
+y
+z
+æ
+ø
+å
+A
+B
+C
+D
+E
+F
+G
+H
+I
+J
+K
+L
+M
+N
+O
+P
+Q
+R
+S
+T
+U
+V
+W
+X
+Y
+Z
+Æ
+Ø
+Å
+</level>
+<level value="6">
+a
+b
+c
+d
+e
+f
+g
+h
+i
+j
+k
+l
+m
+n
+o
+p
+q
+r
+s
+t
+u
+v
+w
+x
+y
+z
+æ
+ø
+å
+A
+B
+C
+D
+E
+F
+G
+H
+I
+J
+K
+L
+M
+N
+O
+P
+Q
+R
+S
+T
+U
+V
+W
+X
+Y
+Z
+Æ
+Ø
+Å
+1
+2
+3
+4
+5
+6
+7
+8
+9
+0
+</level>
+</Wordlist>
+</GCompris>
\ No newline at end of file
diff --git a/src/gletters-activity/resources/gletters/default-pl.xml
b/src/gletters-activity/resources/gletters/default-pl.xml
new file mode 100644
index 0000000..6ff23fd
--- /dev/null
+++ b/src/gletters-activity/resources/gletters/default-pl.xml
@@ -0,0 +1,311 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<GCompris>
+<Wordlist name="default-pl" description="Default Polish" locale="pl">
+<level value="1">
+a
+ą
+b
+c
+ć
+d
+e
+ę
+f
+g
+h
+i
+j
+k
+l
+ł
+m
+n
+ń
+o
+ó
+p
+r
+s
+ś
+t
+u
+w
+x
+y
+z
+ź
+ż
+</level>
+<level value="2">
+a
+ą
+b
+c
+ć
+d
+e
+ę
+f
+g
+h
+i
+j
+k
+l
+ł
+m
+n
+ń
+o
+ó
+p
+r
+s
+ś
+t
+u
+w
+x
+y
+z
+ź
+ż
+1
+2
+3
+4
+5
+6
+7
+8
+9
+0
+</level>
+<level value="3">
+A
+Ą
+B
+C
+Ć
+D
+E
+Ę
+F
+G
+H
+I
+J
+K
+L
+Ł
+M
+N
+Ń
+O
+Ó
+P
+R
+S
+Ś
+T
+U
+W
+X
+Y
+Z
+Ź
+Ż
+</level>
+<level value="4">
+A
+Ą
+B
+C
+Ć
+D
+E
+Ę
+F
+G
+H
+I
+J
+K
+L
+Ł
+M
+N
+Ń
+O
+Ó
+P
+R
+S
+Ś
+T
+U
+W
+X
+Y
+Z
+Ź
+Ż
+1
+2
+3
+4
+5
+6
+7
+8
+9
+0
+</level>
+<level value="5">
+a
+ą
+b
+c
+ć
+d
+e
+ę
+f
+g
+h
+i
+j
+k
+l
+ł
+m
+n
+ń
+o
+ó
+p
+r
+s
+ś
+t
+u
+w
+x
+y
+z
+ź
+ż
+A
+Ą
+B
+C
+Ć
+D
+E
+Ę
+F
+G
+H
+I
+J
+K
+L
+Ł
+M
+N
+Ń
+O
+Ó
+P
+R
+S
+Ś
+T
+U
+W
+X
+Y
+Z
+Ź
+Ż
+</level>
+<level value="6">
+a
+ą
+b
+c
+ć
+d
+e
+ę
+f
+g
+h
+i
+j
+k
+l
+ł
+m
+n
+ń
+o
+ó
+p
+r
+s
+ś
+t
+u
+w
+x
+y
+z
+ź
+ż
+A
+Ą
+B
+C
+Ć
+D
+E
+Ę
+F
+G
+H
+I
+J
+K
+L
+Ł
+M
+N
+Ń
+O
+Ó
+P
+R
+S
+Ś
+T
+U
+W
+X
+Y
+Z
+Ź
+Ż
+1
+2
+3
+4
+5
+6
+7
+8
+9
+0
+</level>
+</Wordlist>
+</GCompris>
\ No newline at end of file
diff --git a/src/gletters-activity/resources/gletters/default-ru.xml
b/src/gletters-activity/resources/gletters/default-ru.xml
new file mode 100644
index 0000000..edf19f7
--- /dev/null
+++ b/src/gletters-activity/resources/gletters/default-ru.xml
@@ -0,0 +1,287 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<GCompris>
+<Wordlist name="default-ru" description="Default Russian" locale="ru">
+<level value="1">
+а
+б
+в
+г
+д
+е
+ё
+ж
+з
+и
+й
+к
+л
+м
+н
+о
+п
+р
+с
+т
+у
+ф
+х
+ц
+ч
+ш
+щ
+э
+ю
+я
+</level>
+<level value="2">
+а
+б
+в
+г
+д
+е
+ё
+ж
+з
+и
+й
+к
+л
+м
+н
+о
+п
+р
+с
+т
+у
+ф
+х
+ц
+ч
+ш
+щ
+э
+ю
+я
+1
+2
+3
+4
+5
+6
+7
+8
+9
+0
+</level>
+<level value="3">
+А
+Б
+В
+Г
+Д
+Е
+Ё
+Ж
+З
+И
+Й
+К
+Л
+М
+Н
+О
+П
+Р
+С
+Т
+У
+Ф
+Х
+Ц
+Ч
+Ш
+Щ
+Э
+Ю
+Я
+</level>
+<level value="4">
+А
+Б
+В
+Г
+Д
+Е
+Ё
+Ж
+З
+И
+Й
+К
+Л
+М
+Н
+О
+П
+Р
+С
+Т
+У
+Ф
+Х
+Ц
+Ч
+Ш
+Щ
+Э
+Ю
+Я
+1
+2
+3
+4
+5
+6
+7
+8
+9
+0
+</level>
+<level value="5">
+а
+б
+в
+г
+д
+е
+ё
+ж
+з
+и
+й
+к
+л
+м
+н
+о
+п
+р
+с
+т
+у
+ф
+х
+ц
+ч
+ш
+щ
+э
+ю
+я
+А
+Б
+В
+Г
+Д
+Е
+Ё
+Ж
+З
+И
+Й
+К
+Л
+М
+Н
+О
+П
+Р
+С
+Т
+У
+Ф
+Х
+Ц
+Ч
+Ш
+Щ
+Э
+Ю
+Я
+</level>
+<level value="6">
+а
+б
+в
+г
+д
+е
+ё
+ж
+з
+и
+й
+к
+л
+м
+н
+о
+п
+р
+с
+т
+у
+ф
+х
+ц
+ч
+ш
+щ
+э
+ю
+я
+А
+Б
+В
+Г
+Д
+Е
+Ё
+Ж
+З
+И
+Й
+К
+Л
+М
+Н
+О
+П
+Р
+С
+Т
+У
+Ф
+Х
+Ц
+Ч
+Ш
+Щ
+Э
+Ю
+Я
+1
+2
+3
+4
+5
+6
+7
+8
+9
+0
+</level>
+</Wordlist>
+</GCompris>
\ No newline at end of file
diff --git a/src/gletters-activity/resources/gletters/default-sk.xml
b/src/gletters-activity/resources/gletters/default-sk.xml
new file mode 100644
index 0000000..2230a5e
--- /dev/null
+++ b/src/gletters-activity/resources/gletters/default-sk.xml
@@ -0,0 +1,391 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<GCompris>
+<Wordlist name="default-sk" description="Default Slovak" locale="sk">
+<level value="1">
+a
+á
+ä
+b
+c
+č
+d
+ď
+e
+é
+f
+g
+h
+i
+í
+j
+k
+l
+ľ
+ĺ
+m
+n
+ň
+o
+ó
+ô
+p
+q
+r
+ŕ
+s
+š
+t
+ť
+u
+ú
+v
+w
+x
+y
+ý
+z
+ž
+</level>
+<level value="2">
+a
+á
+ä
+b
+c
+č
+d
+ď
+e
+é
+f
+g
+h
+i
+í
+j
+k
+l
+ľ
+ĺ
+m
+n
+ň
+o
+ó
+ô
+p
+q
+r
+ŕ
+s
+š
+t
+ť
+u
+ú
+v
+w
+x
+y
+ý
+z
+ž
+1
+2
+3
+4
+5
+6
+7
+8
+9
+0
+</level>
+<level value="3">
+A
+Á
+Ä
+B
+C
+Č
+D
+Ď
+E
+É
+F
+G
+H
+I
+Í
+J
+K
+L
+Ľ
+Ĺ
+M
+N
+Ň
+O
+Ó
+Ô
+P
+Q
+R
+Ŕ
+S
+Š
+T
+Ť
+U
+Ú
+V
+W
+X
+Y
+Ý
+Z
+Ž
+</level>
+<level value="4">
+A
+Á
+Ä
+B
+C
+Č
+D
+Ď
+E
+É
+F
+G
+H
+I
+Í
+J
+K
+L
+Ľ
+Ĺ
+M
+N
+Ň
+O
+Ó
+Ô
+P
+Q
+R
+Ŕ
+S
+Š
+T
+Ť
+U
+Ú
+V
+W
+X
+Y
+Ý
+Z
+Ž
+1
+2
+3
+4
+5
+6
+7
+8
+9
+0
+</level>
+<level value="5">
+a
+á
+ä
+b
+c
+č
+d
+ď
+e
+é
+f
+g
+h
+i
+í
+j
+k
+l
+ľ
+ĺ
+m
+n
+ň
+o
+ó
+ô
+p
+q
+r
+ŕ
+s
+š
+t
+ť
+u
+ú
+v
+w
+x
+y
+ý
+z
+ž
+A
+Á
+Ä
+B
+C
+Č
+D
+Ď
+E
+É
+F
+G
+H
+I
+Í
+J
+K
+L
+Ľ
+Ĺ
+M
+N
+Ň
+O
+Ó
+Ô
+P
+Q
+R
+Ŕ
+S
+Š
+T
+Ť
+U
+Ú
+V
+W
+X
+Y
+Ý
+Z
+Ž
+</level>
+<level value="6">
+a
+á
+ä
+b
+c
+č
+d
+ď
+e
+é
+f
+g
+h
+i
+í
+j
+k
+l
+ľ
+ĺ
+m
+n
+ň
+o
+ó
+ô
+p
+q
+r
+ŕ
+s
+š
+t
+ť
+u
+ú
+v
+w
+x
+y
+ý
+z
+ž
+A
+Á
+Ä
+B
+C
+Č
+D
+Ď
+E
+É
+F
+G
+H
+I
+Í
+J
+K
+L
+Ľ
+Ĺ
+M
+N
+Ň
+O
+Ó
+Ô
+P
+Q
+R
+Ŕ
+S
+Š
+T
+Ť
+U
+Ú
+V
+W
+X
+Y
+Ý
+Z
+Ž
+1
+2
+3
+4
+5
+6
+7
+8
+9
+0
+</level>
+</Wordlist>
+</GCompris>
\ No newline at end of file
diff --git a/src/gletters-activity/resources/gletters/default-sl.xml
b/src/gletters-activity/resources/gletters/default-sl.xml
new file mode 100644
index 0000000..2156f0f
--- /dev/null
+++ b/src/gletters-activity/resources/gletters/default-sl.xml
@@ -0,0 +1,124 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<GCompris>
+<Wordlist name="default-sl" description="Default Slovenian" locale="sl">
+<level value="1">
+a
+b
+c
+č
+d
+e
+f
+g
+h
+i
+j
+k
+l
+m
+n
+o
+p
+r
+s
+š
+t
+u
+v
+z
+ž
+</level>
+<level value="2">
+a
+b
+c
+č
+d
+e
+f
+g
+h
+i
+j
+k
+l
+m
+n
+o
+p
+r
+s
+š
+t
+u
+v
+z
+ž
+numbers
+</level>
+<level value="3">
+uppercase
+</level>
+<level value="4">
+uppercase
+numbers
+</level>
+<level value="5">
+a
+b
+c
+č
+d
+e
+f
+g
+h
+i
+j
+k
+l
+m
+n
+o
+p
+r
+s
+š
+t
+u
+v
+z
+ž
+uppercase
+</level>
+<level value="6">
+a
+b
+c
+č
+d
+e
+f
+g
+h
+i
+j
+k
+l
+m
+n
+o
+p
+r
+s
+š
+t
+u
+v
+z
+ž
+uppercase
+numbers
+</level>
+</Wordlist>
+</GCompris>
\ No newline at end of file
diff --git a/src/gletters-activity/resources/gletters/default-so.xml
b/src/gletters-activity/resources/gletters/default-so.xml
new file mode 100644
index 0000000..0cc206f
--- /dev/null
+++ b/src/gletters-activity/resources/gletters/default-so.xml
@@ -0,0 +1,231 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<GCompris>
+<Wordlist name="default-so" description="Default Somali" locale="so">
+<level value="1">
+b
+t
+j
+x
+d
+r
+s
+c
+g
+f
+q
+k
+l
+m
+n
+w
+h
+y
+a
+e
+i
+o
+u
+</level>
+<level value="2">
+b
+t
+j
+x
+d
+r
+s
+c
+g
+f
+q
+k
+l
+m
+n
+w
+h
+y
+a
+e
+i
+o
+u
+1
+2
+3
+4
+5
+6
+7
+8
+9
+0
+</level>
+<level value="3">
+B
+T
+J
+X
+D
+R
+S
+C
+G
+F
+Q
+K
+L
+M
+N
+W
+H
+Y
+A
+E
+I
+O
+U
+</level>
+<level value="4">
+B
+T
+J
+X
+D
+R
+S
+C
+G
+F
+Q
+K
+L
+M
+N
+W
+H
+Y
+A
+E
+I
+O
+U
+1
+2
+3
+4
+5
+6
+7
+8
+9
+0
+</level>
+<level value="5">
+b
+t
+j
+x
+d
+r
+s
+c
+g
+f
+q
+k
+l
+m
+n
+w
+h
+y
+a
+e
+i
+o
+u
+B
+T
+J
+X
+D
+R
+S
+C
+G
+F
+Q
+K
+L
+M
+N
+W
+H
+Y
+A
+E
+I
+O
+U
+</level>
+<level value="6">
+b
+t
+j
+x
+d
+r
+s
+c
+g
+f
+q
+k
+l
+m
+n
+w
+h
+y
+a
+e
+i
+o
+u
+B
+T
+J
+X
+D
+R
+S
+C
+G
+F
+Q
+K
+L
+M
+N
+W
+H
+Y
+A
+E
+I
+O
+U
+1
+2
+3
+4
+5
+6
+7
+8
+9
+0
+</level>
+</Wordlist>
+</GCompris>
\ No newline at end of file
diff --git a/src/gletters-activity/resources/gletters/default-sr.xml
b/src/gletters-activity/resources/gletters/default-sr.xml
new file mode 100644
index 0000000..655aba7
--- /dev/null
+++ b/src/gletters-activity/resources/gletters/default-sr.xml
@@ -0,0 +1,287 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<GCompris>
+<Wordlist name="default-sr" description="Default Serbian" locale="sr">
+<level value="1">
+а
+б
+в
+г
+д
+ђ
+е
+ж
+з
+и
+ј
+к
+л
+љ
+м
+н
+њ
+о
+п
+р
+с
+т
+ћ
+у
+ф
+х
+ц
+ч
+џ
+ш
+</level>
+<level value="2">
+а
+б
+в
+г
+д
+ђ
+е
+ж
+з
+и
+ј
+к
+л
+љ
+м
+н
+њ
+о
+п
+р
+с
+т
+ћ
+у
+ф
+х
+ц
+ч
+џ
+ш
+1
+2
+3
+4
+5
+6
+7
+8
+9
+0
+</level>
+<level value="3">
+А
+Б
+В
+Г
+Д
+Ђ
+Е
+Ж
+З
+И
+Ј
+К
+Л
+Љ
+М
+Н
+Њ
+О
+П
+Р
+С
+Т
+Ћ
+У
+Ф
+Х
+Ц
+Ч
+Џ
+Ш
+</level>
+<level value="4">
+А
+Б
+В
+Г
+Д
+Ђ
+Е
+Ж
+З
+И
+Ј
+К
+Л
+Љ
+М
+Н
+Њ
+О
+П
+Р
+С
+Т
+Ћ
+У
+Ф
+Х
+Ц
+Ч
+Џ
+Ш
+1
+2
+3
+4
+5
+6
+7
+8
+9
+0
+</level>
+<level value="5">
+а
+б
+в
+г
+д
+ђ
+е
+ж
+з
+и
+ј
+к
+л
+љ
+м
+н
+њ
+о
+п
+р
+с
+т
+ћ
+у
+ф
+х
+ц
+ч
+џ
+ш
+А
+Б
+В
+Г
+Д
+Ђ
+Е
+Ж
+З
+И
+Ј
+К
+Л
+Љ
+М
+Н
+Њ
+О
+П
+Р
+С
+Т
+Ћ
+У
+Ф
+Х
+Ц
+Ч
+Џ
+Ш
+</level>
+<level value="6">
+а
+б
+в
+г
+д
+ђ
+е
+ж
+з
+и
+ј
+к
+л
+љ
+м
+н
+њ
+о
+п
+р
+с
+т
+ћ
+у
+ф
+х
+ц
+ч
+џ
+ш
+А
+Б
+В
+Г
+Д
+Ђ
+Е
+Ж
+З
+И
+Ј
+К
+Л
+Љ
+М
+Н
+Њ
+О
+П
+Р
+С
+Т
+Ћ
+У
+Ф
+Х
+Ц
+Ч
+Џ
+Ш
+1
+2
+3
+4
+5
+6
+7
+8
+9
+0
+</level>
+</Wordlist>
+</GCompris>
\ No newline at end of file
diff --git a/src/gletters-activity/resources/gletters/default-sr latin xml
b/src/gletters-activity/resources/gletters/default-sr latin xml
new file mode 100644
index 0000000..2b68f5f
--- /dev/null
+++ b/src/gletters-activity/resources/gletters/default-sr latin xml
@@ -0,0 +1,347 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<GCompris>
+<Wordlist name="default-sr latin" description="Default Serbian (Latin script)" locale="sr latin">
+<level value="1">
+a
+b
+v
+g
+d
+đ
+e
+ž
+z
+i
+j
+k
+l
+l
+j
+m
+n
+n
+j
+o
+p
+r
+s
+t
+ć
+u
+f
+h
+c
+č
+d
+ž
+š
+l
+o
+w
+e
+r
+c
+a
+s
+e
+</level>
+<level value="2">
+a
+b
+v
+g
+d
+đ
+e
+ž
+z
+i
+j
+k
+l
+l
+j
+m
+n
+n
+j
+o
+p
+r
+s
+t
+ć
+u
+f
+h
+c
+č
+d
+ž
+š
+l
+o
+w
+e
+r
+c
+a
+s
+e
+1
+2
+3
+4
+5
+6
+7
+8
+9
+0
+</level>
+<level value="3">
+A
+B
+V
+G
+D
+Đ
+E
+Ž
+Z
+I
+J
+K
+L
+L
+J
+M
+N
+N
+J
+O
+P
+R
+S
+T
+Ć
+U
+F
+H
+C
+Č
+D
+Ž
+Š
+</level>
+<level value="4">
+A
+B
+V
+G
+D
+Đ
+E
+Ž
+Z
+I
+J
+K
+L
+L
+J
+M
+N
+N
+J
+O
+P
+R
+S
+T
+Ć
+U
+F
+H
+C
+Č
+D
+Ž
+Š
+1
+2
+3
+4
+5
+6
+7
+8
+9
+0
+</level>
+<level value="5">
+a
+b
+v
+g
+d
+đ
+e
+ž
+z
+i
+j
+k
+l
+l
+j
+m
+n
+n
+j
+o
+p
+r
+s
+t
+ć
+u
+f
+h
+c
+č
+d
+ž
+š
+l
+o
+w
+e
+r
+c
+a
+s
+e
+A
+B
+V
+G
+D
+Đ
+E
+Ž
+Z
+I
+J
+K
+L
+L
+J
+M
+N
+N
+J
+O
+P
+R
+S
+T
+Ć
+U
+F
+H
+C
+Č
+D
+Ž
+Š
+</level>
+<level value="6">
+a
+b
+v
+g
+d
+đ
+e
+ž
+z
+i
+j
+k
+l
+l
+j
+m
+n
+n
+j
+o
+p
+r
+s
+t
+ć
+u
+f
+h
+c
+č
+d
+ž
+š
+l
+o
+w
+e
+r
+c
+a
+s
+e
+A
+B
+V
+G
+D
+Đ
+E
+Ž
+Z
+I
+J
+K
+L
+L
+J
+M
+N
+N
+J
+O
+P
+R
+S
+T
+Ć
+U
+F
+H
+C
+Č
+D
+Ž
+Š
+1
+2
+3
+4
+5
+6
+7
+8
+9
+0
+</level>
+</Wordlist>
+</GCompris>
\ No newline at end of file
diff --git a/src/gletters-activity/resources/gletters/default-sv.xml
b/src/gletters-activity/resources/gletters/default-sv.xml
new file mode 100644
index 0000000..52ad64d
--- /dev/null
+++ b/src/gletters-activity/resources/gletters/default-sv.xml
@@ -0,0 +1,244 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<GCompris>
+<Wordlist name="default-sv" description="Default Swedish" locale="sv">
+<level value="1">
+a
+b
+c
+d
+e
+f
+g
+h
+i
+j
+k
+l
+m
+n
+o
+p
+q
+r
+s
+t
+u
+v
+x
+y
+z
+å
+ä
+ö
+</level>
+<level value="2">
+a
+b
+c
+d
+e
+f
+g
+h
+i
+j
+k
+l
+m
+n
+o
+p
+q
+r
+s
+t
+u
+v
+x
+y
+z
+å
+ä
+ö
+numbers
+</level>
+<level value="3">
+A
+B
+C
+D
+E
+F
+G
+H
+I
+J
+K
+L
+M
+N
+O
+P
+Q
+R
+S
+T
+U
+V
+X
+Y
+Z
+Å
+Ä
+Ö
+</level>
+<level value="4">
+A
+B
+C
+D
+E
+F
+G
+H
+I
+J
+K
+L
+M
+N
+O
+P
+Q
+R
+S
+T
+U
+V
+X
+Y
+Z
+Å
+Ä
+Ö
+numbers
+</level>
+<level value="5">
+a
+b
+c
+d
+e
+f
+g
+h
+i
+j
+k
+l
+m
+n
+o
+p
+q
+r
+s
+t
+u
+v
+x
+y
+z
+å
+ä
+ö
+A
+B
+C
+D
+E
+F
+G
+H
+I
+J
+K
+L
+M
+N
+O
+P
+Q
+R
+S
+T
+U
+V
+X
+Y
+Z
+Å
+Ä
+Ö
+</level>
+<level value="6">
+a
+b
+c
+d
+e
+f
+g
+h
+i
+j
+k
+l
+m
+n
+o
+p
+q
+r
+s
+t
+u
+v
+x
+y
+z
+å
+ä
+ö
+A
+B
+C
+D
+E
+F
+G
+H
+I
+J
+K
+L
+M
+N
+O
+P
+Q
+R
+S
+T
+U
+V
+X
+Y
+Z
+Å
+Ä
+Ö
+numbers
+</level>
+</Wordlist>
+</GCompris>
\ No newline at end of file
diff --git a/src/gletters-activity/resources/gletters/default-ta.xml
b/src/gletters-activity/resources/gletters/default-ta.xml
new file mode 100644
index 0000000..e71f218
--- /dev/null
+++ b/src/gletters-activity/resources/gletters/default-ta.xml
@@ -0,0 +1,91 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<GCompris>
+<Wordlist name="default-ta" description="Default Tamil" locale="ta">
+<level value="1">
+1
+2
+3
+4
+5
+6
+7
+8
+9
+0
+</level>
+<level value="2">
+அ
+ஆ
+இ
+ஈ
+உ
+ஊ
+எ
+ஏ
+ஐ
+ஒ
+ஓ
+ஔ
+க
+ச
+ட
+த
+ப
+ற
+ய
+ர
+ல
+வ
+ழ
+ல
+ங
+ஞ
+ண
+ந
+ம
+ன
+</level>
+<level value="3">
+அ
+ஆ
+இ
+ஈ
+உ
+ஊ
+எ
+ஏ
+ஐ
+ஒ
+ஓ
+ஔ
+க
+ச
+ட
+த
+ப
+ற
+ய
+ர
+ல
+வ
+ழ
+ல
+ங
+ஞ
+ண
+ந
+ம
+ன
+1
+2
+3
+4
+5
+6
+7
+8
+9
+0
+</level>
+</Wordlist>
+</GCompris>
\ No newline at end of file
diff --git a/src/gletters-activity/resources/gletters/default-uk.xml
b/src/gletters-activity/resources/gletters/default-uk.xml
new file mode 100644
index 0000000..f47e24d
--- /dev/null
+++ b/src/gletters-activity/resources/gletters/default-uk.xml
@@ -0,0 +1,311 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<GCompris>
+<Wordlist name="default-uk" description="Default Ukrainian" locale="uk">
+<level value="1">
+а
+б
+в
+г
+ґ
+д
+е
+є
+ж
+з
+и
+і
+ї
+й
+к
+л
+м
+н
+о
+п
+р
+с
+т
+у
+ф
+х
+ц
+ч
+ш
+щ
+ю
+я
+ь
+</level>
+<level value="2">
+а
+б
+в
+г
+ґ
+д
+е
+є
+ж
+з
+и
+і
+ї
+й
+к
+л
+м
+н
+о
+п
+р
+с
+т
+у
+ф
+х
+ц
+ч
+ш
+щ
+ю
+я
+ь
+1
+2
+3
+4
+5
+6
+7
+8
+9
+0
+</level>
+<level value="3">
+А
+Б
+В
+Г
+Ґ
+Д
+Е
+Є
+Ж
+З
+И
+І
+Ї
+Й
+К
+Л
+М
+Н
+О
+П
+Р
+С
+Т
+У
+Ф
+Х
+Ц
+Ч
+Ш
+Щ
+Ю
+Я
+Ь
+</level>
+<level value="4">
+А
+Б
+В
+Г
+Ґ
+Д
+Е
+Є
+Ж
+З
+И
+І
+Ї
+Й
+К
+Л
+М
+Н
+О
+П
+Р
+С
+Т
+У
+Ф
+Х
+Ц
+Ч
+Ш
+Щ
+Ю
+Я
+Ь
+1
+2
+3
+4
+5
+6
+7
+8
+9
+0
+</level>
+<level value="5">
+а
+б
+в
+г
+ґ
+д
+е
+є
+ж
+з
+и
+і
+ї
+й
+к
+л
+м
+н
+о
+п
+р
+с
+т
+у
+ф
+х
+ц
+ч
+ш
+щ
+ю
+я
+ь
+А
+Б
+В
+Г
+Ґ
+Д
+Е
+Є
+Ж
+З
+И
+І
+Ї
+Й
+К
+Л
+М
+Н
+О
+П
+Р
+С
+Т
+У
+Ф
+Х
+Ц
+Ч
+Ш
+Щ
+Ю
+Я
+Ь
+</level>
+<level value="6">
+а
+б
+в
+г
+ґ
+д
+е
+є
+ж
+з
+и
+і
+ї
+й
+к
+л
+м
+н
+о
+п
+р
+с
+т
+у
+ф
+х
+ц
+ч
+ш
+щ
+ю
+я
+ь
+А
+Б
+В
+Г
+Ґ
+Д
+Е
+Є
+Ж
+З
+И
+І
+Ї
+Й
+К
+Л
+М
+Н
+О
+П
+Р
+С
+Т
+У
+Ф
+Х
+Ц
+Ч
+Ш
+Щ
+Ю
+Я
+Ь
+1
+2
+3
+4
+5
+6
+7
+8
+9
+0
+</level>
+</Wordlist>
+</GCompris>
\ No newline at end of file
diff --git a/src/gletters-activity/resources/gletters/default-vi.xml
b/src/gletters-activity/resources/gletters/default-vi.xml
new file mode 100644
index 0000000..31d04af
--- /dev/null
+++ b/src/gletters-activity/resources/gletters/default-vi.xml
@@ -0,0 +1,279 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<GCompris>
+<Wordlist name="default-vi" description="Default Vietnamese" locale="vi">
+<level value="1">
+a
+ă
+â
+b
+c
+d
+đ
+e
+ê
+g
+h
+i
+k
+l
+m
+n
+o
+ô
+ơ
+p
+q
+r
+s
+t
+u
+ư
+v
+x
+y
+</level>
+<level value="2">
+a
+ă
+â
+b
+c
+d
+đ
+e
+ê
+g
+h
+i
+k
+l
+m
+n
+o
+ô
+ơ
+p
+q
+r
+s
+t
+u
+ư
+v
+x
+y
+1
+2
+3
+4
+5
+6
+7
+8
+9
+0
+</level>
+<level value="3">
+A
+Ă
+Â
+B
+C
+D
+Đ
+E
+Ê
+G
+H
+I
+K
+L
+M
+N
+O
+Ô
+Ơ
+P
+Q
+R
+S
+T
+U
+Ư
+V
+X
+Y
+</level>
+<level value="4">
+A
+Ă
+Â
+B
+C
+D
+Đ
+E
+Ê
+G
+H
+I
+K
+L
+M
+N
+O
+Ô
+Ơ
+P
+Q
+R
+S
+T
+U
+Ư
+V
+X
+Y
+1
+2
+3
+4
+5
+6
+7
+8
+9
+0
+</level>
+<level value="5">
+a
+ă
+â
+b
+c
+d
+đ
+e
+ê
+g
+h
+i
+k
+l
+m
+n
+o
+ô
+ơ
+p
+q
+r
+s
+t
+u
+ư
+v
+x
+y
+A
+Ă
+Â
+B
+C
+D
+Đ
+E
+Ê
+G
+H
+I
+K
+L
+M
+N
+O
+Ô
+Ơ
+P
+Q
+R
+S
+T
+U
+Ư
+V
+X
+Y
+</level>
+<level value="6">
+a
+ă
+â
+b
+c
+d
+đ
+e
+ê
+g
+h
+i
+k
+l
+m
+n
+o
+ô
+ơ
+p
+q
+r
+s
+t
+u
+ư
+v
+x
+y
+A
+Ă
+Â
+B
+C
+D
+Đ
+E
+Ê
+G
+H
+I
+K
+L
+M
+N
+O
+Ô
+Ơ
+P
+Q
+R
+S
+T
+U
+Ư
+V
+X
+Y
+1
+2
+3
+4
+5
+6
+7
+8
+9
+0
+</level>
+</Wordlist>
+</GCompris>
\ No newline at end of file
diff --git a/src/gletters-activity/resources/gletters/upper-en.xml
b/src/gletters-activity/resources/gletters/upper-en.xml
new file mode 100644
index 0000000..69600a8
--- /dev/null
+++ b/src/gletters-activity/resources/gletters/upper-en.xml
@@ -0,0 +1,151 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<GCompris>
+<Wordlist name="default-en" description="English" locale="en">
+<level value="1">
+a
+e
+i
+o
+u
+y
+</level>
+<level value="2">
+a
+e
+i
+o
+u
+y
+0
+1
+2
+3
+4
+5
+6
+7
+8
+9
+</level>
+<level value="3">
+b
+c
+d
+f
+g
+h
+j
+k
+l
+m
+n
+p
+q
+r
+s
+t
+v
+w
+x
+z
+</level>
+<level value="4">
+b
+c
+d
+f
+g
+h
+j
+k
+l
+m
+n
+p
+q
+r
+s
+t
+v
+w
+x
+z
+0
+1
+2
+3
+4
+5
+6
+7
+8
+9
+</level>
+<level value="5">
+b
+c
+d
+f
+g
+h
+j
+k
+l
+m
+n
+p
+q
+r
+s
+t
+v
+w
+x
+z
+a
+e
+i
+o
+u
+y
+</level>
+<level value="6">
+b
+c
+d
+f
+g
+h
+j
+k
+l
+m
+n
+p
+q
+r
+s
+t
+v
+w
+x
+z
+a
+e
+i
+o
+u
+y
+0
+1
+2
+3
+4
+5
+6
+7
+8
+9
+</level>
+</Wordlist>
+</GCompris>
diff --git a/src/gletters-activity/resources/gletters/upper-gd.xml
b/src/gletters-activity/resources/gletters/upper-gd.xml
new file mode 100644
index 0000000..836fc48
--- /dev/null
+++ b/src/gletters-activity/resources/gletters/upper-gd.xml
@@ -0,0 +1,167 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<GCompris>
+<Wordlist name="default-gd" description="Gàidhlig" locale="gd">
+<level value="1">
+a
+e
+i
+o
+u
+</level>
+<level value="2">
+a
+e
+i
+o
+u
+0
+1
+2
+3
+4
+5
+6
+7
+8
+9
+</level>
+<level value="3">
+b
+c
+d
+f
+g
+h
+l
+m
+n
+p
+r
+s
+t
+</level>
+<level value="4">
+b
+c
+d
+f
+g
+h
+l
+m
+n
+p
+r
+s
+t
+0
+1
+2
+3
+4
+5
+6
+7
+8
+9
+</level>
+<level value="5">
+b
+c
+d
+f
+g
+h
+l
+m
+n
+p
+r
+s
+t
+a
+e
+i
+o
+u
+</level>
+<level value="6">
+à
+è
+ì
+ò
+ù
+</level>
+<level value="7">
+bh
+ch
+dh
+fh
+gh
+mh
+ph
+sh
+th
+</level>
+<level value="8">
+à
+è
+ì
+ò
+ù
+bh
+ch
+dh
+fh
+gh
+mh
+ph
+sh
+th
+</level>
+<level value="9">
+b
+c
+d
+f
+g
+h
+l
+m
+n
+p
+r
+s
+t
+a
+e
+i
+o
+u
+à
+è
+ì
+ò
+ù
+bh
+ch
+dh
+fh
+gh
+mh
+ph
+sh
+th
+0
+1
+2
+3
+4
+5
+6
+7
+8
+9
+</level>
+</Wordlist>
+</GCompris>
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]