Language
Interface to handle translations inside C++ code.
This library handles translations created with the innovaphone translator (application type App C++).
File information
Classes
Language
class Language {
public:
static int GetLanguageId(const char * lang, LanguageTableEntry languages[], int numLangs, int defaultLang);;
static size_t ReplaceArgs(const char * translatedString, char * buffer, size_t bufferLen, ...);;
};
Public functions
GetLanguageId (static function)
-
This functions returns the array index (language id) of the lang parameter inside the languages array.
Parameters
const char * lang | A const char pointer to the currently used language, e.g. 'en' or 'eng'. |
LanguageTableEntry languages[] | An array which holds all available language table entries. |
int numLangs | The number of array elements inside languages[]. |
int defaultLang | defaultLang is returned, if lang can't be found. |
Return value
The language array index if found or otherwise defaultLang.
ReplaceArgs (static function)
-
This function replaces dynamic arguments inside a translated string. A dynamic argument is a string like $1, $2, ... (starting with 1).
The arguments are handed by specifying their type and their value always as two function parameters.
You can hand as many parameters as you want.
Parameters
const char * translatedString | The already translated string with dynamic arguments, e.g. 'This argument has a size of $1.' |
char * buffer | The output buffer, which will be null terminated. |
size_t bufferLen | The length of the output buffer. |
language_param_type_t type | The parameter type of the following function parameter. |
? param | The parameter with a type which must be one of language_param_type_t. |
More duos of language_param_type_t + param, in case of LANGUAGE_PARAM_TYPE_DOUBLE four parameters (1. LANGUAGE_PARAM_TYPE_DOUBLE, 2. the precision as 32bit integer, 3. char delimiter, 4. the double value) |
Return value
The length of the string inside the buffer.
Data types
LanguageTableEntry
typedef struct {
const char * lang; // two char language identifier, e.g. 'en' or 'de'
const char * utf8; // the language name in utf8
const char * langIso639_2; // three char language identifier after ISO 639-2, e.g. 'eng' or 'deu'
} LanguageTableEntry;
Overview
The struct LanguageTableEntry
holds information about one language.
language_param_type_t
typedef enum {
LANGUAGE_PARAM_TYPE_STRING = 0,
LANGUAGE_PARAM_TYPE_UINT32,
LANGUAGE_PARAM_TYPE_INT32,
LANGUAGE_PARAM_TYPE_UINT64,
LANGUAGE_PARAM_TYPE_INT64,
LANGUAGE_PARAM_TYPE_DOUBLE
} language_param_type_t;
Overview
The enum language_param_type_t
specifies all possible parameter types for the function ReplaceArgs.
Code Example
Example cpp file app_languages.cpp created by the innovaphone translator
#include "platform/platform.h"
#include "common/lib/language.h"
#include "app_languages.h"
LanguageTableEntry myLanguageTable[] = {
{ "en", "English", "eng" },
{ "de", "Deutsch", "deu" },
};
myStringTableEntry myStringTable[] = {
{{ /* 1 - APP_TXT_TEST */
/* 1-en */ "This is a test.",
/* 2-de */ "Das ist ein Test.",
}},
{{ /* 1 - APP_TXT_TEST2 */
/* 1-en */ "This is a test with $1 arguments inside $2 und einem Double-Wert $3.",
/* 2-de */ "Das ist ein Test mit $1 Argumenten in $2 and a double value $3.",
}},
};
Example h file app_languages.h created by the innovaphone translator
#define APP_LANGUAGE_EN 0
#define APP_LANGUAGE_DE 1
#define APP_NUM_LANGUAGES 2
typedef struct { const char * lang[APP_NUM_LANGUAGES]; } appStringTableEntry;
extern LanguageTableEntry appLanguageTable[APP_NUM_LANGUAGES];
extern appStringTableEntry appStringTable[];
#define APP_TXT_TEST 0
#define APP_TXT_TEST2 1
#define APP_COUNT_TXT_ITEMS 2
#define APP_LANG_STRING(stringId, langId) appStringTable[stringId].lang[langId]
Usage
int langId = Language::GetLanguageId("de", appLanguageTable, APP_NUM_LANGUAGES, APP_LANGUAGE_EN);
const char * str = APP_LANG_STRING(APP_TXT_TEST, langId);
size_t bufferLen = strlen(str) + strlen("R2D2") + 20; // +20 => unsigned int + terminating zero
char * buffer = (char *)alloca(bufferLen);
Language::ReplaceArgs(str, buffer, bufferLen,
LANGUAGE_PARAM_TYPE_UINT32, 2,
LANGUAGE_PARAM_TYPE_STRING, "R2D2",
LANGUAGE_PARAM_TYPE_DOUBLE, (dword)2, ',', 25.55555); // take care to hand the wished precision too!
debug->printf("%s", str); // will print "Das ist ein Test mit $1 Argumenten in $2 und einem Double-Wert $3."
debug->printf("%s", buffer); // will print "Das ist ein Test mit 2 Argumenten in R2D2 und einem Double-Wert 22,55."