0

多言語アプリケーションの方法を知りたいです。フラグ -J を使用することで可能と思われますが、この機能のドキュメントではありません。このページhttp://www.digitalmars.com/d/2.0/dmd-linux.htmlにあるリンクは間違っているようです

少し例を挙げていただければ幸いです。使用法 -J フラグで可能でない場合は、実行時に検出するための何か

ありがとう

敬具

4

3 に答える 3

1

多言語アプリケーションの意味がわかりません。-Jフラグはimport(some_string)式用であり、DMD(単なるコンパイラ)に渡されます。

プロジェクト管理はDMDの範囲外です。

于 2011-08-12T22:31:50.543 に答える
1

-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フラグの唯一の用途は、インポート式が読み取るパスの制御です。

于 2011-08-12T23:55:58.857 に答える
0

ありがとう@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

「=」文字を使用して文字列を分割し、ハッシュマップに入れます。正しいステートメントを取得するには、キーを使用するだけです

于 2011-08-16T12:00:50.133 に答える