• Publicidad

Aplicación en 2 idiomas

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Aplicación en 2 idiomas

Notapor situ » 2014-08-04 12:52 @578

¿Cómo están?

Luego de un tiempo y con ayuda del foro pude concluir en forma parcial "https://github.com/marcositu/redhatchecklist", la cual es una aplicación para analizar la configuración de servidores RedHat o sus derivados.

Ahora estoy teniendo un problema; quiero dar la posibilidad de poder obtener un reporte en inglés o español según lo que la persona agregue como argumento.

Estoy armando así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. if ($idioma eq "es" ) {
  2. print F "<h1>analisis de seguridad - Informe</h1>";
  3. print F "<p>Cabe aclarar que si algunos items estan vacios significa que la configuraci&oacute;n esta correcta. <a href=\"$Hostname-$dia-recomendaciones.html\"><button type=\"button\" class=\"button-warning pure-button\">Recomendaciones</button></a></p>";
  4. }
  5. elsif ($idioma eq "en" ) {
  6. print F "<h1>Security analysis - Report</h1>";
  7. print F "<p>Take into account, that if some items are empty, it means that the configuration is correct. <a href=\"$Hostname-$dia-recomendations.html\"><button type=\"button\" class=\"button-warning pure-button\">Recomendations</button></a></p>";
  8. }
  9.  
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


Pero no sé si es lo mejor ya que tengo muchos print por realizar y por ahora vengo duplicando ese código y cambiando los print.

Saludos y gracias.
situ
Perlero nuevo
Perlero nuevo
 
Mensajes: 358
Registrado: 2007-04-09 01:44 @114

Publicidad

Re: Aplicación en 2 idiomas

Notapor explorer » 2014-08-04 13:44 @614

Se me ocurre que podrías poner todos los mensajes en un array, en que cada elemento es otro array de dos elementos:
Sintáxis: [ Descargar ] [ Ocultar ]
  1. my @msg = ( 
  2.     [ "¡Hola!", "Hi!" ], 
  3. ); 

Y luego en el programa, cambias todos los print() por algo como esto:
Sintáxis: [ Descargar ] [ Ocultar ]
  1.   print "$msg[0][$idioma]\n"; 
Eso lo que hace es sacar el primer mensaje (0), del idioma preferido (0 para español, 1 para inglés).
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Aplicación en 2 idiomas

Notapor explorer » 2014-08-04 13:51 @618

También se puede hacer al revés:
Sintáxis: [ Descargar ] [ Ocultar ]
  1.   my @msg = (  
  2.     [ 
  3.      "¡Hola!", 
  4.      "¡Adiós!", 
  5.     ], 
  6.     [ 
  7.      "Hi!", 
  8.      "Goodbay!", 
  9.     ], 
  10.   ); 
  11.  
  12. ...; 
  13.  
  14. print "$msg[$idioma][1]\n"; 

Y para no tener que acordarse de la relación entre mensaje y número, se puede crear un array auxiliar:

Sintáxis: [ Descargar ] [ Ocultar ]
  1. my %imsg = ( 
  2.     SALUDO => 0, 
  3.     DESPEDIDOA => 1, 
  4. ); 
  5.  
  6. ...; 
  7.  
  8. print "$msg[$idioma][$imsg{DESPEDIDA}]\n"; 

Aunque... puede quedar más corto si lo pones como constante:
Sintáxis: [ Descargar ] [ Ocultar ]
  1. use constant { 
  2.     SALUDO => 0, 
  3.     DESPEDIDOA => 1, 
  4. }; 
  5.  
  6. ...; 
  7.  
  8. print "$msg[$idioma][DESPEDIDA]\n"; 
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Aplicación en 2 idiomas

Notapor situ » 2014-08-04 13:52 @619

Muchas gracias, voy a ver cómo puedo adaptarlo.

Saludos.
situ
Perlero nuevo
Perlero nuevo
 
Mensajes: 358
Registrado: 2007-04-09 01:44 @114

Re: Aplicación en 2 idiomas

Notapor situ » 2014-08-04 14:00 @625

Perdón no entendí muy bien cómo relacionar $idioma en el print().

