LoadString 仅在我没有英文字符串表时才有效

2023-11-27

我希望能够以编程方式修改应用程序的语言,或者至少使用“控制面板”->“区域和语言选项”->“格式”中指定的语言。

如果我添加一个英语字符串表,为其制作一个法语和德语副本,然后删除英语字符串表,我可以以编程方式在加载法语和德语字符串之间切换。 如果我保留英文副本,那么当我尝试加载德语或法语字符串时,无论如何都会加载英语字符串。

我认为这是一个资源加载器错误,如果资源加载器找到与 Windows ui 语言相同的语言的字符串表(例如 Windows 资源管理器菜单的语言),则资源加载器会忽略 SetThreadLocale。

我尝试将控制面板 -> 区域和语言选项 -> 格式更改为法语,但这没有效果。资源编辑器显示没有附加语言的法语字符串表,但我的程序仍然总是加载英语字符串。将此更改复制到系统帐户也没有效果。

这是我尝试过的代码:

#include "stdafx.h"
#include <iostream>
#include "windows.h" // this should go to stdafx.h
#include "resource.h" // this should not go to stdafx.h
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
    // 1036 = french, 1031 = german
    SetThreadLocale(MAKELCID(1036, SORT_DEFAULT));
    const int maxSize = 100;
    wchar_t c[maxSize];
    LoadString(GetModuleHandle(NULL), IDS_STRING101, c, maxSize);
    std::cout << c;
    return 0;
}

Here是一个错误的、不完整的解释(在方法 2 的后半部分)。那里提出的第二个解决方法,仅使用国家/地区中立的字符串表是无用的,因为我有单独的葡萄牙语-葡萄牙和葡萄牙语-巴西字符串表。

那里提出的第一个解决方法不起作用。使用下面的代码,我收到错误 1814。

HRSRC r = FindResource(
    GetModuleHandle(NULL),
    MAKEINTRESOURCE(IDS_STRING101),
    RT_STRING);
DWORD e = GetLastError();

所以我该怎么做 ?这个奇怪的“bug”怎么解释呢?

稍后编辑:

经过更多测试后我发现:

  1. GetThreadLocale() 返回什么 在“控制面板”->“区域”中设置 语言选项 -> 格式。
  2. 资源加载器错误本质上是,如果我的程序也有美国英语资源,那么无论“格式”设置什么,这些资源都会被加载。如果没有美国英语资源,将使用格式中设置的语言。
  3. 如果我有法语(中性)和德语(中性)字符串表,并且我将格式设置为法语(法国),则会加载德语字符串。如果我添加英语(中性)字符串表,则会加载英语字符串。因此,中性文化后备不适用于格式中设置的内容。
  4. 如果我添加一个中性字符串表,即使我有另一个英语(中性)或英语(美国)字符串表,也会使用该表。

直接来自 MSDN 的如何选择本地化资源(包括 FindResource 的搜索顺序)的详细描述:多语言资源

编辑:但是,根据我的经验(至少在 Windows XP 上),该页面上 FindResource 的详细搜索顺序并未描述实际行为。实际行为似乎是:

  1. LANG_NEUTRAL 资源
  2. Lang 和 SubLang 与 UI 语言 Lang 和 SubLang 匹配的资源
  3. Lang 与 UI 语言 Lang 匹配且资源 Sublang 为中性的资源
  4. Lang 和 SubLang 与区域设置语言 Lang 和 SubLang 匹配的资源
  5. Lang 与区域设置语言 Lang 匹配且资源 Sublang 为中性的资源
  6. LANGID 数字最低的资源

注意:我没有任何来源来验证该列表,因此如果有人可以更新或更正任何内容,请这样做。

编辑:要理解这种行为,重要的是要认识到“语言环境”和“UI语言”之间的区别,如下所述:NLS 术语。 FindResource 函数的语言选择主要基于 UI 语言,而不是“区域和语言选项”中的“区域选项”设置(即“区域设置”设置,与调用 SetThreadLocale() 相同)。

