ユーザーメッセージの複数


106

多くの場合、ユーザーに表示するメッセージを生成するとき、メッセージには、お客様に知らせたいいくつかの情報が含まれます。

例を挙げましょう。顧客は1以上の数のアイテムを選択し、[削除]をクリックしました。ここで、お客様に確認メッセージを表示したいと思います。選択したアイテムの数について言及します。アイテムの束を選択し、1つだけを削除したい場合に[削除]をクリックすることで、間違いを最小限に抑えることができます。それら。

1つの方法は、次のような一般的なメッセージを作成することです。

int noofitemsselected = SomeFunction();
string message = "You have selected " + noofitemsselected + " item(s). Are you sure you want to delete it/them?";

ここでの「問題」はがnoofitemselected1 の場合で、itemsそれらの代わりにitemそれを書く必要があります

私の通常の解決策はこのようなものになります

int noofitemsselected = SomeFunction();
string message = "You have selected " + noofitemsselected + " " + (noofitemsselected==1?"item" : "items") + ". Are you sure you want to delete " + (noofitemsselected==1?"it" : "them") + "?";

コード内に複数の数字への参照が多く、実際のメッセージが読みにくくなると、これは非常に長く、非常に厄介です。

だから私の質問は単にです。このようなメッセージを生成するより良い方法はありますか?

編集

メッセージボックス内にメッセージを表示する必要があると述べた場合、多くの人が非常に電話を切ってしまい、メッセージボックスをまったく使用しないようにする方法について単に答えただけで、それで十分です。 。

ただし、複数化の問題は、メッセージボックスだけでなく、プログラムの他の場所のテキストにも当てはまることを覚えておいてください。たとえば、グリッドで選択された行数を表示するグリッドの横のラベルには、複数化に関して同じ問題があります。

したがって、これは基本的にプログラムから何らかの方法で出力されるほとんどのテキストに適用され、解決策は単にプログラムを変更してテキストを出力しないようにするほど単純ではありません:)


6
@ 0xA3:すべての言語が「アイテム」のように簡単に表現できる複数形を持っているかどうかは本当にわかりません。
イェンス

5
ローカリゼーションについても考えるべきでしょう。この問題はさらに悪化する可能性があります。
Alex Brown

4
@イェンス:彼らは通常、そうしません。一部の言語では、性別に応じて、たとえば2から4の場合は5の無限大とは異なる複数形を使用します。「自然言語:ローカリゼーションの狂気!お近くのコンピューターがすぐに登場!」
Piskvorが

29
IMO、プログラマーが悪い複数形ほどユーザーに怠惰に見えることはありません。
グレッグ

4
@Øyvind:編集用に+1。ここの「回答者」の多くは、正しいソリューションを提供するのではなく、質問が間違っていることを証明することに専念しているようです。可能であれば、アンチソリューション。
mwolfe02 2010年

回答:


53

どんなに小さなことでも、このアプリを他の言語に翻訳する必要がある可能性がある場合は、どちらも間違っています。これを行う正しい方法は次のとおりです。

string message = ( noofitemsselected==1 ?
  "You have selected " + noofitemsselected + " item. Are you sure you want to delete it?":
  "You have selected " + noofitemsselected + " items. Are you sure you want to delete them?"
);

これは、言語が異なれば複数の扱いが異なるためです。マレー語のようないくつかは、構文の複数形さえ持っていないので、文字列は一般的に同一です。2つの文字列を分離すると、後で他の言語をサポートしやすくなります。

それ以外の場合、このアプリが一般大衆によって使用されることを意図していて、ユーザーフレンドリーであることが想定されている場合は、2番目の方法が推奨されます。申し訳ありませんが、これを行うためのより短い方法は本当にわかりません。

このアプリが社内でのみ使用されることを意図している場合は、近道を行います"item(s)"。企業向けのコードを書くとき、あなたは本当に誰かを感心させる必要はありません。しかし、これはプログラマーが怠惰であり、したがってアプリの品質についての彼らの意見を下げるという印象を与えるため、一般に消費されているアプリに対してこれを行うことはお勧めしません。信頼してください、このような小さなこと。


35
私はその前提に同意しますが、あなたは2度を超える複数の言語を無視しています。(ロシア語を例に取ります。1、<5、または> = 5であるかどうかに応じて、3つの異なる言い方をします。それは、あなたが話している内容によって異なります)。基本的には、3項演算子だけでなく、より強力な条件ステートメントが必要だと言っています。
10

4
noofitemsselectedこの例では、最初のオプションを最適化することもできます。あなたはそれが1であることを知っているので
デフォルトの

16
その間、ヘブライ語には1、2、3-10、11 +のさまざまな複数性があります。
Joel Spolsky

3
@ジョエル、ヘブライ語はその多くの異なる複数を持つことができますか?לאידעתי(知りませんでした)!現代ヘブライ語は複数形が行く限り、英語のようなものです(にもかかわらず、古代ヘブライ語でも二重のフォームを持っていた。)
ケン・ブルーム

3
英語では、ゼロは複数のように扱われます(0アイテム、2アイテム)。ヘブライ語、ロシア語、ルーマニア語でゼロはどうなりますか?範囲を特定する簡単な方法はありますか?情報は言語ごとに決定する必要があると思います。そのため、メッセージファイルに基づくシステムでは、メッセージのセット内のさまざまな量の複数を処理する必要があります。痛い!翻訳の設定も難しいので、言語ごとに異なる数のメッセージが必要です。
Jonathan Leffler、2010年

94

メッセージを表示せずにアイテムを削除し、ユーザーに非常に優れた取り消し機能を提供することで、この厄介な複数をすべて回避できます。ユーザーは何も読まない優れた元に戻す機能を構築する必要がありますとにかく、プログラムの一部としてをあります。

包括的な取り消し機能を作成すると、実際には2つのメリットがあります。最初の利点は、ユーザーが間違いを元に戻し、読書を最小限に抑えることができるため、ユーザーの生活を楽にします。2番目の利点は、重要なワークフロー(単なるミスではない)の逆転を可能にすることで、アプリが実際の生活を反映していることです。

以前は、単一のダイアログや確認メッセージを使用せずにアプリを作成しました。真剣に考える必要があり、確認タイプのメッセージを使用するよりも実装が非常に困難でした。しかし、最終結果は、そのエンドユーザーに応じて使用するのがかなり良かったです。


12
どういうわけか、私はこれに同意し、賛成票を投じるべきだと本当に感じています。
コーディグレイ

4
@Øyvind、ここに理由があります。ユーザーに確認を求めるメッセージは、特にユーザーがダイアログに応答するまですべて停止するモーダルダイアログボックスの形式で表示される場合、ユーザーにとってコストがかかります。これは多くのユーザーを困らせ、ダイアログボックスを通過するためにボタンをクリックするだけです(次、次、次にクリックしたインストーラーの数は)。その結果、ソフト削除を実行して元に戻す機能を提供するだけの場合は、より安全になり、ユーザーの摩擦がはるかに少なくなります。Gmailではこの手法を使用して効果を上げています。
Robert Harvey

5
議論の余地がありますが、いずれにせよ、削除の確認メッセージ以外の場合にも同じ問題が発生するため、この回答は質問の正接です。
2010年

50
私はそれを読まずに賛成しました。後でいつでも元に戻すことができます
Steven A. Lowe

6
@ロバート・ハーヴェイ:おそらく外傷的ですが、何年も前に、ロータスがMac用のLotus Notesを4万台出荷し、6万台が返却されたことを読んだ。インターフェースが非常に悪かったため、海賊版を作成した人でさえそれを送り返しました。
ダンカン

39

どうですか:

string message = "Are you sure you want to delete " + noofitemsselected + " item(s)?"

そうすることで、数の合意の問題を解消し、ボーナスとして、ユーザーにとってさらに短く、より的確なエラーメッセージが表示されるようになります。ユーザーはとにかくエラーメッセージを読んでいないことは誰もが知っています。それらが短いほど、彼らは少なくとも一見する可能性が高くなりますテキストをます。

または、ユーザーがエラーメッセージを読まないというこの知識を武器に、別の方法でこれに取り組むことができます。確認メッセージをすべてスキップし、何が削除されたかに関係なく、Just Worksの取り消し機能を提供します。ほとんどのユーザーは、自分がやりたいことではないことに気づいたときに操作を元に戻すことに慣れており、この動作は別の迷惑なポップアップを処理する必要があるよりも自然だと思われます。


1
いい答えだ。ただし、このケースでは、多くの場合にエラーメッセージを提供することが顧客から要求されました。なぜなら、それが最善のアプローチであると感じたからです。しかし、テキストを変更すると、少なくとも問題が最小限に抑えられ、煩雑さが軽減されます。
ØyvindBråthen

@Øyvind:十分に公正です。あなたは顧客をフォローする必要があるので、私が提案した最初のアプローチを取るか、ハンドラー関数を含むResourcesファイルを使用します。簡単に忘れられるので、代替案を指摘する価値があると思いました。ヘック、私は最初の応答を提出するまでそれを考えさえしませんでした。
コーディグレイ

代替案は大歓迎です。私もそれに+1を与えた理由です:)
ØyvindBråthen

1
+1は、解決できない問題を解決しようとしないことを意味します。そして、スティーブクルーグの法則を覚えておいてください。単語の半分を削除してください。その後、もう一度やり直してください。使用:「{x}個のアイテムを削除しますか?」
Serge Wautier、2011

20

Javaが何年もの間持ってきたjava.text.MessageFormatとChoiceFormatはどうですか?詳細については、http://download.oracle.com/javase/1.4.2/docs/api/java/text/MessageFormat.htmlを参照してください。

MessageFormat form = new MessageFormat("The disk \"{1}\" contains {0}.");
form.applyPattern(
   "There {0,choice,0#are no files|1#is one file|1<are {0,number,integer} files}.");

Object[] testArgs = {new Long(12373), "MyDisk"};

System.out.println(form.format(testArgs));

// output, with different testArgs
output: The disk "MyDisk" are no files.
output: The disk "MyDisk" is one file.
output: The disk "MyDisk" are 1,273 files.

あなたの場合、あなたは何かもっと単純なものを望みます:

MessageFormat form = new MessageFormat("Are you sure you want to delete {0,choice,1#one item,1<{0,number.integer} files}?");

このアプローチの利点は、i18nバンドルでうまく機能し、複数形または単数形の単語の概念がない言語(日本語など)に適切に翻訳を提供できることです。


1
このアプローチは複数を処理するのに適していますが、残念ながら性別は処理しません。削除できるものの種類ごとに異なる文字列が必要です。
Shiny and New安宇

名詞がわかっている場合は、適切な形容詞で機能するように文を作成できます。しかし、はい、古典ギリシャ語を勉強したので、男性、女性、または中性名詞(形容詞は変更する名詞の形をとる)に基づいて異なる形の単語があり、形は文の機能に基づいて異なります(件名、オブジェクトなど)。私たちは常に、ある解決策が機能し、別の解決策が機能しない場合を考え出すことができます。これは、Javaの人々が問題を解決しようとした方法です。メッセージ形式の作成方法には、まだ注意が必要です。
Berin Loritsch 2010年

Javaソリューションには常に2つの整数を入力できます。2番目の整数は性別を示します。(しかし、実際には、異なるオブジェクトをメッセージにフィッティングするユースケースは、同じオブジェクトの異なる数をメッセージにフィッティングするよりも頻度が低いため、性別の合意は通常、それほど問題ではありません)
Ken Bloom

12

メッセージをハードコーディングするのではなく、別のリソースファイルで2つのメッセージを提供します。お気に入り

string DELETE_SINGLE = "You have selected {0} item. Are you sure you want to delete it?";
string DELETE_MULTI = "You have selected {0} items. Are you sure you want to delete them?";

そして、それらをString.Formatにフィードします

if(noofitemsselected == 1)
    messageTemplate = MessageResources.DELETE_SINGLE;
else
    messageTemplate = MessageResources.DELETE_MULTI;

string message = String.Format(messageTemplate, noofitemsselected)

このアプローチはローカライズと維持がより簡単だと思います。すべてのUIメッセージは単一の場所にあります。


+1、私はこのアプローチが好きです。ただし、同等のリソース名を追跡する必要があります。
デフォルトの

11

メッセージの言い回しを変えることで、問題を完全に回避できます。

string message = "The number of selected items is " + noofitemsselected + ". Are you sure you want to delete everything in this selection?";

10

私が最初に提案することは、次のとおりstring.Formatです。これにより、次のようなことが可能になります。

int numOfItems = GetNumOfItems();
string msgTemplate;
msgTemplate = numOfItems == 1 ? "You selected only {0} item." : "Wow, you selected {0} items!";
string msg = string.Format(msgTemplate, numOfItems);

さらに、WPFアプリでは、リソース文字列がパイプで区切られて、1つのメッセージと複数のメッセージ(またはゼロ/単一/多数のメッセージ)の2つのメッセージを持つシステムが表示されました。次に、カスタムコンバーターを使用して、このリソースを解析し、関連する(フォーマットされた)文字列を使用することができるため、Xamlは次のようになります。

<TextBlock Text="{Binding numOfItems, Converter={StaticResource c:NumericMessageFormatter}, ConverterParameter={StaticResource s:SuitableMessageTemplate}}" />

7

英語については、上記の答えがたくさんあります。他の言語では、複数形は名詞の性別と語尾に依存するため、より困難です。フランス語の例:

通常の男性:

Vous avez choisi 1 compte. Voulez-vous vraiment le supprimer.
Vous avez choisi 2 comptes. Voulez-vous vraiment les supprimer.

レギュラーフェミニン

Vous avez choisi 1 table. Voulez-vous vraiment la supprimer.
Vous avez choisi 2 tables. Voulez-vous vraiment les supprimer.

不規則な男性( 's'で終わる)

Vous avez choisi 1 pays. Voulez-vous vraiment le supprimer.
Vous avez choisi 2 pays. Voulez-vous vraiment les supprimer?

同じ問題がほとんどのラテン語に存在し、3つの性別(マクリン、フェミニン、中性)があるドイツ語またはロシア語ではさらに悪化します。

あなたの目的が英語以上のものを扱うことであるならば、あなたは注意を払う必要があります。


少なくとも私の場合、これは本当に問題ではありません。数字を挿入するテキストごとに、文字列を生成するときに名詞が何であるかがわかります。しかし、私が同意するより一般的な解決策を作成するには、それを「すべての」言語で機能させることは、不可能ではないにしても、非常に困難な作業になる可能性があります。
ØyvindBråthen

1
または、使用する名詞の複数形が数によって異なるポーランド語を使用してください!:/
UpTheCreek

5

適切にローカライズできる複数のメッセージを使用できるようにするには、最初に番号とメッセージの間に間接層を作成するのが賢明だと私は考えています。

たとえば、ある種の定数を使用して、表示するメッセージを指定します。実装の詳細を隠す関数を使用してメッセージをフェッチします。

get_message(DELETE_WARNING, quantity)

次に、考えられるメッセージとバリエーションを保持するディクショナリーを作成し、バリエーションを使用するタイミングを知らせます。

DELETE_WARNING = {
   1: 'Are you sure you want to delete %s item',
   >1: 'Are you sure you want to delete %s items'
   >5: 'My language has special plural above five, do you wish to delete it?'
}

これで、に対応するキーを簡単に見つけることができました quantityその値を補間quantityそのメッセージでのます。

この単純化された素朴な例ですが、これを行う他の正気な方法は実際には見られず、L10NとI18Nに対して適切なサポートを提供することはできません。


5

以下の関数をVBAからC#に変換する必要がありますが、使用方法は次のように変わります。

int noofitemsselected = SomeFunction();
string message = Pluralize("You have selected # item[s]. Are you sure you want to delete [it/them]?", noofitemsselected);

MS Accessで使用しているVBA関数を使用して、あなたが話していることを正確に実行します。私はVBAを投稿するためにハッキングされることを知っていますが、とにかくここに行きます。アルゴリズムはコメントから明らかです:

