Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > VB6 > перевод интерфейса


Автор: alexandr10 14.4.2006, 15:31
Захотел вставить в свою программу на VB6 перевод интерфейса (чтобы в зависимости от локализации винды надписи были на русском, английском, украинском языках). Создал res-файл, забил в него текст. Вставил в программу вместо простых строк текста обращения к этому файлу с помощью функции loadressting.
Получившаяся в результате данных действий программа при запуске кода встроенным интерпретатором VB работает как надо - правильно выбирает текст при разных локальных настройках, но, к сожалению, откомпилированный exe-шник выдаёт текст только на русском языке (нет ни украинского ни английского).
Подскажите пожалуйста, в чем тут дело и как исправить данную ситуацию.

Автор: Akina 14.4.2006, 16:06
Цитата(alexandr10 @ 14.4.2006, 16:31 Найти цитируемый пост)
в чем тут дело

Не видя кода, сказать невозможно... а телепаты у нас в отпуске.

Цитата(alexandr10 @ 14.4.2006, 16:31 Найти цитируемый пост)
как исправить

Найти источник проблемы. Начать например с расстановки контрольных точек и отслеживания выполнения участков кода и значений переменных (сброс в текстовый лог и его анализ).

Автор: alexandr10 17.4.2006, 10:06
Спасибо за ответ.
Ничего такого секретного в коде, конечно же, нет. Вот процедура с которой происходит загрузка программы и сама процедура загрузки ресурсов.

Код


Private Sub Form_Load()
    Randomize
    NovStr = Chr(10) + Chr(13)
    NomSposobTasDom = 2
    SchVsexOtkrParDom = 0
    SchVuigrPartij = 0
    SchPartij = 0
    NumVidDom = 1
    Call MasSootv
    Call LoadResDom
    Call StartinGame
End Sub

Private Sub LoadResDom()

    For i = 0 To 6
        NumResDom = (NumVidDom * 10) + i
        DomForm1.DomIm(i).Picture = LoadResPicture(NumResDom, vbResBitmap)
    Next i
    
    DomForm1.CommandDom(1).Caption = LoadResString(101)
    DomForm1.CommandDom(3).Caption = LoadResString(102)
    DomForm1.LabelDom1.Caption = LoadResString(103)
    DomForm1.CommandDom(1).ToolTipText = LoadResString(104)
    DomForm1.CommandDom(2).ToolTipText = LoadResString(105)
    DomForm1.CommandDom(3).ToolTipText = LoadResString(106)
    DomForm1.LabelDom1.ToolTipText = LoadResString(107)
    DomForm1.LabelDom1.ToolTipText = LoadResString(107)
End Sub



Программу целиком, думаю приводить здесь не стоит, однако она открыта и я могу выслать её код целиком любому.
Проблема, всётаки, как мне кажется не в коде программы – еще раз подчёркиваю в итрепретаторе VB6 программа работает как следует – происходит автоматический выбор текстовых переменных, согласно языковым настройкам винды, а вот после компиляции происходит выборка текстовых переменных только на русском языке.
   

Автор: Akina 17.4.2006, 10:28

M
Akina
Пользуйтесь тегом "Код".

Сделайте следующее:

Код

Private Sub LoadResDom()

Dim Temp As Long

Temp = FreeFile
Open "Debug.TXT" For Appent As #FreeFile
Print #FreeFile, "Procedure LoadResDom started at " & cstr(Timer)

    For i = 0 To 6
        NumResDom = (NumVidDom * 10) + i
        DomForm1.DomIm(i).Picture = LoadResPicture(NumResDom, vbResBitmap)
    Next i
    
Print #FreeFile, "DomForm1.CommandDom(1).Caption befole LoadResString = " & chr(34) & DomForm1.CommandDom(1).Caption & chr(34)

    DomForm1.CommandDom(1).Caption = LoadResString(101)

