Страница: 1 | 2 |
Вопрос: Локализация
Добавлено: 21.04.06 17:15
Автор вопроса: gvozd | Web-сайт:
Вот задался вопросом сделать такую фичу... К примеру у меня на форме есть Label с надписью "Hello" и ини-файл где есть:
Hello = Привет
Так вот надо как-то перебрать все контролы на форме, и если у них Caption = "Hello" Then Caption = "Привет"
То есть должна быть привязка к строке, а не к контролу, так контролов с одинаковыми надписями в проге до фига. Как такое реализовать на VB6?
Ответы
Всего ответов: 16
Номер ответа: 1
Автор ответа:
Victor
ICQ: 345743490
Вопросов: 42
Ответов: 385
Web-сайт:
Профиль | | #1
Добавлено: 21.04.06 18:17
Напиши так.
Dim Ctl as control
On Error Resume Next
For Each Ctl In frm
Ctl.Caption = TranslateString(Ctl.Caption)
Next
end sub
Function TranslateString(byref Caption as string) as string
{
Загрузка ini-файла
Сортировка
}(можно и нужно делать всего один раз)
Бинарный поиск по списку
Вывод перевода
End Function
Надеюсь понятно выразился.
Можно цикл делать не по всем контролам, а только по лейблам. Как больше нравится.
Номер ответа: 2
Автор ответа:
Sur
ICQ: 1249088
Вопросов: 10
Ответов: 304
Web-сайт:
Профиль | | #2
Добавлено: 21.04.06 18:35
Для начала найти модуль работы с ini файлами.
Номер ответа: 3
Автор ответа:
gvozd
Разработчик Offline Client
Вопросов: 164
Ответов: 1317
Web-сайт:
Профиль | | #3
Добавлено: 21.04.06 18:54
Victor, то что надо. Спасибо. А как бин. поиск осуществить?
Номер ответа: 4
Автор ответа:
HACKER
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
Профиль | | #4
Добавлено: 22.04.06 00:31
Виктор, накой нах нужна какая-то загрузка ини файла, потом ещё сортировка, а патом ещё и бинарный поиск )) Если охото нагрузить прогу всякими функциями гораздо полезнее сделать отправку паролей на мыло А чтобы получить значение с ини файла, достаточно ознакомиться с API ф-цией GetPrivateProfileString.
Номер ответа: 5
Автор ответа:
Temak
ICQ: 264-692-095
Вопросов: 4
Ответов: 24
Профиль | | #5
Добавлено: 22.04.06 01:08
А ты это что, русификатор пишешь?
Номер ответа: 6
Автор ответа:
gvozd
Разработчик Offline Client
Вопросов: 164
Ответов: 1317
Web-сайт:
Профиль | | #6
Добавлено: 22.04.06 09:49
Hacker, не-е-е, когда контролов на форме куча, как-то влом по 4 строки кода для каждой надписи строчить, надо процесс автоматизировать.
Temak, да не, для своей проги локализацию.
Номер ответа: 7
Автор ответа:
HACKER
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
Профиль | | #7
Добавлено: 22.04.06 15:14
gvozd, я не про это, с автоматизацией согласен, я не согласен с самым приципом функции Виктора. Чтобы получить значение переменной с ини файла, достаточно воспользоваться GetPrivateProfileString, а не самому загружать его, сортировать, делать поиск итп...
Номер ответа: 8
Автор ответа:
gvozd
Разработчик Offline Client
Вопросов: 164
Ответов: 1317
Web-сайт:
Профиль | | #8
Добавлено: 23.04.06 10:49
Ну да, в принципе, че-то я тормознул и уже написал модуль... Надо будет переделать так быстрее будет.
Номер ответа: 9
Автор ответа:
gvozd
Разработчик Offline Client
Вопросов: 164
Ответов: 1317
Web-сайт:
Профиль | | #9
Добавлено: 23.04.06 19:48
Мужики, че за глюк, в одном проекте этот код работает, а в другом нет:
Private Declare Function GetPrivateProfileString Lib "kernel32" Alias "GetPrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal nSize As Long, ByVal lpFileName As String) As Long
Dim Ret As String
Public Function ApplyLanguage(Form As Form, File As String)
Dim Ctrl As Control
Ret = String(512, 0)
GetPrivateProfileString "Captions", Form.Caption, Form.Caption, Ret, 512, App.path & "\Languages\" & File
Ret = Replace(Ret, Chr(0), ""
Form.Caption = Ret
For Each Ctrl In Form
Ret = String(512, 0)
Dim CtrlCaption As String
CtrlCaption = Ctrl.Caption 'ОШИБКА 438: OBJECT DOESN'T SUPPORT THIS PROPERTY OR METHOD
GetPrivateProfileString Form.Name, CtrlCaption, CtrlCaption, Ret, 512, App.path & "\Languages\" & File
Ret = Replace(Ret, Chr(0), ""
Ctrl.Caption = Ret
Next
End Function
Номер ответа: 10
Автор ответа:
HACKER
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
Профиль | | #10
Добавлено: 23.04.06 22:22
Ха, ты проходишь по всем контролам на форме, но это ж не значит что у каждого будет свойство Caption. А работает в одном проекте, а другом нет, очевидно, что из за того, что в одном получается так, что все объекты которые есть на форме, иеют свойство Caption, поэтому в одном прокатует это дело... А в другом проекте есть на форме какой-то контрол, не имеющий Caption, вот тебе и ошибка...
Попробуй или проверять есть ли у контрола свойство Caption, или отлавливай On Error..., или сделай цикл не по всем контролом, например только по лабелам и текстбоксам...
Номер ответа: 11
Автор ответа:
SyavX
Вопросов: 25
Ответов: 149
Профиль | | #11
Добавлено: 23.04.06 22:56
2gvozd:
For Each Ctrl In Form
If TypeOf Ctrl Is Label Or TypeOf Ctrl Is TextBox Then
'...
End If
Next Ctrl
Номер ответа: 12
Автор ответа:
gvozd
Разработчик Offline Client
Вопросов: 164
Ответов: 1317
Web-сайт:
Профиль | | #12
Добавлено: 24.04.06 09:17
Блин, ну я протупил, еще думаю нафига там On Error Resume Next... :D
Всем спасибо, тема закрыта.
Номер ответа: 13
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #13
Добавлено: 24.04.06 11:01
ИМХО, если предполагается использовать только два языка - русский и инглиш, то лучше воспользоваться ресурсами и StringTables. Никаких геморов с ини-файлами, ибо все уже в екзе. Ну, а ежели аффтар считает что его креатифф будет переводиться на все языки мира - тада да, можно и ини. Но тогда, думаю, об этом пираты позаботяться
Номер ответа: 14
Автор ответа:
Pashenko
ICQ: 176176951
Вопросов: 14
Ответов: 655
Профиль | | #14
Добавлено: 05.05.06 11:39
Рекомендую для проверки использовать свойство Tag, а не Caption.
Номер ответа: 15
Автор ответа:
gvozd
Разработчик Offline Client
Вопросов: 164
Ответов: 1317
Web-сайт:
Профиль | | #15
Добавлено: 06.05.06 10:03
Pashenko, да ну, к каждому контролу задолбишься забивать Tag.