Sintáxis: [ Descargar ] [ Ocultar ]
  1.   my @msg = (  
  2.     [ 
  3.      "¡Hola!", 
  4.      "¡Adiós!", 
  5.     ], 
  6.     [ 
  7.      "Hi!", 
  8.      "Goodbay!", 
  9.     ], 
  10.   ); 
  11.  
  12. ...; 
  13.  
  14. print "$msg[$idioma][1]\n"; 
situ
Perlero nuevo
Perlero nuevo
 
Mensajes: 358
Registrado: 2007-04-09 01:44 @114

Re: Aplicación en 2 idiomas

Notapor explorer » 2014-08-04 16:09 @714

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use constant {
  2.     SALUDO    => 0,
  3.     DESPEDIDA => 1,
  4. };
  5.  
  6. my @msg = (  
  7.     [
  8.         "¡Hola!",
  9.         "¡Adiós!",
  10.     ],
  11.     [
  12.         "Hi!",
  13.         "Goodbay!",
  14.     ],
  15. );
  16.  
  17. if ($idioma_solicitado eq 'ingles') {
  18.     $idioma = 1;
  19. }
  20. else {
  21.     $idioma = 0;
  22. }
  23.  
  24. ...;
  25.      
  26. print "$msg[$idioma][1]\n";         # poniendo el número del mensaje
  27. print "$msg[$idioma][DESPEDIDA]\n"; # usando constante (más fácil de recordar)
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Aplicación en 2 idiomas

Notapor situ » 2014-08-04 20:41 @903

¡Perfecto!

Una consulta: ahora tengo un script principal que va llamando a otros utilizando:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use lib 'libs';
  2. require "fase0.pl";
  3. require "fase2.pl";
  4. require "fase1.pl";
  5. require "faseX.pl";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Cómo puedo hacer para tener todos los print() en mi archivo principal y luego en los script usar:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. print F "$msg[$idioma][0]\n";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Así tengo todo más ordenado.

Saludos.
situ
Perlero nuevo
Perlero nuevo
 
Mensajes: 358
Registrado: 2007-04-09 01:44 @114

Re: Aplicación en 2 idiomas

Notapor explorer » 2014-08-05 10:59 @499

En vez de require, lo mejor es usar do().

En ese caso, no se puede usar el módulo constant, ya que sus definiciones no son conocidas en módulos externos.

Una forma de resolverlo es convirtiendo las constantes a claves de un hash:
Sintáxis: (mensajes.pl) [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2.  
  3. our %msg = (
  4.     SALUDO    => 0,
  5.     DESPEDIDA => 1,
  6. );
  7.  
  8. our @msg = (  
  9.     [
  10.         "¡Hola!",
  11.         "¡Adiós!",
  12.     ],
  13.     [
  14.         "Hi!",
  15.         "Goodbay!",
  16.     ],
  17. );
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Sintáxis: (programa.pl) [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use v5.14;
  3.  
  4. do 'mensajes.pl';
  5.  
  6. our %msg;
  7. our @msg;
  8.  
  9. my $idioma_solicitado = 'inglés';
  10. my $idioma = $idioma_solicitado eq 'inglés' ? 1 : 0;
  11.  
  12. print "$msg[$idioma][0]\n";                     # poniendo el número del mensaje
  13. print "$msg[$idioma][$msg{DESPEDIDA}]\n";       # usando constante (más fácil de recordar)
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Pero... queda un poco largo. Casi mejor si lo juntamos todo en forma de módulo:
Sintáxis: (Msg.pm) [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2.  
  3. package Msg;
  4. use utf8;
  5. use v5.14;
  6. use Exporter 'import';
  7.  
  8. ### Lista de idiomas
  9. use constant {
  10.     ESPAÑOL    => 0,
  11.     INGLÉS     => 1,
  12.     ALEMÁN     => 2,
  13. };
  14.  
  15. ### Lista de mensajes
  16. use constant {
  17.     SALUDO    => 0,
  18.     DESPEDIDA => 1,
  19. };
  20.  
  21. our @msg = (  
  22.     [
  23.         "¡Hola!",
  24.         "¡Adiós!",
  25.     ],
  26.     [
  27.         "Hi!",
  28.         "Goodbay!",
  29.     ],
  30.     [
  31.         "Hallo zusammen!",
  32.         "Auf Wiedersehen!",
  33.     ],
  34. );
  35.  
  36. our $idioma = ESPAÑOL;                 # Idioma por defecto
  37.  
  38. sub cambia_idioma { $idioma = $_[0] }   # Cambiar de idioma
  39.  
  40. sub msg { $msg[$idioma][$_[0]] }        # Devolver mensaje
  41.  
  42. our @EXPORT = qw(&cambia_idioma &msg);  # Exportación
  43.  
  44. push @EXPORT, map { s/^Msg:://; $_ } keys %constant::declared;
  45.  
  46. 1;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Y ya desde el programa podemos usarlo de forma muy cómoda:
Sintáxis: (programa.pl) [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use utf8;
  3. use v5.14;
  4. use Msg;
  5. use open IO => qw(:utf8 :std);          # para salida de caracteres tildados
  6.  
  7. #say "Índice idioma: $Msg::idioma";
  8. #say $Msg::msg[$Msg::idioma][1];                # poniendo el número del mensaje
  9. #say $Msg::msg[$Msg::idioma][DESPEDIDA];        # usando constante (más fácil de recordar)
  10.  
  11. my $idioma_solicitado = INGLÉS;
  12. cambia_idioma($idioma_solicitado);
  13. say msg(DESPEDIDA);                     # Goodbay!     
  14.  
  15. $idioma_solicitado = ESPAÑOL;
  16. cambia_idioma($idioma_solicitado);
  17. say msg(DESPEDIDA);                     # ¡Adiós!
  18. say msg(SALUDO);                        # ¡Hola!
  19.  
  20. cambia_idioma(INGLÉS);
  21. say msg(SALUDO);                        # Hi!
  22.  
  23. cambia_idioma(ALEMÁN);
  24. say msg(DESPEDIDA);                     # Auf Wiedersehen!
  25.  
  26.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Aplicación en 2 idiomas

Notapor situ » 2014-08-05 12:35 @566

¡Perfecto! Muchas gracias, tengo una duda más.

Estoy usando un argumento para definir el idioma:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. $idioma_solicitado= $ARGV[0];
  2. chomp $idioma_solicitado;
  3. cambia_idioma($idioma_solicitado);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


El problema es que el argumento guarda bien el valor, pero no entiendo por qué no cambia el texto. Digamos que si pongo inglés o español siempre me lo imprime en "español" salvo que yo fuerce directamente en la variable $idioma_solicitado = ingles.

Saludos.
situ
Perlero nuevo
Perlero nuevo
 
Mensajes: 358
Registrado: 2007-04-09 01:44 @114

Re: Aplicación en 2 idiomas

Notapor explorer » 2014-08-05 13:23 @599

En el módulo Msg.pm tenemos definido las cadenas de texto, las claves de los hash y las constantes (y por ende, todo el código Perl) que está todo codificado en UTF-8 (use utf8 al principio del módulo).

En el programa, hacemos lo mismo: declaramos que estamos usando código UTF-8 para escribir el código del programa, y además, indicamos que la entrada y la salida de archivos también deben ir en ese codificación (use open al principio del programa).

Pero... no hemos dicho nada con respecto a cómo deben estar codificados los argumentos que pasamos al programa. Y ahí debe estar el error: Perl no hace ninguna conversión de los argumentos de entrada (por defecto), así que, aunque estés trabajando en un ordenador con codificación UTF-8, Perl los tratará como si estuvieran codificados en ISO-8859-1 (la de por defecto de Perl).

Entonces, debes indicarle que sí debe tratar a los argumentos como que estuvieran en UTF-8. O transformarlos una vez leídos en el programa.

Al principio del programa, donde está la línea shebang, le agregas una serie de banderas, para indicar ese procesamiento:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl -CSDA
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
(Más información en tu propio ordenador en perldoc perlrun, y en la Web (traducido al español)).

Si eso no va, puedes probar con lo que dice al final de la regla ℞ 18: Hacer que toda la E/S y argumentos trabajen por defecto en utf8.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Siguiente

Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 9 invitados