'---------------------------------------------------------------------------------------'
' Procedure : Pluralize'
' Purpose   : Formats an English phrase to make verbs agree in number.'
' Usage     : Msg = "There [is/are] # record[s].  [It/They] consist[s/] of # part[y/ies] each."'
'             Pluralize(Msg, 1) --> "There is 1 record.  It consists of 1 party each."'
'             Pluralize(Msg, 6) --> "There are 6 records.  They consist of 6 parties each."'
'---------------------------------------------------------------------------------------'
''
Function Pluralize(Text As String, Num As Variant, Optional NumToken As String = "#")
Const OpeningBracket = "\["
Const ClosingBracket = "\]"
Const DividingSlash = "/"
Const CharGroup = "([^\]]*)"  'Group of 0 or more characters not equal to closing bracket'
Dim IsPlural As Boolean, Msg As String, Pattern As String

    On Error GoTo Err_Pluralize

    If IsNumeric(Num) Then
        IsPlural = (Num <> 1)
    End If

    Msg = Text

    'Replace the number token with the actual number'
    Msg = Replace(Msg, NumToken, Num)

    'Replace [y/ies] style references'
    Pattern = OpeningBracket & CharGroup & DividingSlash & CharGroup & ClosingBracket
    Msg = RegExReplace(Pattern, Msg, "$" & IIf(IsPlural, 2, 1))

    'Replace [s] style references'
    Pattern = OpeningBracket & CharGroup & ClosingBracket
    Msg = RegExReplace(Pattern, Msg, IIf(IsPlural, "$1", ""))

    'Return the modified message'    
    Pluralize = Msg
End Function

Function RegExReplace(SearchPattern As String, _
                      TextToSearch As String, _
                      ReplacePattern As String) As String
Dim RE As Object

    Set RE = CreateObject("vbscript.regexp")
    With RE
        .MultiLine = False
        .Global = True
        .IgnoreCase = False
        .Pattern = SearchPattern
    End With

    RegExReplace = RE.Replace(TextToSearch, ReplacePattern)
End Function

上記のコードのコメントで使用法が少し途切れたので、ここで繰り返します。

Msg = "There [is/are] # record[s]. [It/They] consist[s/] of # part[y/ies] each."

Pluralize(Msg, 1) --> "There is 1 record.  It consists of 1 party each."
Pluralize(Msg, 6) --> "There are 6 records.  They consist of 6 parties each."

はい、このソリューションは英語以外の言語を無視します。それが重要かどうかは、要件によって異なります。


4

複数を自動的に生成できます。例を参照してください。複数発電機

複数の生成ルールについては、ウィキペディアを参照してください

string msg = "Do you want to delete " + numItems + GetPlural(" item", numItems) + "?";

アプリケーションが国際化されていない場合は、この方法を使用します。プーラライズすると、より洗練されたアプリケーションになります。
cspolton 2010年

1
これを国際化するのは非常に難しく、英語で失敗することがよくあります。たとえば、「注文があります+ numMice + GetPlural( "マウス"、numMice)」
James Anderson

@James Anderson:さて、文法的にはこれが最良の例ではありません;-) GetPuralメソッドを使用することが唯一許可されているメソッドであるという考えの罠に陥らないでください。
cspolton 2010年

いくつかのコーナーケースを処理するためのいくつかの関数と組み合わせて、これは非常に良い解決策だと思いますが、短くはありません。
lalli 2010年

4

より一般的な方法はどうでしょうか。2番目の文での複数形化を避けます。

削除する選択されたアイテムの数:noofitemsselected。
本気ですか?

このようにすると、行の最後に番号が表示され、簡単に見つけられることがわかります。このソリューションは、どの言語でも同じロジックで機能します。


「削除する選択項目:」とは言えませんが、文章は名前のリストを示していますが、番号が出力されています。「削除するアイテムの数:」に変更しても「アイテム」はやっかいです。
lalli 2010年

@lalli:はい、言い回しは完璧ではありません。また、提供されているソリューションはどれも完璧に聞こえません。ラベルや値などの形にすることをお勧めします。あなたは追加について正しいですNumber(私は私の赤ちゃんを寝かせながら答えていました)。
Danosaure、2010年

4

私の一般的なアプローチは、次のような「単一または複数の関数」を書くことです。

public static string noun(int n, string single, string plural)
{
  if (n==1)
    return single;
  else
    return plural;
}

次に、メッセージの本文でこの関数を呼び出します。

string message="Congratulations! You have won "+n+" "+noun(n, "foobar", "foobars")+"!";

これは完全に良くなるわけではありませんが、少なくとも、(a)関数に決定を入れるため、コードが少し整理されており、(b)不規則な複数形を処理するのに十分な柔軟性があります。つまり、名詞(n、 "child"、 "children")などを言うのは簡単です。

もちろん、これは英語でのみ機能しますが、概念は、より複雑なエンディングを持つ言語に容易に拡張できます。

