3

プログラムをバイリンガルにする方法を実装しようとしています。ユーザーは、プログラムがフランス語または英語を表示するかどうかを選択できます(私の場合)。私は多くの調査とグーグルを行いましたが、それを行う方法の良い例をまだ見つけることができません:/

gettext について読みましたが、これは学校のプロジェクトのためのものであるため、外部ライブラリを使用することは許可されていません (試してみましたが、それを機能させる方法がまったくわからないことを認めなければなりません!)

誰かが私に言語ごとに配列を使用することも提案しました。私は間違いなくこれを機能させることができましたが、解決策は非常に醜いと思います。

私が考えたもう 1 つの方法は、各行に文を入れた複数のファイルを用意することで、必要なときに適切な言語の適切な行を取得できるようにすることです。私はこれを機能させることができると思いますが、最もエレガントなソリューションとは思えません。

最後に、友人が DLL を使用できると言いました。私はそれを調べましたが、それは確かに私が見つけることができる最良の方法の1つであるようです...問題は、その問題について見つけることができるほとんどのリソースがC#およびC ++用にコーディングされていて、どうすればよいかまだわかりませんCで実装する:/その背後にあるアイデアを理解することはできますが、Cでそれを処理する方法がわかりません(まったく!DLLを作成する方法、呼び出す方法、DLLから適切なものを取得する方法などはわかりません>_<)

誰かが私が使用できるいくつかの有用なリソースを教えてくれますか、または物事がどのように機能するか、または行われるべきかを説明するコードを書くことができますか? それは真剣に素晴らしいでしょう!

よろしくお願いします!

(ちなみに、Visual Studio 2012 と C のコードを使用しています) ^^

4

3 に答える 3

0

プログラムを翻訳可能にする主なアイデアは、テキストを使用するすべての場所であらゆる種類の ID を使用することです。次に、テストを表示する前に、適切な言語テーブルから id を使用してテキストを取得します。

例:

書く代わりに

printf("%s","Hello world");

あなたが書く

printf("%s",myGetText(HELLO_WORLD)); 

多くの場合、id の代わりに母国語の文字列自体が使用されます。例えば:

printf("%s",myGetText("Hello world"));

最後に、myGetText 関数は通常、マクロとして実装されます。たとえば、次のようになります。

printf("%s", tr("Hello world")); 

このマクロは、ソース コードで翻訳するテキストを識別し、それらをリストとしてファイルに保存するために、外部パーサー (gettext など) で使用できます。

myGetText は次のように実装できます。

std::map<std::string, std::map<std::string, std::string> > LangTextTab;
std::string GlobalVarLang="en"; //change to de for obtaining texts in German

void readLanguagesFromFile()
{

  LangTextTab["de"]["Hello"]="Hallo";
  LangTextTab["de"]["Bye"]="Auf Wiedersehen";
  LangTextTab["en"]["Hello"]="Hello";
  LangTextTab["en"]["Bye"]="Bye";
}

const char * myGetText( const char* origText )
{
  return LangTextTab[GlobalVarLang][origText ].c_str();
}

コードは疑似コードと考えてください。私はそれをコンパイルしていません。Unicode、スレッドセーフなど、まだ言及すべき多くの問題があります...しかし、この例がどのように開始するかのアイデアを与えることを願っています.

于 2013-04-24T19:16:30.170 に答える
0

gettext は明らかな答えですが、あなたの場合は不可能のようです。うーん。本当に、本当にカスタム ソリューションが必要な場合...ここで突飛なアイデアを捨てる...

1: カスタムの多言語文字列型を作成します。利点は、必要に応じて後で新しい言語を簡単に追加できることです。#4で見られる欠点。

//Terrible name, change it
typedef struct
{
    char *french;
    char *english;
} MyString; 

2: 必要に応じて文字列を定義します。

MyString s;
s.french = "Bonjour!";
s.english = "Hello!";

3: ユーティリティの列挙と関数

enum
{
    ENGLISH,
    FRENCH
};

char* getLanguageString(MyString *myStr, int language)
{
    switch(language)
    {
        case ENGLISH:
            return myStr->english;
            break;
        case FRENCH:
            return myStr->french;
            break;
        default:
            //How you handle other values is up to you. You could decide on a default, for instance
            //TODO
    }
}

4: 単純な古い C 標準関数を使用する代わりに、ラッパー関数を作成します。たとえば、代わりにprintf:

//Function should use the variable arguments and allow a custom format, too
int myPrintf(const char *format, MyString *myStr, int language, ...)
{
    return printf(format, getLanguageString(myStr, language));
}

その部分が厄介です。カスタム文字列を処理するには、文字列を使用するすべての関数をオーバーライドする必要があります。言語変数が指定されていない場合に使用する、グローバルな既定の言語変数を指定することもできます。

繰り返しますが、gettext ははるかに優れています。本当に必要な場合にのみ実装してください。

于 2013-04-24T18:58:45.320 に答える