• 让语言选择即时生效


    让语言选择即时生效

    转载时请注明出处和作者联系方式
    作者联系方式:李先静 <xianjimli at hotmail dot com>


    在用户选择不同语言之后,如何让系统中的应用程序使用新选择的语言显示界面呢?在feature phone中这只是小菜一碟,几乎所有feature phone都支持这个功能。主要原因可能是其以单进程单窗口的方式工作吧。而在linux智能手机里,这个问题我想了很久,至今没有较好的答案。主要困难如下:

    通知其它应用程序当前语言变化了。语言选择是一个独立的应用程序,它修改之后不但要改变自己的语言,而且还要通知其它应用程序做相应的改变。这其实都算不上问题,通过GUI的广播消息或者GConf更新通知机制,很容易做到这一点。

    让语言选择生效。这个问题看似简单,设置LANG环境变量,新进程以LANG中指定的语言显示。直接调用setlocale让当前进程用指定的语言显示。但这些方法都不适用于当前已经打开的窗口。

    有人说让当前打开的窗口重新刷新一下就行了啊。刷新也没有用,按照gettext机制,窗口和控制存放的是本地化之后的字符,即使再刷新还是用以前的语言显示的。唯有重新设置窗口和控件中的字符串,才能以新语言显示。

    重新设置窗口和控件中的字符串!这要求每个窗口都要写这样一个重设函数,工作量会比较大。我想的是通过修改glade的代码产生器,在产生代码时自动产生这样的函数。试了一下,确实可以做到,正准备推广时,又发现新的问题:动态显示的文本会有问题。它显示的内容与当前应用的状态有关,而代码器对此一无所知。这种动态显示的情况在我们的平台中有很多,这让人有点头疼。

    要做到即时生效,应用程序一定要做相应修改才行(配合代码产生器可以减少工作量)。考虑到语言选择并不是一个常用的功能,我们怀疑是否值得花这些代价去实现它。最后决定让用户在下次login时才生效,如果用户要求即时生效,就注销当前会话并重新自动login。

    欢迎到http://www.broncho.cn/forum 进一步交流。

    ~~end~~
  • 相关阅读:
    LeetCode 382. Linked List Random Node
    LeetCode 398. Random Pick Index
    LeetCode 1002. Find Common Characters
    LeetCode 498. Diagonal Traverse
    LeetCode 825. Friends Of Appropriate Ages
    LeetCode 824. Goat Latin
    LeetCode 896. Monotonic Array
    LeetCode 987. Vertical Order Traversal of a Binary Tree
    LeetCode 689. Maximum Sum of 3 Non-Overlapping Subarrays
    LeetCode 636. Exclusive Time of Functions
  • 原文地址:https://www.cnblogs.com/zhangyunlin/p/6167650.html
Copyright © 2020-2023  润新知