d -做一个多语言应用程序



我想知道如何做多语言应用程序。似乎可以使用flag -J,但他们没有这个功能的文档。本页给出的链接http://www.digitalmars.com/d/2.0/dmd-linux.html似乎是错误的

如果你能做一个小的例子,将是很好的。如果不可能使用-J flag ,可以在运行时检测或不检测

感谢

亲切的问候

我不确定你所说的多语言应用程序是什么意思——-J标志是用于import(some_string)表达式,传递给DMD(这只是一个编译器)。

项目管理不在DMD的范围之内。

-J标志为DMD提供了用于导入表达式的根路径。你可以将它用作某种i18n系统的部分,但它是为在编译时导入任意数据blob而设计的。


编辑:From memory:

void main() {
  // the import expression resolves at compile 
  // time to the contents of the named file.
  stirng s = import("some_data_file.txt");
  writef("%s", s);
}

编译如下:

echo Hello World > some_data_file.txt
dmd code.d -J ./

将生成一个程序,当运行时将输出:

Hello World

这是导入表达式的长、短和总用途,-J标志的唯一用途是控制导入表达式读取的路径。

谢谢@BCS

所以没有-J标志,为了使用本地化,我必须做:

module localisation;
import std.string;
import std.stdio    : write, File, exists, StdioException, lines;
import std.array    : split;
import std.process  : getenv;
import std.exception: enforce, enforceEx;
struct Culture{
    string[string]  data = null;
    string          name = null;
    public static Culture opCall( string[string] data, string name ){ // Constructor
        Culture res;
        res.data = data;
        res.name = name;
        return res;
    }
}
static Culture culture = Culture(null, null);
Culture getLocalization(in string language){
    string fileName             = null;
    string name                 = null;
    string[string] localization = null;
    if ( exists("messages_"~ language ~ ".properties") ){
        fileName    = "messages" ~ language ~ ".properties";
        name        = language;
    }
    else if ( language.length >= 5 ){
        if ( language[2] == '-' ){
            fileName    = "messages_" ~ language[0..2] ~ "_" ~ language[4..5] ~ ".properties";
            name        = language[0..2] ~ "_" ~ language[4..5];
        }
        else{
            fileName    = "messages_" ~ language[0..5] ~ ".properties";
            name        = language[0..5];
        }
    }
    // Thrown an exception if is null
    enforce( fileName, "Unknow Culture format: " ~  language);
    // Thrown an exception if name is null
    enforce( name, "Error: name is null");
    // Thrown an exception if is path do not exist
    enforceEx!StdioException( exists( fileName ), "Cannot open file " ~ fileName ~ ", do not exist or is not include with -J flag" );
    File fileCulture = File( fileName, "r" );
    foreach(string line; lines(fileCulture)){
        string[] result = split(line, "=");
        localization[ result[0] ] = result[1];
    }
    return Culture( localization, name);
}

void main ( string[]  args ){
    string[string] localization = null;
    string  language            = getenv("LANG");
    culture                     = getLocalization( language );
}

和每个文件命名为:message_ <language> .properties。在属性文件中是这样的:

key1=value
key2=value

i使用"="字符分割字符串并放入hashmap。对于get right语句,只需使用

相关内容

  • 没有找到相关文章

最新更新