我想知道如何做多语言应用程序。似乎可以使用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语句,只需使用