Локализация NET CF с ориентацией - PullRequest
0 голосов
/ 24 апреля 2009

Кто-нибудь успешно локализовал мобильное приложение, которое использует элементы управления Orientation Aware для поддержки нескольких разрешений. CultureInfo должен быть установлен во время выполнения, а не считываться из системы. Не уверен, что это поддерживается. Пожалуйста, помогите.

Пламен

1 Ответ

1 голос
/ 25 апреля 2009

Я никогда не использовал упомянутые вами элементы управления, и я не знаю причину, по которой вы должны установить CultureInfo во время выполнения для указанных элементов управления. Поэтому мой ответ основан на вашем вопросе, как установить CultureInfo во время выполнения. Если это не то, что вы хотели, просто игнорируйте мой ответ.

Если бы мы программировали настольное приложение, CultureInfo можно было бы изменить с помощью:

Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("en-US")
'en-US = American English

К сожалению, это невозможно в CF.NET.

На самом деле, насколько мне известно, не существует официального или поддерживаемого способа изменить CultureInfo (и региональные настройки) устройства в CF.NET во время выполнения. Можно, возможно, изменить региональные настройки в реестре, но это будет означать, что устройство необходимо перезагрузить.

В моей кодовой библиотеке, однако, есть фрагмент кода, который я нашел некоторое время назад и который я тестировал только в эмуляторе, где он прекрасно работал. Это считается "взломом" и может быть рискованным , но, тестируя его в эмуляторе, я никогда не сталкивался с какими-либо проблемами. Вот это в VB.Net:

'I declare the following statement

Dim myCIintl As New Globalization.CultureInfo("en-US") 'where en-US is for Ame-English

'Then I call the following sub

SetDefaultLocale(myCIintl)

'Here is the code of the sub

Public Shared Sub SetDefaultLocale(ByVal locale As System.Globalization.CultureInfo)
        If Nothing Is locale Then
            Throw New ArgumentNullException("locale")
        End If

        Dim fi As System.Reflection.FieldInfo = GetType(System.Globalization.CultureInfo).GetField _
        ("m_userDefaultCulture", System.Reflection.BindingFlags.NonPublic Or System.Reflection.BindingFlags.Static)
        If Nothing Is fi Then
            Throw New NotSupportedException("Setting locale is not supported in this version of the framework.")
        End If
        fi.SetValue(Nothing, locale)
End Sub

Примечание: обратите внимание на тот факт, что если приватная переменная m_userDefaultCulture изменит свое имя в будущей версии, то приведенный выше код может сломаться. Также имя переменной может иметь другое имя в локализованной версии Windows Mobile - возможно, в испанской версии это называется другим. Я не знаю, поэтому я думаю, что вы должны попробовать это сами.

Помимо вышеупомянутого примечания, вышеуказанный код должен работать (скрестив пальцы), если на устройстве присутствуют региональные настройки, которые вы хотите использовать. Чтобы увидеть, какие региональные настройки поддерживаются устройством, вы можете использовать отличный код, который Ctacke показал здесь .

Удачи!

...