Contenido

# Servicio ScriptForge.L10N

Este servicio proporciona una serie de métodos relacionados con la traducción de cadenas con un impacto mínimo en el código fuente del programa. Los métodos proporcionados por el servicio L10N pueden utilizarse principalmente para:

- Crear archivos POT que puedan utilizarse como plantillas para la traducción de todas las cadenas del programa.

- Obtener cadenas traducidas durante la ejecución en el idioma definido en la propiedad Locale.

The acronym L10N stands for Localization and refers to a set of procedures for translating software to a specific country or region.

Los archivos PO se han promovido durante mucho tiempo en la comunidad de la programática libre como medio para proporcionar interfaces de usuario multilingües. Esto se consigue mediante el uso de archivos de texto legibles por humanos con una estructura bien definida que especifica, para cualquier idioma, la cadena del idioma de origen y la cadena regionalizada.

The main advantage of the PO format is dissociation of the programmer and the translator. PO files are independent text files, so the programmer can send POT template files to translators, who will then translate their contents and return the translated PO files for each supported language.

El servicio L10N se basa en la implementación de GNU de los archivos PO (objeto portátil). Para conocer más de este formato de archivo, visite la documentación de utilidades de GNU gettext: archivos PO (en inglés).

Este servicio implementa los métodos que se enumeran a continuación:

- AddText: Used by the programmer to build a set of strings that will be translated later.

- AddTextsFromDialog: Extracts all strings from a Dialog service instance.

- ExportToPOTFile: Exports the strings added by the AddText method to a POT file.

- GetText: obtiene las cadenas traducidas en tiempo de ejecución.

Note that the first two methods are used to build a set of translatable strings and export them to a POT file. However, it is not mandatory to create POT files using these methods. Since they are text files, the programmer could have created them using any text editor.

## Invocación del servicio

Antes de utilizar el servicio L10N, es necesario cargar o importar la biblioteca ScriptForge:

• Para cargar la biblioteca ScriptForge que necesitan las macros de Basic se debe usar la siguiente declaración:
GlobalScope.BasicLibraries.loadLibrary("ScriptForge")
• Los scripts de Python necesitan importar el módulo scriptforge:
from scriptforge import CreateScriptService

Hay varias formas de invocar el servicio L10N utilizando hasta cinco argumentos opcionales que especifican la carpeta donde se almacenan los archivos PO, la configuración regional y la codificación que se utilizará, así como un archivo PO de reserva y su codificación.

### Sintaxis:

CreateScriptService("L10N", opt foldername: str, opt locale: str, encoding: str = "UTF-8", opt locale2: str, encoding2: str = "UTF-8"): svc

foldername: The folder containing the PO files. It must be expressed in the FileSystem.FileNaming notation.

locale: A string in the form "la-CO" (language-COUNTRY) or in the form "la" (language) only.

encoding: The character set to be used. The default encoding is "UTF-8".

locale2: A string specifying the fallback locale to be used in case the PO file corresponding to the locale defined the locale parameter does not exist. This parameter is expressed in the form "la-CO" (language-COUNTRY) or "la" (language) only.

encoding2: The character set of the fallback PO file corresponding to the locale2 argument. The default encoding is "UTF-8".

Para conocer más sobre los nombres de los conjuntos de caracteres, consulte la página Conjuntos de caracteres de la IANA (en inglés). Conviene saber que LibreOffice no admite todos los conjuntos de caracteres existentes.

### Ejemplo:

##### En BASIC

The following example instantiates the L10N service without any optional arguments. This will only enable the AddText and ExportToPOTFile methods, which is useful for creating POT files.

          GlobalScope.BasicLibraries.loadLibrary("ScriptForge")
          Dim myPO As Variant
          Set myPO = CreateScriptService("L10N")

The example below specifies the folder containing the PO files. Because the locale is not defined, the service instance will use the locale defined for the LibreOffice user interface, which is the same locale defined in the OfficeLocale property of the Platform service.

          Set myPO = CreateScriptService("L10N", "C:\myPOFiles")

The example above will result in an runtime error if the PO file corresponding to the OfficeLocale locale does not exist in the specified folder.

