多言語アプリケーションの方法を知りたいです。フラグ -J を使用することで可能と思われますが、この機能のドキュメントではありません。このページhttp://www.digitalmars.com/d/2.0/dmd-linux.htmlにあるリンクは間違っているようです
少し例を挙げていただければ幸いです。使用法 -J フラグで可能でない場合は、実行時に検出するための何か
ありがとう
敬具
多言語アプリケーションの方法を知りたいです。フラグ -J を使用することで可能と思われますが、この機能のドキュメントではありません。このページhttp://www.digitalmars.com/d/2.0/dmd-linux.htmlにあるリンクは間違っているようです
少し例を挙げていただければ幸いです。使用法 -J フラグで可能でない場合は、実行時に検出するための何か
ありがとう
敬具
多言語アプリケーションの意味がわかりません。-J
フラグはimport(some_string)
式用であり、DMD(単なるコンパイラ)に渡されます。
プロジェクト管理はDMDの範囲外です。
-J
フラグは、インポート式に使用するルート パスを DMD に提供します。これをある種のi18nシステムの一部として使用できるかもしれませんが、コンパイル時に任意のデータ blob をインポートするように設計されています。
編集:記憶から:
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_.propertiesのようになります<language>
。プロパティファイルのどこにあるかは次のようなものです。
key1=value
key2=value
「=」文字を使用して文字列を分割し、ハッシュマップに入れます。正しいステートメントを取得するには、キーを使用するだけです