Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 | 2 |

 

  Вопрос: Смена языка Добавлено: 06.11.06 19:44  

Автор вопроса:  Graffin
Люди..Снова нужна помощь, подсказка..Так, вот, все что я прошу сделать, это относится к тому, что надо сделать на Vb.Net.И на этот раз, у меня такое задание, как написание простейшего оконного приложения, отображающее Label и Button, с поддержкой двух языков, которые переключаются через главное меню..Я как понимаю, что если выбрал русский язык, то на компонентах пишется на русском языке, если английсский - то на английском..Но, вот не знаю, какое событие, или метод или что-то еще, с помощью которого оно понимало, что язык поменялся...или может еще какие-то способы есть?

Ответить

  Ответы Всего ответов: 28  

Номер ответа: 1
Автор ответа:
 GSerg



Вопросов: 0
Ответов: 1876


 Профиль | | #1 Добавлено: 06.11.06 20:45
Люди.. У меня кнопка на форме... Я её сам нажимаю... Но, вот не знаю, какое событие, или метод или что-то ещё, с помощью которого оно понимало, что кнопка нажата...

Ответить

Номер ответа: 2
Автор ответа:
 Sharp


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #2
Добавлено: 06.11.06 21:41
Ну если тебе нужно именно событие, то делай RaiseEvent когда меняешь язык

Ответить

Номер ответа: 3
Автор ответа:
 -АлександР-



Вопросов: 55
Ответов: 1008
 Web-сайт: sham.clan.su
 Профиль | | #3
Добавлено: 06.11.06 22:01
Ну если тебе нужно именно событие, то делай RaiseEvent когда меняешь язык
перехват событий нажатия shift+alt? Можно, это один способ.
Другой - если ты вводишь в текстовой редактор текст, то можешь проверить диапазон вводимых символов по ASCII.
Но если тебе нужно просто поменять с английского на русский captionы кнопки и метки, то правда - жми кнопку, или в меню сделай "Опции", или что-то типа того, которая вызывает окно настроек, где меняется язык. Вроде везде так и делается, в нормальных программах

Ответить

Номер ответа: 4
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #4 Добавлено: 06.11.06 23:04
если выбрал русский язык, то на компонентах пишется на русском языке, если английсский - то на английском..

Ищи примеры локализации.. В инете их туча

Ответить

Номер ответа: 5
Автор ответа:
 Graffin



Вопросов: 4
Ответов: 7
 Профиль | | #5 Добавлено: 07.11.06 00:16
Спасибо!

Ответить

Номер ответа: 6
Автор ответа:
 Fever



Вопросов: 60
Ответов: 808
 Профиль | | #6 Добавлено: 08.11.06 19:43
можно из VB Application Wizard создать прогу, на одной из вкладок выбрать Yes когда спрашивают про Resource file. Тогда в проекте будет саб LoadResStrings, который надо чуть поменять под свои нужды и юзать. У меня это выглядело так

Attribute VB_Name = "modLanguage"
'//////////////////////////////////////////////////////////////////////////////
' modLanguage - module for loading *.LNG files.
' Version history
' • 1.00 for GC4 20.10.2006
' + StrOption    28.10.2006 SCHOOL AUTUMN HOLIDAYS STARTED!!!
' © Polkovnikov Philip, 2006
'//////////////////////////////////////////////////////////////////////////////
Option Explicit

Public Languages As Collection
Public CurrLang As Language
Public LangPath As String

Public Const LangExt As String = ".lng"
Private Const BS As String = "\"
Private Const LngFldr As String = "Languages\"

Public Function StrOption(ID As String, ParamArray Opts() As Variant) As String
    Const S_OPTION As String = "%"
    Dim i As Long
    Dim txt As Variant

    txt = CurrLang.Strings(ID)
    For i = 0 To UBound(Opts)
        txt = Replace(txt, S_OPTION, Opts(i), 1, 1)
    Next
    StrOption = txt
End Function