簡単なケースでは、最後のパラメーターをオプションにすることができます。

public static string noun(int n, string single, string plural=null)
{
  if (n==1)
    return single;
  else if (plural==null)
    return single+"s";
  else
    return plural;
}

1
名詞を複数形にするためにsを追加するデフォルトの操作の場合に、デフォルト値を使用してコードを「整頓」する最後の部分が好きです。
ØyvindBråthen

4

国際化

私はあなたが国際化サポートを望んでいると思います、その場合、異なる言語は複数形のための異なるパターンを持っています(例えば、2つの何かのための特別な複数形、またはポーランド語のようなより複雑な言語)、そしてあなたは文字列にいくつかの単純なパターンを適用することに頼ることはできませんそれを修正します。

GNU Gettextのngettext関数を使用して、ソースコードで2つの英語メッセージを提供できます。Gettextは、他の言語に翻訳されたときに、他の(場合によってはさらに多くの)メッセージから選択するためのインフラストラクチャを提供します。http://www.gnu.org/software/hello/manual/gettext/Plural-forms.htmlを参照してくださいGNU gettextの複数サポートの詳細については、を。

GNU GettextはLGPLの下にあります。GettextのC#ポートでngettext名前が付けられGettextResourceManager.GetPluralStringています。

(ローカライズのサポートが不要で、すぐにGettextを使用したくない場合は、これを英語で実行する独自の関数を作成し、2つの完全なメッセージをそれに渡します。このように、後でl10nが必要な場合は、単一の関数を書き換えて追加します。)


3

のような関数を書いてみませんか

string GetOutputMessage(int count, string oneItemMsg, string multiItemMsg)
{
 return string.Format("{0} {1}", count, count > 1 ? multiItemMsg : oneItemMsg);
}

..必要なときにいつでも使用できますか?

string message = "You have selected " + GetOutputMessage(noofitemsselected,"item","items") + ". Are you sure you want to delete it/them?";

3
あなたはそれについてあなたは
笑い

この関数には、文全体に対して2つのメッセージを渡すだけです。
ケンブルーム

ほんの一例です。全文を送信するバリアントの方が正しいことに気づきました。
Pavel Morshenyuk、2010年

3

最初の問題のために、私は複数形を意味し、あなたが使用することができインフレクタを

2番目の例では、ToPronounStringなどの名前を持つ文字列表現拡張機能を使用できます。


3

私は昨日、チームのメンバーからまったく同じ質問を受けました。

それがここStackOverflowで再び登場したので、私は宇宙が私にまともな解決策を生み出すことにバッシュを持つように言っていると考えました。

私はすぐに何かをまとめましたが、決して完璧ではありません。

このコードは、3つのメッセージがある可能性があるという考えに基づいています。1つはゼロのアイテム、1つは1つのアイテム、および1つは複数のアイテムで、次の構造に従います。

singlePropertyName
singlePropertyName_Zero
singlePropertyName_Plural

リソースクラスを模倣するためにテストする内部クラスを作成しました。実際のリソースファイルを使用してこれをまだテストしていないため、完全な結果はまだわかりません。

ここにコードがあります(現在、いくつかのジェネリックを含めましたが、3番目のパラメータを単純にタイプとして指定でき、2番目のパラメータは文字列ですが、これら2つのパラメータを組み合わせてより良いものにする方法があると思いますが、暇なときに戻ってきます。

    public static string GetMessage<T>(int count, string resourceSingularName, T resourceType) where T : Type
{
    var resourcePluralName = resourceSingularName + "_Plural";
    var resourceZeroName = resourceSingularName + "_Zero";
    string resource = string.Empty;
    if(count == 0)
    {
        resource = resourceZeroName;
    }
    else{
        resource = (count <= 1)? resourceSingularName : resourcePluralName;
    }
    var x = resourceType.GetProperty(resource).GetValue(Activator.CreateInstance(resourceType),null);

    return x.ToString();
}

テストリソースクラス:

internal class TestMessenger
{
    public string Tester{get{
    return "Hello World of one";}}
    public string Tester_Zero{get{
    return "Hello no world";}}
    public string Tester_Plural{get{
    return "Hello Worlds";}}
}

そして私の迅速な実行方法

void Main()
{
    var message = GetMessage(56, "Tester",typeof(TestMessenger));
    message.Dump();
}

これを本当に完全にしたい場合は、メッセージを追加しsinglePropertyName_Allて、それをさらに明確にする必要があります。
Danosaure 2010年

2

私の観点からは、最初のソリューションが最も適しています。つまり、アプリケーションで複数の言語をサポートする必要がある場合、2番目のオプションは骨の折れる作業になる可能性があります。最初のアプローチでは、それほど努力することなくテキストをローカライズするのは簡単です。


2

「選択したアイテムを削除してもよろしいですか?」のような、より一般的なメッセージを表示できます。


3
これは確かに機能しますが、削除される項目の数を一目で示すという質問者のアイデアは良いものだと思います。2回以上、デスクトップからファイルを削除しようとしましたが、誤って1つ以上のファイルを削除しました。
コーディグレイ

2

私はあなたがしたいメッセージがどれほど素晴らしいかによります。最も簡単なものから最も難しいものまで:

  1. エラーメッセージを書き直して、複数形にならないようにします。ユーザーにとってはそれほど良くありませんが、高速です。

  2. より一般的な言語を使用しますが、数字も含めます。

  3. 「pluralization」とインフレクターシステムala Railsを使用して、と言うことができpluralize(5,'bunch')ます5 bunches。Railsにはこれに適したパターンがあります。

  4. 国際化のためには、Javaが提供するものを調べる必要があります。これは、2つまたは3つのアイテムを含む形容詞の形が異なる言語を含む、さまざまな言語をサポートします。「s」ソリューションは、非常に英語中心です。

どのオプションを選択するかは、製品の目標によって異なります。-ndp


2

ユーザーが実際に理解できるメッセージを提示したいのはなぜですか?40年のプログラミングの歴史に逆行します。いいえ、わかりましたわかりやすいメッセージでそれを台無しにしないでください。


(j / k)


+1:ここにもユーモアがいくつかあります。しかし、冗談を言っているとしても、私はあなたの根本的なポイントを理解しています。長年の間に作成された多くのプログラムには、非常に悪いメッセージがあります。通常、彼らは通常のユーザーがとにかく理解するための技術的な方法を得るからです。
ØyvindBråthen

いい視点ね。「ユーザー入力のエラー494-B」などのメッセージが表示されたときは、いつも気に入っています。これにより、人生の面白さを増す、何が悪いのかについての小さな謎が追加されます。最近、「パスワードがセキュリティ要件を満たしていません」という単純なパスワードを作成しようとしてエラーが発生しました。私が満たしていない要件だけのヒントはありません。パスワードに大文字と小文字の両方といくつかの数字が含まれていました。キャラクターを追加してみました。まだ違います。キャラクターを削除するとようやくパスしました。同じキャラクターを2回続けてはいけないというルールがあったと思います。
ジェイ



0

私が言及していないアプローチの1つは、置換/選択タグを使用することです(たとえば、「{0}を潰そうとしています{0} [?i({0} = 1):/ cactus / cacti /]」。 (つまり、フォーマットのような式で、引数のゼロ(整数とする)が1に等しいかどうかに基づいて置換を指定します。このようなタグが.netの前の日に使用されたのを見たことがあります。 .netでの標準、またはそれらをフォーマットするための最良の方法を知りません。


0

私は1分間箱から出して考えると思いますが、ここでの提案はすべて複数形化(および複数のレベル化、性別などを心配)するか、まったく使用せずに元に戻すのに便利です。

私は非言語的な方法で移動し、そのためにビジュアルキューを使用します。たとえば、指で拭いてアイテムを選択するIphoneアプリを想像してください。マスター削除ボタンを使用してそれらを削除する前に、選択したアイテムを「シェイク」し、V(OK)またはX(キャンセル)ボタンの付いたボックスにタイトル付きの疑問符を表示します...

または、Kinekt / Move / Wiiの3Dの世界で、ファイルを選択し、手を削除ボタンに移動し、確認のために手を頭の上に移動するように指示されたら(前に述べたのと同じビジュアルシンボルを使用します。たとえば、代わりに3つのファイルを削除するように要求しますか?半透明の赤いXがホバリングしている3つのファイルが表示され、確認のために何かするように指示されます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.