Print #FreeFile, "DomForm1.CommandDom(1).Caption after LoadResString = " & chr(34) & DomForm1.CommandDom(1).Caption & chr(34)

    DomForm1.CommandDom(3).Caption = LoadResString(102)
    DomForm1.LabelDom1.Caption = LoadResString(103)
    DomForm1.CommandDom(1).ToolTipText = LoadResString(104)
    DomForm1.CommandDom(2).ToolTipText = LoadResString(105)
    DomForm1.CommandDom(3).ToolTipText = LoadResString(106)
    DomForm1.LabelDom1.ToolTipText = LoadResString(107)
    DomForm1.LabelDom1.ToolTipText = LoadResString(107)

Print #FreeFile, "Procedure LoadResDom completed at " & cstr(Timer)
Close #FreeFile

End Sub

и посмотрите выполняется ли вообще процедура (появляется ли файл), выполняется ли переприсвоение свойства... если да, попробуйте в конец Form_Load добавить что-нить типа Form_Repaint... 

Автор: alexandr10 18.4.2006, 10:05
Спасибо за совет.
Сам я обычно пользуюсь для «дебагигнга» выводом MsgBox с необходимой переменной в нужном месте, однако такой способ мне кажется более культурным, хоть текст кода процедуры пришлось немного исправить, чтобы она нормально записывала протокол в файл:

Код


Private Sub LoadResDom()

Dim Temp As Long

Temp = FreeFile
Open "Debug.TXT" For Append As #Temp
Print #Temp, "Procedure LoadResDom started at " & CStr(Timer)

For i = 0 To 6
NumResDom = (NumVidDom * 10) + i
DomForm1.DomIm(i).Picture = LoadResPicture(NumResDom, vbResBitmap)
Next i

Print #Temp, "DomForm1.CommandDom(1).Caption befole LoadResString = " & Chr(34) & DomForm1.CommandDom(1).Caption & Chr(34)

DomForm1.CommandDom(1).Caption = LoadResString(101)

Print #Temp, "DomForm1.CommandDom(1).Caption after LoadResString = " & Chr(34) & DomForm1.CommandDom(1).Caption & Chr(34)

DomForm1.CommandDom(3).Caption = LoadResString(102)
DomForm1.LabelDom1.Caption = LoadResString(103)
DomForm1.CommandDom(1).ToolTipText = LoadResString(104)
DomForm1.CommandDom(2).ToolTipText = LoadResString(105)
DomForm1.CommandDom(3).ToolTipText = LoadResString(106)
DomForm1.LabelDom1.ToolTipText = LoadResString(107)

Print #Temp, "Procedure LoadResDom completed at " & CStr(Timer)
Close #Temp

End Sub



Однако результат не сильно утешает, откомпилированная программа (в отличии от запускаемой из VB6) отказывается использовать текстовые переменные иных языков, кроме русского. Вот текст файла Debug.TXT 1-я часть соответствует запуску из VB6 , а 2-я откомпилированной программы (оба запуска происходили с украинскими локальными настройками):
Код


Procedure LoadResDom started at 81699,08
DomForm1.CommandDom(1).Caption befole LoadResString = ""
DomForm1.CommandDom(1).Caption after LoadResString = "Нова гра"
Procedure LoadResDom completed at 81699,14

Procedure LoadResDom started at 81754,61
DomForm1.CommandDom(1).Caption befole LoadResString = ""
DomForm1.CommandDom(1).Caption after LoadResString = "Новая игра"
Procedure LoadResDom completed at 81754,83



Не помогло также присвоение свойству автоперерисовки формы значения “истина“.
Буду ещё ждать Ваших предложений по поводу утранения этого бага.





 

Автор: boevik 18.4.2006, 10:35
Предлагаю отказаться от автоматического выбора языка по локальным настройкам.
1) Когда то такую же проблему не решил
2) Отказ от зависимости локальных настроек, позволяет менять язык по усмотрению пользователя.

