Всем привет! Выдалось свободное время для творчества (:)), решил создать для себя утилу, с помощью которой я смогу: во-первых, хранить сниппеты различных языков программирования и разметки, а во-вторых, на ней отрабатывать эти сниппеты. Итак, проект CodeKeeper запущен. Прежде всего хотел сделать приложение локализуемым (многоязычным), причем расширяемым, то есть, чтобы пользователь при наличии знания языка смог самостоятельно создать локализацию.
Попытка номер раз:
Задаем свойство isLocalizable=true для формы, параметр Language переставляем на English (изменений не видать), перебиваем заголовки кнопок, групп и прочих элементов управления, все вроде бы ничего, затем возвращаем Language на Default. Вернулись русские метки. Переключили на English - английские метки. Все зашибись (вроде бы). Теперь задача сделать runtime локализацию (то есть переключение между языками программы во время ее работы). Добавляем на форму ComboBoxEdit (используется набор DevExpress XtraEditors, но стандартный набор тоже подойдет). Прописываем код:
Private Sub languageSelector() handles ComboBoxEdit1.SelectedIndexChanged
Select Case ComboBoxEdit.SelectedIndex
Case 0 'Выбран английский язык
Threading.Thread.CurrentThread.CurrentCulture=new Globalization.CultureInfo("en-US")
Threading.Thread.CurrentUIThread.CurrentCulture=new Globalization.CultureInfo("en-US")
Case1 'Выбран русский язык
Threading.Thread.CurrentThread.CurrentCulture=new Globalization.CultureInfo("ru-RU")
Threading.Thread.CurrentUIThread.CurrentCulture=new Globalization.CultureInfo("ru-RU")
End Select
End Sub
Запускаем проект. И сколько бы не выбирали язык - результат - ноль...
Попытка номер два - плюнул на встроенные возможности Visual Studio по локализации, и сделал финт ушами. Для начала создал небольшой текстовой файл такого типа:
<имя контрола>=<локализованное название>, затем:
Private Sub languageSelector() handles ComboBoxEdit1.SelectedIndexChanged
Translate(ComboBoxEdit1.Text)
'Сохраняем установки языка (для начала - Проект->Свойства проекта->Параметры, там создаем строковой параметр Lang)
My.Settings.Lang=ComboBoxEdit1.Text
My.Settings.Save
End Sub
'Делаем подпрограмму доступной из других классов инструкцией Public
Public Sub Translate(Language as String)
Dim langFile as String=Application.StartupPath+"\lang\"+Language+".txt"
If System.IO.File.Exists(langFile)
Dim Lines() as String=System.IO.File.ReadAllLines(langFile)
'Формирование локализационного массива
Dim Lang as new HashTable
For f as Integer=0 to Lines.length-1
Dim pair() as string=Lines(f).Split("=")
Lang(pair(0))=pair(1)
Next
'Поиск контрола по имени и присваивание ему значения текста
dim keys as Icollection=Lang.keys
for f as Integer=0 to keys.Count-1
'Параметр True подтверждает поиск по всей иерархии
Dim c() as Control=Me.Controls.Find(keys(0),True)
c(0).Text=Lang(keys(f))
c(0).Update()
Next
Else
MessageBox.Show("Файл языка не найден!","Ошибка")
End If
End Sub
И вуаля! Заработало!
Теперь при вызове дочерних форм делаем следующее:
Private Sub starter() Handles MyBase.Load
Fotm1.Translate(My.Settings.Lang)
End Sub