In the example below, the locale is explicitly defined to be Belgian French ("fr-BE"), hence the service will load the file "fr-BE.po" from the folder "C:\myPOFiles". If the file does not exist, an error will occur.

          Set myPO = CreateScriptService("L10N", "C:\myPOFiles", "fr-BE", "UTF-8")

To avoid errors, it is possible to specify a preferred and a fallback locale and encoding. The following example will first try to load the file "fr-BE.po" from the specified folder and if it does not exist, the file "en-US.po" will be loaded.

          Set myPO = CreateScriptService("L10N", "C:\myPOFiles", "fr-BE", "UTF-8", "en-US", "UTF-8")

PO files must be named in the form "la-CO.po" or "la.po", where "la" refers to the language and "CO" is the country. Some examples are: "en-US.po", "fr-BE.po" or "fr.po".

Es recomendable liberar recursos después del uso:

          Set myPO = myPO.Dispose()

##### En Python

Los ejemplos anteriores pueden expresarse en Python de la siguiente manera:

          from scriptforge import CreateScriptService
          myPO = CreateScriptService('L10N')

          myPO = CreateScriptService('L10N', r'C:\myPOFiles')

          myPO = CreateScriptService('L10N', r'C:\myPOFiles', 'fr-BE')

          myPO = CreateScriptService('L10N', r'C:\myPOFiles', 'fr-BE', 'UTF-8', 'en-US', 'UTF-8')
          myPO = myPO.Dispose()

Pueden coexistir varias instancias del servicio L10N. Sin embargo, cada ocurrencia debe utilizar un directorio distinto para sus archivos PO.

## Propiedades

Nombre | De solo lectura | Tipo | Descripción
--- | --- | --- | ---
Folder | Sí | String | La carpeta que contiene los archivos PO (vea la propiedad FileSystem.FileNaming para conocer la notación utilizada).
Languages | Sí | Array | Una matriz indizada a partir de cero que enumera todos los nombres de base (sin la extensión «.po») de los archivos PO que se encuentren en la carpeta especificada en Folder.
Locale | Sí | String | The currently active language-COUNTRY combination. This property will be initially empty if the service was instantiated without any of the optional arguments.

Lista de métodos en el servicio L10N
AddText AddTextsFromDialog | ExportToPOTFile | GetText

## AddText

Añade una entrada nueva en la lista de cadenas regionalizables. No debe existir aún.

El método devuelve True si se lleva a término correctamente.

### Sintaxis:

svc.AddText(context: str = '', msgid: str = '', comment: str = ''): bool

### Parámetros:

context: The key to retrieve the translated string with the GetText method. This parameter has a default value of "".

msgid: The untranslated string, which is the text appearing in the program code. It must not be empty. The msgid becomes the key to retrieve the translated string via GetText method when context is empty.

The msgid string may contain any number of placeholders (%1 %2 %3 ...) for dynamically modifying the string at runtime.

comment: Optional comment to be added alongside the string to help translators.

### Ejemplo:

El ejemplo a continuación crea un conjunto de cadenas en inglés:

##### En BASIC

          myPO.AddText(, "This is a string to be included in a POT file")
          myPO.AddText("CTX1", "A string with a context")
          myPO.AddText(, "Provide a String value", Comment := "Do not translate the word String")

##### En Python

          myPO.AddText(msgid = 'This is a string to be included in a POT file')
          myPO.AddText('CTX1', 'A string with a context')
          myPO.AddText(msgid = 'Provide a String value', comment = 'Do not translate the word String')

## AddTextsFromDialog

Extrae automáticamente las cadenas de un diálogo y las añade a la lista de cadenas de texto regionalizables. Se extraen las cadenas siguientes:

- El título del diálogo.

- The caption of the following control types: Button, CheckBox, FixedLine, FixedText, GroupBox and RadioButton.

- Static strings in ListBoxes and ComboBoxes.

- La descripción emergente o el texto de ayuda que se muestra cuando el ratón se posa sobre el control.

El método devuelve True si se lleva a término correctamente.

The dialog from which strings will be extracted must not be open when the method is called.

When a L10N service instance is created from an existing PO file, use the GetTextsFromL10N method from the Dialog service to automatically load all translated strings into the dialog.

### Sintaxis:

svc.AddTextsFromDialog(dialog: svc): bool

### Parámetros:

dialog: a Dialog service instance corresponding to the dialog from which strings will be extracted.

### Ejemplo:

The following example extracts all strings from the dialog "MyDialog" stored in the "Standard" library and exports them to a POT file:

##### En BASIC

          oDlg = CreateScriptService("Dialog", "GlobalScope", "Standard", "MyDialog")
          myPO = CreateScriptService("L10N")
          myPO.AddTextsFromDialog(oDlg)
          myPO.ExportToPOTFile("C:\en-US.pot")

##### En Python

          dlg = CreateScriptService("Dialog", "GlobalScope", "Standard", "Dialog1")
          myPO = CreateScriptService("L10N")
          myPO.AddTextsFromDialog(dlg)
          myPO.ExportToPOTFile("C:\en-US.pot")

## ExportToPOTFile

Exporta un conjunto de cadenas no traducidas en un archivo POT.

To build a set of strings you can use either a succession of AddText method calls, or by a successful invocation of the L10N service with the foldername argument present. It is also possible to use a combination of both techniques.

El método devuelve True si se lleva a término correctamente.

### Sintaxis:

svc.ExportToPOTFile(filename: str, header: str = '', encoding:str = 'UTF-8'): bool

### Parámetros:

filename: The full output file name in FileSystem.FileNaming notation.

header: los comentarios que se añadirán en la parte superior del archivo POT generado.

Do not include any leading "#" characters. If you want the header to be broken into multiple lines, insert escape sequences (\n) where relevant. A standard header will be added alongside the text specified in the header argument.

encoding: The character set to be used (Default = "UTF-8").

### Ejemplo:

           ' Basic
           myPO.ExportToPOTFile("C:\myFile.pot", Header := "First line of the header\nSecond line of the header")

          # Python
          myPO.ExportToPOTFile('C:\myFile.pot', header = 'First line of the header\nSecond line of the header')

El archivo generado debe superar la orden msgfmt --check de este programa de GNU.

## GetText

Gets the translated string corresponding to the given msgid argument.

Se puede definir una lista de argumentos para reemplazar los sustitutivos (%1, %2…) en la cadena.

Si no se encontrare ninguna cadena traducida, el método devolverá la cadena no traducida con los sustitutivos reemplazados por los argumentos especificados.

### Sintaxis:

This method can be called either by the full name GetText or by the shortcut _ (a single underscore):

svc.GetText(msgid: str, args: any[0..*]): str

svc._(msgid: str, args: any[0..*]): str

In the ScriptForge library, all methods starting with the "_" character are reserved for internal use only. However, the shortcut _ used for GetText is the only exception to this rule, hence it can be safely used in Basic and Python scripts.

### Parámetros:

msgid: The untranslated string, which is the text appearing in the program code. It must not be empty. It may contain any number of placeholders (%1 %2 %3 ...) that can be used to dynamically insert text at runtime.

Besides using a single msgid string, this method also accepts the following formats:

- The context string with which the method will retrieve the msgid in the PO file, or;

- A combination context|msgid, instructing the method to retrieve the msgid using specified context value. The second part of the argument is used to improve code readability.

args: Values to be inserted into the placeholders. Any variable type is allowed, however only strings, numbers and dates will be considered.

### Ejemplo:

##### En BASIC

Consider the following code is running on a LibreOffice installation with locale set to "es-ES". Additionally, there is a file "es-ES.po" inside the specified folder that translates the string passed to the GetText method:

          myPO = CreateScriptService("L10N", "C:\myPOFiles\")
          myPO.GetText("Welcome %1! Hope you enjoy this program", "John")
          ' "¡Bienvenido John! Espero que disfrutes de este programa"

##### En Python

          myPO = CreateScriptService('L10N', r"C:\myPOFiles")
          myPO.GetText('Welcome %1! Hope you enjoy this program', 'John')
          # "¡Bienvenido John! Espero que disfrutes de este programa"

Todas las rutinas o identificadores BASIC de ScriptForge precedidas por guion bajo «_» están reservadas para uso interno. No deben utilizarse en macros BASIC o secuencias Python.

Temas relacionados

Servicio ScriptForge.FileSystem

Traducción de controles en el diálogo del editor

¡Necesitamos su ayuda!