А для этого создается переменная BasisLanguage которй присваивается значение с шагом, к примеру,  1000
и тогда BasеLanguage = 0 соотвествует английскому, BasеLanguage = 1000 - русский, BasеLanguage = 2000 - украинский и т.д.

Соотвественно в res файле надо создать записи соотвественно коду и языку
К примеру:
Код

1  new game
1001 Новая игра
2001 Нова гра

В коде 
Код

DomForm1.CommandDom(3).Caption = LoadResString(102+BasеLanguage)
DomForm1.LabelDom1.Caption = LoadResString(103+BasеLanguage)
DomForm1.CommandDom(1).ToolTipText = LoadResString(104+BasеLanguage)
DomForm1.CommandDom(2).ToolTipText = LoadResString(105+BasеLanguage)
DomForm1.CommandDom(3).ToolTipText = LoadResString(106+BasеLanguage)
DomForm1.LabelDom1.ToolTipText = LoadResString(107+BasеLanguage)

 

Автор: alexandr10 18.4.2006, 14:22
Спасибо.
Однако у меня нет пока желания доверять пользователю выбор языка интерфейса – ведь неизвестно на каком языке делать этот «выбор».

Один мой товарищ (программист-философ), узнав о моей проблеме, посоветовал выяснить то, каким образом интерпретатор VB6 узнаёт локальные настройки компьютера (по всей видимости, он получает их из реестра через какую-то WinAPI-функцию) и как он ими распоряжается?
Буду готов с благодарностью узнать ваше мнения на этот счёт.
 

Автор: Akina 18.4.2006, 14:41
Цитата(alexandr10 @  18.4.2006,  15:22 Найти цитируемый пост)
неизвестно на каком языке делать этот «выбор».

Однозначно на английском. 

Автор: boevik 18.4.2006, 15:52
Цитата(alexandr10 @  18.4.2006,  14:22 Найти цитируемый пост)
Однако у меня нет пока желания доверять пользователю выбор языка интерфейса 

Простите, а кому как не пользователю решать на каком языке работать.
Выбор языка так же как и остальные элементы UI надо переводить на язык интерфейса. 

Автор: cardinal 18.4.2006, 22:37
Цитата(alexandr10 @  18.4.2006,  12:22 Найти цитируемый пост)
посоветовал выяснить то, каким образом интерпретатор VB6 узнаёт локальные настройки компьютера (по всей видимости, он получает их из реестра через какую-то WinAPI-функцию) и как он ими распоряжается?

Посмотри вот тут
http://www.activevb.de/tipps/vb6tipps/tipp0277.html
Если надо что-то перевести - спрашивай... 

Автор: alexandr10 19.4.2006, 13:26
Большое спасибо, cardinal.
Как мне кажется, предложенный Вами метод соответствует моему вопросу в наибольшей степени. Из предложенного Вами кода я собираюсь использовать значение соответствующее "Sprach ID" (если я всё правильно понял – оно даёт ID языка по умолчанию из локальных настроек винды, если нет, то, пожалуйста, поправьте меня).

Однако, данный пример соответствует только считыванию локальных данных винды.

У меня еще осталась вторая часть вопроса – как производить выборку строчных переменных из res-файла, если они принадлежат разным языкам, но имеют одинаковый номер? Способ, предложенный boevik мне понятен (да и был известен ранее).
 

Автор: cardinal 19.4.2006, 14:47
Цитата(alexandr10 @  19.4.2006,  11:26 Найти цитируемый пост)
если я всё правильно понял – оно даёт ID языка по умолчанию из локальных настроек винды, если нет, то, пожалуйста, поправьте меня

Я особо не всматривался, но похоже на то... 

Автор: alexandr10 25.4.2006, 08:51
Спасибо всем тем, кто откликнулся на мой вопрос. Отдельное спасибо, cardinal, благодаря которому удалось обойти баг в VB6 (к сожалению лишь обойти, но не устранить его).

Результат работы откомпилирован и лежит по адресу: http://alex-dr-10.narod.ru/DominoX.2.02.zip  

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)