据我所知,区域设置或“SetThreadLocale()”影响 FindResource() 的原因是因为@Kirill V. Lyadvinsky 在此处的答案之一中描述了异常情况,更详细地解释了迈克尔·卡普兰的博客.

只有使用 Vista 及以后版本中的新函数“SetThreadUILanguage”,才能在代码中清晰且确定地设置 FindResource 的语言。您看到的每个使用 SetThreadLocale 的地方都会有一些技巧来使其工作和/或在 UI 语言更改时出现问题(即:外语 Windows 安装)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

LoadString 仅在我没有英文字符串表时才有效 的相关文章

  • std::cout 和 std::wcout 有什么区别?

    在c 中 有什么区别std cout and std wcout 它们都控制流缓冲区的输出或将内容打印到控制台 或者它们只是相似吗 它们作用于不同的字符类型 std cout uses char作为字符类型 std wcout uses w
  • 为 Visual Studio 2013 编译 Tesseract

    我正在尝试使用tesseract在 Visual Studio 2013 中 我在链接器 gt 输入 不是 libtesseract302 static lib 中使用 libtesseract302 lib 一切都正常 并且已编译并运行
  • 在新的浏览器进程中打开 URL

    我需要在新的浏览器进程中打开 URL 当浏览器进程退出时我需要收到通知 我当前使用的代码如下 Process browser new Process browser EnableRaisingEvents true browser Star
  • 如何从 .resx 文件条目获取注释

    资源文件中的字符串有名称 值和注释 The ResXResourceReader类让我可以访问名称和值 有办法看评论吗 你应该能够得到Comment via ResXDataNode class http msdn microsoft co
  • 存储来自其他程序的事件

    我想将其他应用程序的事件存储在我自己的应用程序中 事件示例 打开 最小化 Word 或打开文件时 这样的事可能吗 运行程序 http msdn microsoft com en us library ms813609 aspx and 打开
  • 生成(非常)大的非重复整数序列而不进行预洗牌

    背景 我编写了一个简单的媒体客户端 服务器 我想生成一个不明显的时间值 随从客户端到服务器的每个命令一起发送 时间戳中将包含相当多的数据 纳秒分辨率 即使它不是真正准确 因为现代操作系统中计时器采样的限制 等 我想做的 在 Linux 上
  • C# Dns.GetHostEntry 不返回连接到 WiFi 的移动设备的名称

    我有一个 C 中的 Windows 窗体应用程序 我试图获取列表中所有客户端的主机名 下面给出的是 ra00l 来自此链接的代码示例 GetHostEntry 非常慢 https stackoverflow com questions 99
  • 未经许可更改内存值

    我有一个二维数组 当我第一次打印数组的数据时 日期打印正确 但其他时候 array last i 的数据从 i 0 到 last 1 显然是一个逻辑错误 但我不明白原因 因为我复制并粘贴了 for 语句 那么 C 更改数据吗 I use g
  • 如何使用 Mongodb C# 驱动程序连接多个集合

    我需要将 3 个集合与多个集合合并在一起 lookup我在 C 驱动程序中尝试过 它允许我 lookup用户采集但无法执行秒 lookup用于设置集合 有人可以帮忙吗 db Transactions aggregate lookup fro
  • 等待线程完成

    private void button1 Click object sender EventArgs e for int i 0 i lt 15 i Thread nova new Thread Method nova Start list
  • HttpWebRequest 在第二次调用时超时

    为什么以下代码在第二次 及后续 运行时超时 代码挂在 using Stream objStream request GetResponse GetResponseStream 然后引发 WebException 表示请求已超时 我已经尝试过
  • 如何对 Web Api 操作进行后调用?

    我创建了一个 Web API 操作 如下所示 HttpPost public void Load string siteName string providerName UserDetails userDetails implementat
  • gcc 的配置选项如何确定默认枚举大小(短或非短)?

    我尝试了一些 gcc 编译器来查看默认枚举大小是否很短 至少一个字节 强制使用 fshort enums 或无短 至少 4 个字节 强制使用 fno short enums user host echo Static assert 4 si
  • C++ 密码屏蔽

    我正在编写一个代码来接收密码输入 下面是我的代码 程序运行良好 但问题是除了数字和字母字符之外的其他键也被读取 例如删除 插入等 我知道如何避免它吗 特q string pw char c while c 13 Loop until Ent
  • Process.Start() 方法在什么情况下返回 false?

    From MSDN https msdn microsoft com en us library e8zac0ca v vs 110 aspx 返回值 true 表示有新的进程资源 开始了 如果由 FileName 成员指定的进程资源 St
  • 如何在 C# 中调整图像大小同时保持高质量?

    我从这里找到了一篇关于图像处理的文章 http www switchonthecode com tutorials csharp tutorial image editing saving cropping and resizing htt
  • 线程和 fork()。我该如何处理呢? [复制]

    这个问题在这里已经有答案了 可能的重复 多线程程序中的fork https stackoverflow com questions 1235516 fork in multi threaded program 如果我有一个使用 fork 的
  • 英特尔 Pin 与 C++14

    问题 我有一些关于在 C 14 或其他 C 版本中使用英特尔 Pin 的问题 使用较新版本从较旧的 C 编译代码很少会出现任何问题 但由于 Intel Pin 是操作指令级别的 如果我使用 C 11 或 C 14 编译它 是否会出现任何不良
  • 当另一个线程可能设置共享布尔标志(最多一次)时,是否可以读取共享布尔标志而不锁定它?

    我希望我的线程能够更优雅地关闭 因此我尝试实现一个简单的信号机制 我不认为我想要一个完全事件驱动的线程 所以我有一个工作人员有一种方法可以使用关键部分优雅地停止它Monitor 相当于C lock我相信 绘图线程 h class Drawi
  • 如何正确使用 std::condition_variable?

    我很困惑conditions variables以及如何 安全 使用它们 在我的应用程序中 我有一个创建 gui 线程的类 但是当 gui 是由 gui 线程构造时 主线程需要等待 情况与下面的函数相同 主线程创建互斥体 锁和conditi

随机推荐

  • 如何改变设计以使实体不使用注入?

    我读过并开始意识到 带有注入的实体 数据对象 用于 JPA 或序列化 是一个坏主意 这是我当前的设计 所有适当的字段都有 getter 和 setter 并且serialVersionUID为了简洁起见 我放弃了 这是父对象 是实体组合图的
  • Delphi中如何实现并行循环?

    如何在Delphi Delphi 200X Delphi XE 中实现并行循环 如何最好地做到这一点 有没有通用的解决方案 请举例说明 目前最好的解决方案可能是 Parallel For Loop 构造全线程库 您向它传递一个集合或一对表示
  • 使用 TSC(时间戳计数器)进行时间计算

    我正在尝试通过 Linux 内核模块以非常高的精度测量 Linux 内核中某些代码所花费的时间 为了这个目的 我曾尝试过rdtscl 它给出了代码中使用的时钟滴答数 如下所示 unsigned long ini end rdtscl ini
  • 如何在 Angular 4 中对齐左右文本 mat-card-header?

    我需要将标题中的文本内容对齐标题标记的左侧和右侧 我尝试了不同的想法 但没有一个适合我 帮我 div style width 40 div
  • 量角器切换到上一个选项卡

    打开新选项卡 第二个 后 我尝试切换到第一个选项卡 common clickOpenNewSession it opens the new tab browser getAllWindowHandles then function hand
  • 在 Java ME 中将 JSON 字符串转换为对象?

    Java J2ME中有没有办法转换字符串 例如 name MyNode width 200 height 100 在一行代码中转换为相同的内部对象表示 因为目前的方法太繁琐了 Object n create new setString p
  • Clojure Web 应用程序的良好 Web 服务器/Servlet 容器?

    我正在为我的 compojure Web 应用程序寻找一个好的生产 Web 服务器 servlet 容器 对于使用 compojure 的 Clojure Web 应用程序 使用 Jetty 或 Tomcat 或其他服务器有何优缺点 有没有
  • IIS ASP.Net 网站 - ManagedPipelineHandler 错误(尝试在不存在的网络连接上执行操作)

    我遇到一个奇怪的问题 我有一个使用表单身份验证的 ASP Net Web 应用程序 如果我打开登录页面并且有几分钟处于非活动状态 则登录尝试超时或 IE FireFox 显示 无法显示此页面 如果没有暂停或缺乏活动 则没有问题并且网站按预期
  • 如何在 LLVM 中打印字符串

    我想将 LLVM 中的指令打印到字符串而不是屏幕上 我用I gt print errs 打印到屏幕上 我怎样才能将指令放入字符串中 像这样 std string str llvm raw string ostream rso str I g
  • 如何停止Memo控件的自动滚动?

    在 Windows 7 中 备忘录控件 TMemo 插入文本后会自动滚动 Memo Lines Add Path 这是我不想要的 因为滚动是我自己完成的 如何停止自动滚动 通常 向备忘录控件添加文本会将备忘录滚动到插入文本的底部 为了防止这
  • Objective-C 接口、委托和协议

    因此 我试图了解 Objective C 接口 委托和协议 所以我有一个问题 委托是否必须位于单独的文件中 或者可以是类中定义的方法吗 协议类似于java接口吗 这就是我目前的理解方式 如果你使用这个协议 它基本上会让你实现方法 我仍然对接
  • 外键与辅助键

    我曾经认为外键和辅助键是同一个东西 谷歌搜索后 结果更加令人困惑 有些人认为它们是相同的 另一些人则说辅助键是一个不必是唯一的索引 并且允许比主键更快地访问数据 有人可以解释其中的区别吗 或者这确实是一个混合术语的情况 每个数据库类型可能有
  • Math.Round 与 String.Format

    我需要将双精度值四舍五入为 2 位数字 什么是更好的 String Format 0 0 00 123 4567 123 46 Math Round 123 4567 2 123 46 Math Round double digits 数字
  • 改善 Flexbox 生产线的平衡

    举例来说 假设我有一个弹性盒 其中每个元素都包含一个图像 在这种情况下 Flexbox 的目的是均匀分布它们 看起来很容易 我们来试试吧 flex width 350px display flex flex wrap wrap flex g
  • javascript:检测滚动结束

    我有一个div层与overflow set to scroll 当滚动到底部时div 我想运行一个函数 接受的答案从根本上来说是有缺陷的 现已被删除 正确答案是 function scrolled e if myDiv offsetHeig
  • 使用动态字段名称更新模型实例

    我想做的很简单 f Foobar objects get id 1 foo somefield bar somevalue f foo bar f save 这不起作用 因为它尝试更新 f 对象的 foo 字段 该字段当然不存在 我怎样才能
  • 创建 MySQL 触发器的 SQL 语法错误

    我尝试创建触发器 CREATE TRIGGER aster users2 after update ON aster users FOR EACH ROW BEGIN update event set flag 1 where id 1 E
  • 使用 Unity 解决命名依赖关系

    我有一个具有 2 个依赖项的服务 一个存储库和一个网关 短信 我需要解析该服务的 2 个不同版本 它们仅在传递给网关的参数之一上有所不同 代码简化如下 public interface IService string DoSomething
  • 将任意字符串映射到 RGB 值

    我有一大堆任意自然语言字符串 对于我的工具来分析它们 我需要将每个字符串转换为唯一的颜色值 RGB 或其他 我需要颜色对比来取决于字符串相似性 字符串与其他字符串越不同 它们各自的颜色应该越不同 如果我总是为同一字符串获得相同的颜色值 那就
  • LoadString 仅在我没有英文字符串表时才有效

    我希望能够以编程方式修改应用程序的语言 或者至少使用 控制面板 gt 区域和语言选项 gt 格式 中指定的语言 如果我添加一个英语字符串表 为其制作一个法语和德语副本 然后删除英语字符串表 我可以以编程方式在加载法语和德语字符串之间切换 如