2010-08-24 37 views
9

Tôi có một ứng dụng winforms mà người dùng phải có khả năng thay đổi ngôn ngữ khi chạy.Làm cách nào để thay đổi ngôn ngữ khi chạy mà không gặp khó khăn về bố cục

Để khái quát công tắc và tránh phải tên kiểm soát cứng mã tôi đã cố gắng mở rộng sau:

internal static void SetLanguage(this Form form, CultureInfo lang) 
    { 
     ComponentResourceManager resources = new ComponentResourceManager(form.GetType()); 

     ApplyResourceToControl(resources, form, lang); 
     resources.ApplyResources(form, "$this", lang); 
    } 

    private static void ApplyResourceToControl(ComponentResourceManager resources, Control control, CultureInfo lang) 
    { 
     foreach (Control c in control.Controls) 
     { 
      ApplyResourceToControl(resources, c, lang); 
      resources.ApplyResources(c, c.Name, lang); 
     } 
    } 

này thay đổi tất cả các chuỗi.

Tuy nhiên, tác dụng phụ của việc này là toàn bộ nội dung của cửa sổ được thay đổi kích thước thành kích thước khởi động ban đầu của cửa sổ đó, bất kể kích thước hiện tại là bao nhiêu.

Làm cách nào để ngăn bố cục thay đổi hoặc bắt đầu tính toán bố cục mới?

+0

Tôi ước tôi có thể bỏ phiếu cho bạn nhiều hơn sau đó một lần rất hữu ích! – Bosak

Trả lời

5

Xem tệp .resx để xem tất cả những gì được sắp xếp lại. Các thuộc tính như Size và Form.AutoScaleDimensions là các thuộc tính có thể bản địa hóa. Tái chỉ định chúng có loại hiệu ứng bạn đang thấy. Đặc biệt là hoàn tác việc tự động mở rộng quy mô sẽ khá khó chịu.

Không có lời khuyên cụ thể nào để khắc phục sự cố này, điều này không được thực hiện để chạy ở bất kỳ nơi nào khác ngoài trình tạo biểu mẫu. Tái tạo lại biểu mẫu. Chỉ ra rằng người dùng thực tế của biểu mẫu của bạn không bao giờ cảm thấy cần phải thay đổi ngôn ngữ mẹ đẻ của mình khi đang di chuyển không bao giờ có vẻ gây ấn tượng.

5

Đây là mã hoàn chỉnh mà tôi đang sử dụng ngay bây giờ.

Thay đổi là chỉ thay đổi thuộc tính Văn bản theo cách thủ công. Nếu tôi nhận bản địa hóa các thuộc tính khác, mã sẽ phải được mở rộng sau đó.

/// <summary> 
    /// Change language at runtime in the specified form 
    /// </summary> 
    internal static void SetLanguage(this Form form, CultureInfo lang) 
    { 
     //Set the language in the application 
     System.Threading.Thread.CurrentThread.CurrentUICulture = lang; 

     ComponentResourceManager resources = new ComponentResourceManager(form.GetType()); 

     ApplyResourceToControl(resources, form.MainMenuStrip, lang); 
     ApplyResourceToControl(resources, form, lang); 

     //resources.ApplyResources(form, "$this", lang); 
     form.Text = resources.GetString("$this.Text", lang); 
    } 

    private static void ApplyResourceToControl(ComponentResourceManager resources, Control control, CultureInfo lang) 
    { 
     foreach (Control c in control.Controls) 
     { 
      ApplyResourceToControl(resources, c, lang); 
      //resources.ApplyResources(c, c.Name, lang); 
      string text = resources.GetString(c.Name+".Text", lang); 
      if (text != null) 
       c.Text = text; 
     } 
    } 

    private static void ApplyResourceToControl(ComponentResourceManager resources, MenuStrip menu, CultureInfo lang) 
    { 
     foreach (ToolStripItem m in menu.Items) 
     { 
      //resources.ApplyResources(m, m.Name, lang); 
      string text = resources.GetString(m.Name + ".Text", lang); 
      if (text != null) 
       m.Text = text; 
     } 
    } 
Các vấn đề liên quan