Quiero poder modificar el idioma de la aplicación mediante programación, o al menos usar el idioma especificado en el Panel de control -> Opciones regionales y de idioma -> Formatos.LoadString funciona solo si no tengo una tabla de cadenas en inglés
Si agrego una tabla de cadenas en inglés, hago una copia en francés y en alemán, y elimino la en inglés, puedo cambiar programáticamente entre cargar las cadenas en francés y en alemán. Si guardo la copia en inglés, las cadenas en inglés se cargan, pase lo que pase, cuando intento cargar el alemán o el francés.
Creo que este es un error del cargador de recursos, y que el cargador de recursos ignora SetThreadLocale, si encuentra una tabla de cadenas en el mismo idioma que el de Windows UI (el idioma de los menús de Windows Explorer, por ejemplo).
Traté de cambiar el Panel de control -> Configuración regional y de idioma -> Formatos al francés, pero eso no tiene ningún efecto. El editor de recursos muestra la tabla de cadenas en francés sin el idioma adjunto, pero mi programa todavía carga las cadenas en inglés. Copiar este cambio en la cuenta del sistema tampoco tiene ningún efecto.
Este es el código He intentado esto con:
#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 es una mitad incorrecta, incompleta explicación (en la segunda mitad del método 2). La segunda solución propuesta allí, que utiliza solo tablas de cadenas neutrales de coutry es inútil, porque tengo tablas de cadenas portugués-portugués y portugués-brasileño separadas.
La primera solución propuesta allí no funciona. Con el siguiente código, obtengo el error 1814.
HRSRC r = FindResource(
GetModuleHandle(NULL),
MAKEINTRESOURCE(IDS_STRING101),
RT_STRING);
DWORD e = GetLastError();
Entonces, ¿qué debo hacer? ¿Cuál es la explicación de este extraño "error"?
de editar posteriormente:
Después de algunas pruebas más descubrí que:
- GetThreadLocale() devuelve lo que es conjunto del Panel de control -> Opciones regionales y de idioma -> Formatos.
- La falla del cargador de recursos es esencialmente que si mi programa también tiene recursos de inglés de EE. UU., Esos recursos se cargarán, sin importar lo que esté configurado en Formats. Si no tiene recursos de inglés de EE. UU., Se usará el idioma establecido en Formats.
- Si tengo una tabla de cadenas francesa (neutral) y alemana (neutral), y configuré formatos en francés (Francia), se cargan las cadenas alemanas. Si agrego una tabla de cadenas en inglés (Neutral), las cadenas en inglés están cargadas. Entonces, la recuperación de la cultura neutral no funciona para lo que se establece en Formats.
- Si agrego una tabla de cadenas neutrales, esa será utilizada, incluso si tengo otra tabla de cadenas en inglés (neutral) o en inglés (Estados Unidos).
¿Cuál es la configuración regional de usuario seleccionada actualmente? Es el idioma de los menús en el Explorador de Windows e inmutable. La ubicación del subproceso está marcada antes de que tenga la oportunidad de modificarlo? ¿Cómo puedo configurar la configuración regional predeterminada con el editor de recursos? –
Es la configuración regional que se seleccionó en Configuración regional en el Panel de control. –
Eso no está relacionado con la pestaña Formato. Es la pestaña Avanzado. –