init
This commit is contained in:
commit
97f78f7728
8 changed files with 218 additions and 0 deletions
94
source/gettext_syslocale.d
Normal file
94
source/gettext_syslocale.d
Normal file
|
@ -0,0 +1,94 @@
|
|||
module gettext_syslocale;
|
||||
|
||||
import gettext;
|
||||
import std.file : exists, isFile;
|
||||
import std.path : buildPath, baseName;
|
||||
import std.process : environment;
|
||||
import std.string : split, empty;
|
||||
|
||||
/**
|
||||
* Extends the gettext library with support for system locale and standard GNU/Linux paths.
|
||||
*
|
||||
* This module automatically selects the language from system environment variables
|
||||
* (LC_ALL, LC_MESSAGES, LANG) and searches for .mo files in the standard path
|
||||
* /usr/share/locale/<language>/LC_MESSAGES/<programName>.mo.
|
||||
* It first checks the full language code (e.g., "ru_RU"), then the short code (e.g., "ru").
|
||||
*
|
||||
* Params:
|
||||
* programName = The name of the program (required parameter).
|
||||
*/
|
||||
bool initializeSystemLocale(string programName) @safe
|
||||
{
|
||||
if (programName.empty)
|
||||
{
|
||||
throw new Exception("Program name must not be empty");
|
||||
}
|
||||
|
||||
// Get the language from the system locale
|
||||
string fullLang = getSystemLanguage();
|
||||
if (fullLang.empty)
|
||||
{
|
||||
selectLanguage(""); // Empty MoFile if no locale is defined
|
||||
return false;
|
||||
}
|
||||
|
||||
// Check full and short language codes
|
||||
string shortLang = fullLang.split("_")[0];
|
||||
foreach (lang; [fullLang, shortLang])
|
||||
{
|
||||
if (tryLoadMoFile(programName, lang))
|
||||
{
|
||||
return true; // Successfully loaded .mo file
|
||||
}
|
||||
}
|
||||
|
||||
// If no file is found, use an empty MoFile
|
||||
selectLanguage("");
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Attempts to load an .mo file for the specified program name and language code.
|
||||
*
|
||||
* Params:
|
||||
* programName = The name of the program.
|
||||
* lang = The language code (e.g., "ru_RU" or "ru").
|
||||
*
|
||||
* Returns:
|
||||
* true if the .mo file is found and loaded, false otherwise.
|
||||
*/
|
||||
private bool tryLoadMoFile(string programName, string lang) @safe
|
||||
{
|
||||
string moPath = buildPath("/usr/share/locale", lang, "LC_MESSAGES", programName ~ ".mo");
|
||||
if (moPath.exists && moPath.isFile)
|
||||
{
|
||||
selectLanguage(moPath);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieves the language from the system locale.
|
||||
*
|
||||
* Checks environment variables LC_ALL, LC_MESSAGES, LANG in that order.
|
||||
* Returns the full language code (e.g., "ru_RU" from "ru_RU.UTF-8").
|
||||
* If the locale contains only a short code (e.g., "ru"), returns it as is.
|
||||
*
|
||||
* Returns:
|
||||
* The full language code (e.g., "ru_RU", "zh_CN") or an empty string if no locale is defined.
|
||||
*/
|
||||
private string getSystemLanguage() @safe
|
||||
{
|
||||
foreach (var; ["LC_ALL", "LC_MESSAGES", "LANG"])
|
||||
{
|
||||
string value = environment.get(var);
|
||||
if (!value.empty)
|
||||
{
|
||||
// Split on dot to ignore encoding (e.g., .UTF-8)
|
||||
auto parts = value.split(".");
|
||||
return parts[0]; // Return the full language code (e.g., ru_RU or ru)
|
||||
}
|
||||
}
|
||||
return "";
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue