rime / weasel

【小狼毫】Rime for Windows
https://rime.im
GNU General Public License v3.0
4.65k stars 556 forks source link

WeaselSetup /u 会触发安装 Chinese (Traditional, Taiwan) #1230

Closed CharlesMengCA closed 6 months ago

CharlesMengCA commented 6 months ago

上报前请检查

操作系统信息

描述遇到的问题 操作系统为Windows10 英文版。 WeaselSetup.exe /s 会触发安装 Chinese (Traditional, Taiwan), 尽管我的选项是简体中文。

下面代码中,只要不是简中的lcid(2052, 3072, 4100), 就都默认是繁体中文。我觉得应该检查参数 是 /s 还是 /t 而不是使用GetUserDefaultLCID()

LCID lcid = GetUserDefaultLCID();
  if (lcid == 2052 || lcid == 3072 || lcid == 4100) {
    LANGID langId = SetThreadUILanguage(
        MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED));
    SetThreadLocale(langId);
  } else {
    LANGID langId = SetThreadUILanguage(
        MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_TRADITIONAL));
    SetThreadLocale(langId);
  }

复现步骤 重现问题的步骤,如:

  1. 在英文操作系统上删除 Preferred language: Chinese (Traditional, Taiwan)
  2. 执行 WeaselSetup.exe /s
  3. 检查 Preferred language
  4. 发现Chinese (Traditional, Taiwan)并优先于Chinese (Simplified, China)

预期行为 WeaselSetup.exe /s 应该安装Chinese (Simplified, China) 而不是 Chinese (Traditional, Taiwan)

截图 image

其他补充说明 发现3处使用GetUserDefaultLCID(), 不是那几个指定的语言标识,肯定会出错。

fxliang commented 6 months ago

这个是原来用来自动根据当前系统设置切换显示简繁界面的,可能有洞。如果有更好的方案,pr wellcome

CharlesMengCA commented 6 months ago

问题出在WeaselSetup /u,

如果Preferred languages 只有 English(US) 和Chinese(Simplified, China)

WeaselSetup /u,会删除Chinese(Simplified, China),然后安装(或是恢复) Chinese(Traditional, Taiwan)。

再执行WeaselSetup /s 就会出现我上面的截图的情况。

CharlesMengCA commented 6 months ago

问题出在这里,不知道什么原因, 删除不存在的语言反而变成了安装: (*pfnInstallLayoutOrTip)(PSZTITLE_HANT, ILOT_UNINSTALL);

HMODULE hInputDLL = LoadLibrary(TEXT("input.dll"));
if (hInputDLL) {
  PTF_INSTALLLAYOUTORTIP pfnInstallLayoutOrTip;
  pfnInstallLayoutOrTip =
      (PTF_INSTALLLAYOUTORTIP)GetProcAddress(hInputDLL, "InstallLayoutOrTip");
  if (pfnInstallLayoutOrTip) {
    (*pfnInstallLayoutOrTip)(PSZTITLE_HANS, ILOT_UNINSTALL);
    (*pfnInstallLayoutOrTip)(PSZTITLE_HANT, ILOT_UNINSTALL);
  }
  FreeLibrary(hInputDLL);
}
CharlesMengCA commented 6 months ago

还有一个问题就是如果用户还有其它输入法,删除小狼毫会不会把其它输入法搞死? 这两行代码好象有些武断

(*pfnInstallLayoutOrTip)(PSZTITLE_HANS, ILOT_UNINSTALL);
(*pfnInstallLayoutOrTip)(PSZTITLE_HANT, ILOT_UNINSTALL);
fxliang commented 6 months ago

还有一个问题就是如果用户还有其它输入法,删除小狼毫会不会把其它输入法搞死? 这两行代码好象有些武断

(*pfnInstallLayoutOrTip)(PSZTITLE_HANS, ILOT_UNINSTALL);
(*pfnInstallLayoutOrTip)(PSZTITLE_HANT, ILOT_UNINSTALL);

看看PSZTITLE_HANS,及边上的注释,有要求的。

只是删除这个确实应该检查一下有无

CharlesMengCA commented 6 months ago

ILOT_UNINSTALL 变成了安装, 成功的踩到了Windows的Bug?