Public Function LoadLanguages()
    Dim sPath As String
    Dim NewItem As Language
    Dim TmpArr As Variant
    
    LangPath = App.Path
    If Right(LangPath, 1) <> BS Then LangPath = LangPath & BS
    LangPath = LangPath & LngFldr
    
    Set Languages = New Collection
    
    sPath = Dir(LangPath & "*.lng", vbNormal)
    If sPath <> "." And sPath <> ".." And sPath <> vbNullString Then
        Set NewItem = New Language
        TmpArr = Split(sPath, ".", 2)
        If LCase(TmpArr(1)) <> "lng" Then
            Set NewItem = Nothing
        Else
            NewItem.Key = LCase(TmpArr(0))
            Languages.Add NewItem, NewItem.Key
        End If
    End If
    
    Do Until sPath = vbNullString
        sPath = Dir()
        If sPath <> "." And sPath <> ".." And sPath <> vbNullString Then
            Set NewItem = New Language
            TmpArr = Split(sPath, ".", 2)
            If LCase(TmpArr(1)) <> "lng" Then
                Set NewItem = Nothing
            Else
                NewItem.Key = LCase(TmpArr(0))
                Languages.Add NewItem, NewItem.Key
            End If
        End If
    Loop
    
    If Languages.Count = 0 Then
        RaiseError ERR_NOLNG
    Else
        For Each NewItem In Languages
            If NewItem.Key = LastLang Then
                If LoadLanguageFile(NewItem) = ERR_SUCCESS Then
                    Set CurrLang = NewItem
                    GoTo FinishLang
                Else
                    NewItem.Corrupted = True
                End If
            End If
        Next
        For Each NewItem In Languages
            If LoadLanguageFile(NewItem) = ERR_SUCCESS Then
                Set CurrLang = NewItem
                GoTo FinishLang
            End If
        Next
        
        RaiseError ERR_ALLCORR
    End If
FinishLang:
    
    LoadLanguageStrings
End Function

Public Function LoadLanguageFile(Lng As Language)
    Dim c            As Long
    Dim TmpStr       As String
    Dim TmpArr       As Variant
    Dim SectionFound As Boolean
    Dim Descr        As Long
    
    LoadLanguageFile = ERR_SUCCESS
    
    Set Lng.Strings = Nothing
    Set Lng.Strings = New Collection
    
    ;Descr = FreeFile
    Open LangPath & Lng.Key & LangExt For Input As #Descr
        
        Do Until EOF(Descr)
            Line Input #Descr, TmpStr
            TmpStr = Trim(TmpStr)
            If TmpStr <> vbNullString Then
                TmpStr = Trim(Split(TmpStr, ";", 2)(0))
                If TmpStr <> vbNullString Then
                    If SectionFound Then
                        If Left(TmpStr, 1) = "[" Then Exit Do
                        TmpArr = Split(TmpStr, "=";)
                        TmpArr(0) = RTrim(TmpArr(0))
                        TmpArr(1) = LTrim(TmpArr(1))
                        Lng.Strings.Add mID(TmpArr(1), 2, Len(TmpArr(1)) - 2), TmpArr(0)
                    Else
                        If TmpStr = "[" & CStr(App.Major) & CStr(App.Minor) & "]" Then SectionFound = True
                    End If
                End If
            End If
        Loop
    Close #Descr
Exit Function
corr:
    Set Lng.Strings = Nothing
    Lng.Corrupted = True
    LoadLanguageFile = ERR_SUCCESS + 1
End Function

Public Sub LoadLanguageStrings()
    On Error Resume Next
    Dim Frm As Form
    Dim Ctl As Control
    For Each Frm In Forms
        Frm.Caption = CurrLang.Strings(Frm.Tag)
        For Each Ctl In Frm.Controls
            LoadLangString Ctl
        Next
    Next
End Sub

Private Sub LoadLangString(Ctl As Control)
    On Error Resume Next
    Dim TMP As String
    Dim TMPMas As Variant
    Select Case TypeName(Ctl)
        Case "Menu"
            If Ctl.HelpContextID > 0 Then Ctl.Caption = CurrLang.Strings(CStr(Ctl.HelpContextID))
        Case Else
            TMPMas = Split(Ctl.Tag, " ", 2)
            TMP = vbNullString
            TMP = CurrLang.Strings(TMPMas(0))
            If TMP <> vbNullString Then Ctl.Caption = TMP
            TMP = vbNullString
            TMP = CurrLang.Strings(TMPMas(1))
            If TMP <> vbNullString Then Ctl.ToolTipText = TMP
    End Select
