Translation class for c#

This post is a part of: http://mestaa.blogspot.com/2011/09/multilanguage-applications-with.html

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.OleDb;
using System.Globalization;
using System.Collections;
using System.Resources;
using System.Data;
using ChangeLanguage.Properties;

namespace ChangeLanguage.ViewModel
{
    /*
     * Helper class
     */ 
    class Translations
    {
        private static Settings settings = Settings.Default;

        //connection string
        private static DatabaseResourceManager databaseResourceManager = new DatabaseResourceManager(settings.translationsConnectionString);        

        public static string GetString(string identifier)
        {
            return databaseResourceManager.GetString(identifier, settings.currentCulture);
        }

        public static List GetCultureList()
        {
            return databaseResourceManager.CultureList;
        }
    }

    public class DatabaseResourceManager : ResourceManager
    {
        private string dsn;
        private Hashtable resources;

        public List CultureList { get; private set; }

        public DatabaseResourceManager(string dsn)
        {
            this.dsn = dsn;
            this.resources = new Hashtable();
            this.CultureList = GetLanguageList();
        }

        protected List GetLanguageList()
        {
            List cultureList = new List();

            DataTable dt = new DataTable();
            OleDbConnection conn = new OleDbConnection();
            conn.ConnectionString = dsn;
            conn.Open();
            OleDbCommand command = new OleDbCommand("Select * From Translations"); // Here there is the reference to table name
            command.Connection = conn;
            OleDbDataAdapter da = new OleDbDataAdapter(command);
            da.Fill(dt);
            conn.Close();

            for (int i = 0; i < dt.Columns.Count; i++)
            {
                try
                {
                    if (dt.Columns[i].ColumnName != "Key")
                        cultureList.Add(new CultureInfo(dt.Columns[i].ColumnName));
                }
                catch (Exception exc)
                {
                    throw new CultureNotFoundException("Wrong culture code detected: " + dt.Columns[i].ColumnName.ToString() + "\n" + exc.Message);
                }
            }
            return cultureList;
        }

        protected override ResourceSet InternalGetResourceSet(CultureInfo culture, bool createIfNotExists, bool tryParents)
        {
            DatabaseResourceSet rs = null;

            if (this.resources.Contains(culture.Name))
            {
                rs = this.resources[culture.Name] as DatabaseResourceSet;
            }
            else
            {
                rs = new DatabaseResourceSet(dsn, culture);
                this.resources.Add(culture.Name, rs);
            }
            return rs;
        }
    }

    public class DatabaseResourceReader : IResourceReader
    {
        private string dsn;
        private string language;

        public DatabaseResourceReader
           (string dsn, CultureInfo culture)
        {
            this.dsn = dsn;
            this.language = culture.Name;
        }

        public IDictionaryEnumerator GetEnumerator()
        {
            Hashtable dict = new Hashtable();

            OleDbConnection conn = new OleDbConnection();
            conn.ConnectionString = dsn;
            OleDbCommand command = conn.CreateCommand();
            if (language == "")
                language = "Default";

            command.CommandText = "SELECT [key], [" + language + "] " + "FROM Translations"; // Here there is the reference to table name

            try
            {
                conn.Open();

                OleDbDataReader reader = command.ExecuteReader();
                while (reader.Read())
                {
                    if (reader.GetValue(1) != System.DBNull.Value)
                        dict.Add(reader.GetString(0), reader.GetString(1));
                }

                reader.Close();
            }
            catch   // ignore missing columns in the database
            {
            }
            finally
            {
                conn.Close();
            }
            return dict.GetEnumerator();
        }

        public void Close()
        {
        }

        IEnumerator IEnumerable.GetEnumerator()
        {
            return this.GetEnumerator();
        }

        void IDisposable.Dispose()
        {
        }
    }

    public class DatabaseResourceSet : ResourceSet
    {
        internal DatabaseResourceSet(string dsn, CultureInfo culture)
            : base (new DatabaseResourceReader(dsn, culture))
        {
        }

        public override Type GetDefaultReader()
        {
            return typeof(DatabaseResourceReader);
        } 
    }
}

if you see /cultureinfo at the end of the file, just remove it.

No comments: