CultureInfo auslesen

  • VB.NET
  • .NET 3.5

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von Lightsource.

    CultureInfo auslesen

    Wenn ich System.Globalization.CultureInfo im Load einer Form auslese, bekomme ich den richtigen Wert ins Label geschrieben.

    Wenn ich innerhalb eines Timer-Ereignis das Gleiche versuche, wird mein Label auf meinem Form nicht aktualisiert.
    ( Ich ändere die Daten währenddessen in der Systemsteuerung unter Region)

    Ich habe schon die Zeit hoch genommen und auch Application.DoEvents probiert, aber es klappt nicht.

    Das ganze versuche ich auf einem Windows 7 Rechner unter VB 2008.

    Warum ist das so, und wie kann ich an die aktuellen Daten kommen?
    Das hat nichts mit dem Timer zu tun. Die Property wird einfach nicht automatisch aktualisiert, wenn Du die Einstellungen in der Systemsteuerung änderst.
    Wie man das jetzt aktualisiert, weiß ich auch nicht, aber in die Richtung musst Du recherchieren.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils

    Lightsource schrieb:

    , was ist der Unterschied zum Timer?

    Garkeiner.

    Lightsource schrieb:

    Warum geht es aber beim Starten des Programms

    Die CultureInfo wird einmal beim Start des Programmes von Windows ausgelesen und dann wird immer dieser eine Wert von der Property zurückgegeben. Um einen aktuellen Wert zu bekommen musst Du dieses Auslesen von Windows erneut auslösen. Wie man das macht gilt es jetzt herauszufinden.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    @petaod So weit ich mich erinnere ist es CurrentCulture. ( Ich habe hier zuhause den Code nicht vor mir)
    Wobei ich nicht weiß, was MS mit "Ruft das CultureInfo-Objekt ab, das die vom aktuellen Thread verwendete Kultur darstellt, oder setzt dieses Objekt." meint,
    also welcher Thread gemeint ist.
    Ich verwendete den "normalen Forms Timer", meinst du da gibt es Unterschiede?

    @Niko Ortner Ich wollte nicht die API-Funktionen, die es anscheinend auch noch gibt, verwenden, wenn NET mir die passenden Daten zur Verfügung stellt.


    Wir haben hier zwei Programme, die zwei unterschiedliche Messgeräte steuern. Das Dumme daran ist, das eine Programm will nur mit englischen Einstellungen arbeiten,
    das andere will deutsche Lokalisation. Jetzt dachte ich mir, ich baue mir einen Launcher oder zumindest einen einfachen Umschalter der regionalen Einstellungen.
    Damit wir nicht immer in die Systemsteuerung eingreifen müssen. Am liebsten wäre mir sogar, dass je nachdem welches Programm den Focus hat die
    Umschaltung stattfindet.

    Lightsource schrieb:

    Ich verwendete den "normalen Forms Timer", meinst du da gibt es Unterschiede?
    Ja. Der Windows.Forms-Timer läuft im Thread der GUI-
    Der System.Threading.Timer in einem eigenen Thread
    Der Systems.Timers.Timer verwendet für die Tick-Events einen ThreadPool.

    Wenn du also einen Forms-Timer verwendest, hast du keine Thread-übergreifenden Vorgänge.

    Wenn du einen Launcher baust, wird doch das eigentliche Programm sowieso erst nach der Umschaltung in einem eigenen Prozess gestartet.
    Wo ist dann das Problem?
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Damit sollte es gehen:

    VB.NET-Quellcode

    1. CultureInfo.ClearCachedData


    msdn.microsoft.com/de-de/libra…cacheddata(v=vs.110).aspx

    Aber Achtung:
    The ClearCachedData method does not refresh the information in the Thread.CurrentCulture property for existing threads. However, future threads will have any new CultureInfo property values.
    Das ist meine Signatur und sie wird wunderbar sein!
    Guten Abend

    Das würde ich auch so in etwa lösen.

    Freundliche Grüsse

    exc-jdbi



    Spoiler anzeigen

    VB.NET-Quellcode

    1. Option Strict On
    2. Option Explicit On
    3. Imports System.Timers
    4. Imports System.Threading
    5. Imports System.Globalization
    6. Imports System.Threading.Thread
    7. Public Class Form1
    8. Private MyThread As Thread
    9. Private CiDe As CultureInfo
    10. Private CiEn As CultureInfo
    11. Private Fin As Boolean = True
    12. Private BMix As Boolean = False
    13. Private Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click
    14. Me.Fin = False
    15. Me.BMix = False
    16. Me.Button1.Enabled = False
    17. Me.Button2.Enabled = False
    18. Me.MyThread = New Thread(New ThreadStart(AddressOf Me.ThreadFunction))
    19. Me.MyThread.Start()
    20. Me.GetTimer()
    21. End Sub
    22. Private Sub Button2_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button2.Click
    23. Me.Fin = False
    24. Me.BMix = True
    25. Me.Button1.Enabled = False
    26. Me.Button2.Enabled = False
    27. Me.MyThread = New Thread(New ThreadStart(AddressOf Me.ThreadFunction))
    28. Me.MyThread.Start()
    29. Me.GetTimer()
    30. End Sub
    31. Private Sub Button3_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button3.Click
    32. Me.Button1.Enabled = True
    33. Me.Button2.Enabled = True
    34. Me.GetTimer(False)
    35. Me.Fin = True
    36. End Sub
    37. Private Sub Timer1_Tick(ByVal sender As Object, ByVal e As EventArgs) Handles Timer1.Tick
    38. If Me.BMix Then
    39. Thread.CurrentThread.CurrentCulture = Me.CiEn
    40. Else : Thread.CurrentThread.CurrentCulture = Me.CiDe
    41. End If
    42. Me.TextBox2.Text &= CultureInfo.CurrentCulture.ToString & " "
    43. Thread.CurrentThread.CurrentCulture = Me.CiDe
    44. End Sub
    45. Private Sub GetStart()
    46. While True
    47. If Me.Fin Then Exit While
    48. Me.WriteTextBox()
    49. Thread.Sleep(1000)
    50. End While
    51. End Sub
    52. Private Sub ThreadFunction()
    53. Thread.CurrentThread.CurrentCulture = Me.CiDe
    54. Me.GetStart()
    55. Me.TextBox1.Invoke(Sub() Me.TextBox1.Text &= (vbCrLf & vbCrLf))
    56. Me.TextBox2.Invoke(Sub() Me.TextBox2.Text &= (vbCrLf & vbCrLf))
    57. End Sub
    58. Private Sub WriteTextBox()
    59. Me.TextBox1.Invoke(Sub() Me.TextBox1.Text &= CultureInfo.CurrentCulture.ToString & " ")
    60. End Sub
    61. Private Sub GetTimer(Optional ByVal _start As Boolean = True)
    62. With Me.Timer1
    63. .Interval = 1000
    64. If _start Then
    65. .Enabled = True : .Start()
    66. Else : .Stop() : .Enabled = False
    67. End If
    68. End With
    69. End Sub
    70. Public Sub New()
    71. MyBase.new()
    72. Me.InitializeComponent()
    73. Me.GetTimer(False)
    74. Me.CiDe = New CultureInfo("de-De", True)
    75. Me.CiEn = New CultureInfo("en-US", True)
    76. End Sub
    77. End Class

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „exc-jdbi“ ()

    @Mono Das sieht schon mal interessant aus, das werde ich morgen mal testen.
    Heute hatte ich zu meiner Verwunderung festgestellt, dass mein Programm, nicht so wie von mir gestern erwähnt, beim ersten Aufruf
    die richtigen Daten einliest, sondern erst beim zweiten Mal. Das mit dem Cache wäre vielleicht eine Lösung.
    Wenn gar nichts geht, könnte ich immer noch die Registry-Daten austauschen. :evil:

    Andererseits, vielleicht gibt es ja schon Programme, die dafür sorgen können, dass andere Programme mit bestimmten
    Spracheinstellungen gestartet werden. Am besten für Programme die dann parallel laufen...
    Kennt vielleicht jemand so etwas?

    @exc-jdbi Sorry, bist gerade hier dazwischen geraten. Dein Programm werde ich mir mal durchlesen.

    Lightsource schrieb:

    was ist der Unterschied zum Timer?
    Was für ein Timer?
    Der Windows-Forms-Timer hat die identische Culture-Info wie die GUI.
    Bei einem Threading.Timer muss das nicht so sein.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    VB-Fragen über PN / Konversation werden ignoriert!