End Sub

Ответить

Номер ответа: 7
Автор ответа:
 Morpheus



Вопросов: 224
Ответов: 3777
 Web-сайт: xury.zx6.ru
 Профиль | | #7
Добавлено: 08.11.06 21:58
GSerg - ass! (ugadayte, eto ya na translite pishu? :D ))

Ответить

Номер ответа: 8
Автор ответа:
 Sacred Phoenix



ICQ: 304238252 

Вопросов: 52
Ответов: 927
 Профиль | | #8 Добавлено: 08.11.06 23:08
перехват событий нажатия shift+alt?
А у меня переключение языков через Ctrl+Shift! И прога твоя обломица :))

2 Fever: кстать лучше юзать xml-файлы. Их легче парсить

ЗЫ. Морфеус жжот :)))

Ответить

Номер ответа: 9
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #9 Добавлено: 08.11.06 23:59
Нее.. НЕТ я точно не на что не поменяю.. ))
Тут для локализации надо сделать пару движений мышкой и вставить 1-2 строчку кода в нужное место..
Thread.CurrentThread.CurrentUICulture = New CultureInfo("fr-FR";)

И для всех контролов поменяются надписи (разумеется если есть перевод в нужном ресурсе)

Ответить

Номер ответа: 10
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #10 Добавлено: 09.11.06 00:13
Именно сразу после изменения локали поменяются или нужно как-то принудительно это вызывать? МОжно как-то отследить изменение локали?

Ответить

Номер ответа: 11
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #11 Добавлено: 09.11.06 02:02
Именно сразу после изменения локали поменяются или нужно как-то принудительно это вызывать?


Фишка в том, что эту строчку необходимо вставлять в конструкторе ДО InitializeComponent()
После этого форма будет брать все надписи из нужной локали.
В run-time такое изменение ни к чему не приведет.. вернее локаль поменяется, но надписи нет. Надо будет пробежаться по коллекции Controls и через ResourceManager выдернуть нужные строки и заново их присвоить контролам.
Что касается перехвата события изменения локали ... не знаю, не доводилось экспериментировать..
Еще один интересный момент в том, что если вообще ничего не писать, то локаль берется из настроек винды..
В 2005 студии появился новый метод My.Application.ChangeUICulture что, впрочем, одно и тоже..

Ответить

Номер ответа: 12
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #12 Добавлено: 09.11.06 03:37
Фишка в том, что эту строчку необходимо вставлять в конструкторе ДО InitializeComponent()

Мастдай :(
Вот если б контролы сами подхватывали свои свойства при изменении локали...

Ответить

Номер ответа: 13
Автор ответа:
 Sharp


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #13
Добавлено: 09.11.06 03:42
Morpheus: на чем бы не написал, выглядит все равно нехорошо :)

Ответить

Номер ответа: 14
Автор ответа:
 Morpheus



Вопросов: 224
Ответов: 3777
 Web-сайт: xury.zx6.ru
 Профиль | | #14
Добавлено: 09.11.06 04:32
2Sharp: Ах да, конечно - ведь слово "ас" же с ошибкой... или без ошибки? А это смотря кого спросить :) Однозначно ответит только Гепард :)

Ответить

Номер ответа: 15
Автор ответа:
 Sacred Phoenix



ICQ: 304238252 

Вопросов: 52
Ответов: 927
 Профиль | | #15 Добавлено: 09.11.06 15:12
И для всех контролов поменяются надписи (разумеется если есть перевод в нужном ресурсе)
Фишка в том, что эту строчку необходимо вставлять в конструкторе ДО InitializeComponent()
EROS, незя так людей пугать! я как первый пост прочитал, обрадовался прям, а ты потом всю радость испортил :(
Вот если б контролы сами подхватывали свои свойства при изменении локали...
Вот-вот...

Ответить

Страница: 1 | 2 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам