2011-11-26 78 views
6

Necesito traducir un programa en otros idiomas, de hecho tengo el mismo programa en 3 idiomas (inglés, español, portugués), pero traduje, volví a compilar, y tengo 3 ejecutables por separado. Y agregar más idiomas y mantener enlaces, y agregar nuevas funciones me está volviendo loco.¿Cómo detectar el idioma del sistema en Delphi para proyectos en varios idiomas?

Así que ahora decidí mantener un único archivo ejecutable y un archivo de idioma externo, por lo que agregar nuevos idiomas no necesita recompilar, solo edita el archivo de idioma con un editor de texto, y todo está bien.

Quiero mantener todos los idiomas en un solo archivo externo. como international.lang

[portuguese] 
greeting="Bem-vindo" 

[spanish] 
greeting="Ben venido" 

si el archivo international.lang no está allí, o su idioma no está en el archivo, el programa se iniciará en Inglés por defecto, sin errores. Al igual que la mayoría de los programas de varios idiomas basados ​​en recursos.

Así que la pregunta es, cómo detectar el lenguaje de Windows en delphi? ¿Alguna idea sobre mi enfoque? ¿Hay alguna manera de reemplazar todos los subtítulos en los diálogos programáticamente?

pd: Estoy usando delphi7, y no puedo encontrar ningún componente que sea gratuito que sea bueno.

+2

¿Ha considerado simplemente dejar que el USUARIO seleccione el idioma? Quizás cuando se instalan. Use la información a continuación para establecer el valor predeterminado, pero tal vez permita que el usuario decida en el momento de la instalación, o incluso en el tiempo de ejecución, ¿qué idioma quiere? En segundo lugar, este problema ya está resuelto por DxGetText. Verifique esto: http://dxgettext.po.dk/ –

+0

@WarrenP Sí, lo haré, solo quiero preseleccionar el idioma para el mismo idioma predeterminado para el sistema. Entonces, en muchos casos, el usuario no necesitará tocar la configuración. –

Respuesta

9

Puede usar la función GetSystemDefaultLCID para obtener el identificador de configuración regional y luego usar la función VerLanguageName para resolver el nombre asociado al idioma. o utilizar la función GetLocaleInfo

Comprobar esta muestra

{$APPTYPE CONSOLE} 

uses 
    Windows, 
    SysUtils; 


procedure Test_VerLanguageName; 
var 
    wLang : LangID; 
    szLang: Array [0..254] of Char; 
begin 
    wLang := GetSystemDefaultLCID; 
    VerLanguageName(wLang, szLang, SizeOf(szLang)); 
    Writeln(szLang); 
end; 

procedure Test_GetLocaleInfo; 
var 
    Buffer : PChar; 
    Size : integer; 
begin 
    Size := GetLocaleInfo (LOCALE_USER_DEFAULT, LOCALE_SENGLANGUAGE, nil, 0); 
    GetMem(Buffer, Size); 
    try 
    GetLocaleInfo (LOCALE_USER_DEFAULT, LOCALE_SENGLANGUAGE, Buffer, Size); 
    Writeln(Buffer); 
    finally 
    FreeMem(Buffer); 
    end; 
end; 

begin 
    try 
    Test_VerLanguageName; 
    Test_GetLocaleInfo; 

    except 
    on E: Exception do 
     Writeln(E.ClassName, ': ', E.Message); 
    end; 
    Readln; 
end. 

Nota: A partir de Windows Vista existe nuevas funciones para obtener la misma información de configuración regional, comprobar estas funciones GetLocaleInfoEx, GetUserDefaultLocaleName y GetSystemDefaultLocaleName

+0

funciona bien, pero ¿sabes cómo obtener solo el nombre del idioma sin la ubicación? Estoy obteniendo este valor 'Inglés (Estados Unidos)' Quiero solo 'Inglés' sin' (Estados Unidos) '. Si no, ¿es seguro eliminar los paréntesis con expresión regular? –

+0

¿Qué función está utilizando 'VerLanguageName' o' GetLocaleInfo'? – RRUZ

+1

'VerLanguageName = Inglés (Estados Unidos)' y 'GetLocaleInfo = English' en Windows7 y Windows XP (también funciona bien). Creo que debería usar solo GetLocaleInfo –

0

tengo el mismo problema aunque tengo que lidiar solo con dos idiomas: inglés (predeterminado) y polaco. Probé todas las soluciones enumeradas anteriormente y ninguna de ellas funcionaba. Estaba cambiando la configuración del sistema, reiniciando, etc. y recibiendo siempre el idioma inglés. Cuando se cambió a polaco, todo se mostró en polaco, se configuraron todos los locales en polaco pero mi aplicación recibía inglés como idioma del sistema operativo. Después de muchos intentos me encontré con una solución bastante fácil y confiable (no la llamo solución) que es buena si tiene que lidiar con una pequeña cantidad de idiomas. Así que el truco es verificar en qué idioma TLanguages ​​devuelve la lista de idiomas.

function GetLang: Integer; //lcid 
const 
    lcidEnglish = $9; 
    lcidPolish = $415; 
var Idx: Integer; 
begin 
    Result := Languages.IndexOf(lcidPolish); 

    if (Result > 0) and 
    (Languages.Name[Result].StartsWith('Polski', True)) //'Polski'is the Polish name of the language 
    then Result := lcidPolish 
    else Result := lcidEnglish; 
end; 

Usted puede hacer lo mismo para sus tres idiomas. Espero que ayude.

Cuestiones relacionadas