用户消息中的多个


106

很多时候,当生成要显示给用户的消息时,消息将包含一些我想通知客户的信息。

我举一个例子:客户从1到向上选择了许多项目,并单击了删除。现在,我想给客户一个确认消息,我想提及他选择的项目数量,以通过选择一堆项目并在他只想删除其中一个项目时单击“删除”来最大程度地减少犯错的可能性。他们。

一种方法是使通用消息如下所示:

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

这里的“问题” noofitemselected是1 的情况,我们必须写itemit而不是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:我真的不知道每种语言是否都有像“项目”一样容易表达的多元化。
Jens

5
您可能也应该考虑本地化。这个问题可能会变得更糟。
亚历克斯·布朗

4
@Jens:他们通常不这样做,至少是最方便的方式。例如,某些语言对2-4的复数与对5无限的复数不同,所有这些取决于性别。“自然语言:疯狂的本地化!很快就会出现在您附近的计算机上!”
Piskvor于

29
IMO,没有什么比不好的多元化让程序员对用户更懒惰了。
格雷格

4
@Øyvind:为您的+1。似乎这里的许多“答案”都是为了证明您的问题是错误的,而不是提供正确的解决方案。反解决方案,如果您愿意的话。
mwolfe02 '02

Answers:


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?"
);

这是因为不同的语言对多种语言的处理方式不同。有些像马来语的人甚至没有语法上的复数形式,因此字符串通常是相同的。分隔两个字符串可以使以后支持其他语言变得更加容易。

否则,如果该应用程序应由一般大众使用,并且应该易于使用,则第二种方法更可取。抱歉,但我真的不知道这样做的简短方法。

如果该应用程序仅供公司内部使用,请执行快捷操作"item(s)"。在编写企业代码时,您实际上不必打动任何人。但是我建议不要对公开使用的应用程序执行此操作,因为这给人的印象是程序员很懒,因此降低了他们对应用程序质量的看法。相信我,像这样的小事情。


35
尽管我同意这个前提,但是您忽略了具有两个以上度数的语言。(例如,俄语。三种不同的表达方式取决于其1,<5或> = 5,甚至取决于您在说什么)。基本上,我是说您需要一个更强大的条件语句,而不仅仅是三元运算符。
crasic

4
您甚至可以noofitemsselected在本例中优化掉第一个选项。因为您知道它是
默认值

16
当我们讨论时,希伯来语可以为1、2、3-10和11+提供不同的复数形式。
乔尔·斯波斯基

3
@Joel,希伯来语可以有那么多种不同的多元性吗?לאידעתי(我不知道)!就复数而言,现代希伯来语就像英语一样(尽管古代希伯来语也具有双重形式。)
肯·布鲁姆

3
在英语中,零被视为复数(0项,2项);希伯来语,俄语,罗马尼亚语中的值为零会发生什么?有没有一种简单的方法来确定范围?我猜想信息必须以每种语言确定,因此任何基于消息文件的系统都必须处理一组消息中不同数量的复数。哎哟! 设置翻译也很棘手-不同语言需要不同数量的消息。
乔纳森·勒夫勒

94

您可以通过删除项目而无需任何消息,并为用户提供真正的撤消功能,从而避免所有这些混乱的情况。用户从不阅读任何内容。无论如何,您都应该在程序中建立良好的撤消功能

当您创建一个全面的撤消工具时,实际上可以获得2个好处。第一个好处是允许用户扭转错误并最大程度地减少阅读,从而使用户的生活更轻松。第二个好处是,您的应用程序允许逆转非平凡的工作流(不仅仅是错误),从而反映了现实生活。

我曾经编写一个应用程序时没有使用任何对话框或确认消息。它经过了认真的思考,比使用确认类型的消息要难得多。但是最终结果根据最终用户使用起来相当不错。


12
由于某种原因,我真的觉得我同意这一点,应该对此表示赞同。
科迪·格雷

4
@Øyvind,原因如下:要求用户进行验证的消息对用户来说是昂贵的,尤其是当它们以模态对话框的形式出现时,该模态对话框会停止所有操作,直到用户回答该对话框为止。这使许多用户感到恼火,以至于他们仅单击任何按钮即可跳过对话框(您单击了下一个,下一个,下一个?多少个安装程序)。因此,如果您执行软删除并提供撤消功能,则它更安全,并且用户摩擦也小得多。Gmail使用此技术效果非常好。
罗伯特·哈维

5
这是有争议的,但是在任何情况下,除了删除消息中的确认消息以外,都会出现相同的问题,因此,此答案与该问题确实相关。
杰伊,2010年

50
我不看就投票了。我以后总是可以撤消
Steven A. Lowe,2010年

6
@罗伯特·哈维(Robert Harvey):可能是伪造的,但是许多年前,我读到Lotus已为Mac运送了40,000单位的Lotus Notes,并且退还了60,000枚。该界面非常糟糕,以至于即使是盗版者也将其发回。
邓肯

39

怎么样:

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

这样,您就消除了数字协商难题,并最终为用户提供了更短,更精确的错误消息,作为奖励。我们都知道用户还是不会阅读错误信息。它们越短,他们越有可能至少看一眼文本。

或者,基于了解用户不会阅读错误消息的知识,您可以采用其他方法来处理。完全跳过确认消息,并且仅提供一个可以正常工作的撤消功能,无论删除了什么内容。大多数用户已经习惯了在发现操作不是他们想要的操作时撤消该操作,并且可能发现此行为比不得不处理另一个令人讨厌的弹出窗口更自然。


1
好答案。但是,在这种情况下,客户要求提供许多情况下的错误消息,因为他认为这是最好的方法。但是更改文本至少可以最大程度地减少问题并减少混乱。
岛之风Bråthen如此阐述道

@Øyvind:足够公平。由于您必须跟随客户,因此我要么采用我建议的第一种方法,要么使用带有处理程序功能的Resources文件。我只是认为值得指出一个替代方案,因为它很容易被遗忘。哎呀,直到我提交第一份答复后,我才想到它。
科迪·格雷

我们欢迎其他选择。这就是为什么我也给它+1 :)
岛之风Brå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先生和新安宇

如果您知道名词,则可以对句子进行修饰以使其具有适当的形容词。但是,是的,在研究了古典希腊语之后,您基于男性,女性或中性名词使用了不同形式的单词(形容词采用其修饰的名词形式),并且其形式因其在句子中的功能而异(主题,对象等)。我们总是可以提出一种解决方案有效而另一种无效的案例。这就是Java人士试图解决该问题的方法。您仍然必须注意形成消息格式的方式。
Berin Loritsch 2010年

您始终可以向Java解决方案输入两个整数,其中第二个整数表示性别。(但实际上,性别协议通常不那么需要关注,因为将不同对象放入消息中的用例比将不同数量的同一对象放入消息中的使用频率要低)
Ken Bloom

12

我不对消息进行硬编码,而是在单独的Resource文件中提供了两条消息。喜欢

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,我喜欢这种方法。虽然,您将需要跟踪等效的资源名称。
默认值2010年

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应用程序中,我看到了将资源字符串用管道定界以包含两个消息的系统:单数和复数消息(或零/单/多消息,甚至)。然后可以使用自定义转换器来解析该资源并使用相关的(格式化的)字符串,因此您的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种性别(男性,女性和中性),这个问题也越来越严重。

如果您的目标不只是英语,还需要多加注意。


至少就我而言,这不是一个真正的问题。对于每个我要插入数字的文本,生成字符串时我都会知道名词是什么。但是,要提出一个更通用的解决方案,我同意您的观点,即使其适用于“所有”语言可能是一项非常艰巨的任务,即使并非不可能。
岛之风Bråthen如此阐述

1
或以波兰语为例,根据数量的不同,名词的复数形式会有所不同!:/
UpTheCreek 2011年

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);

我有一个VBA函数,可以在MS Access中使用它来完全按照您的意思进行操作。我知道我会因发布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

您可以自动生成复数,例如。复数生成器

有关复数生成规则,请参见Wikipedia。

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

如果应用程序未国际化,我喜欢使用此方法。上浆处理可以使抛光效果更佳。
cspolton

1
这真的很难使其国际化,并且它经常以英语失败,例如“您有订单+ numMice + GetPlural(“ mouse”,numMice)”
James Anderson

@James Anderson:现在,这不是语法上最好的例子;-)不要陷入认为使用GetPural方法是唯一可以使用的方法的陷阱。
cspolton 2010年

结合更多的功能来处理更多的极端情况,我认为这是一个很好的解决方案,虽然还不短。
lalli

4

如何使用更通用的方式。避免在第二句话中使用复数形式:

要删除的所选项目数:noofitemsselected。
你确定吗?

我发现以这种方式将数字放在行尾,这很容易发现。该解决方案可以在任何语言中使用相同的逻辑。


“选择的要删除的项目:”听起来不太正确,该句子指示名称列表,但会打印一个数字。即使更改为“要删除的项目数:”,“项目”仍然很尴尬。
lalli

@lalli:是的,措辞并不完美,所提供的解决方案都不完美。我只是建议以标签和值之类的形式放置它。您添加的内容是正确的Number(我在摇晃我的宝宝睡觉时正在回答)。
Danosaure

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以使名词复数,则使用默认值来“使代码混乱”。
岛之风Bråthen如此阐述

4

国际化

我假设您需要国际化支持,在这种情况下,不同的语言对复数使用不同的模式(例如,某种东西的特殊复数形式,或者像波兰语这样的更复杂的语言),并且您不能依赖于对字符串应用一些简单的模式要解决这个问题。

您可以使用GNU Gettext的ngettext功能,并在源代码中提供两条英语消息。当翻译成其他语言时,Gettext将提供从其他(可能更多)消息中进行选择的基础结构。有关GNU gettext的复数支持的完整说明,请参见http://www.gnu.org/software/hello/manual/gettext/Plural-forms.html

GNU Gettext在LGPL之下。在Gettext的C#端口中ngettext命名GettextResourceManager.GetPluralString

(如果您不需要本地化支持,并且不想立即使用Gettext,则编写自己的函数以英语进行此操作,并向其传递两条完整消息,这样,如果以后需要ln,则可以通过重写单个函数来添加。)


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
您没有想到,您是否大声笑,您有一个函数可以对句子进行乘法或不排序,然后在结尾处放一个“ it / them”(大声笑)
Barkermn01

您只需要向整个函数传递两个消息即可。
肯·布鲁姆

这只是一个例子。我意识到发送整个句子的变体是更正确的。
帕维尔·莫尔舍纽克

3

对于第一个问题,我的意思是Pluralize,可以使用Inflector

第二,您可以使用具有诸如ToPronounString之类的名称的字符串表示扩展。


3

昨天,我们团队的一个成员对我提出了同样的问题。

自从它再次出现在StackOverflow上以来,我认为整个宇宙都在告诉我要产生一个不错的解决方案。

我很快就将一些东西放在一起,虽然它并不是完美的,但是它可能有用,也可能引发一些讨论/发展。

该代码基于可以有3条消息的想法。一为零项,一为一项,一为多于一项,其结构如下:

singlePropertyName
singlePropertyName_Zero
singlePropertyName_Plural

我创建了一个内部类进行测试,以模仿资源类。我还没有使用实际的资源文件对此进行过测试,所以我还没有看到完整的结果。

这是代码(目前,我已经包含了一些泛型,我知道我可以将第三个参数简单地指定为Type,并且第二个参数是字符串,我认为有一种方法可以将这两个参数组合成更好的参数,但是我我有空的时候会再来的。

    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

2

从我的角度来看,您的第一个解决方案是最合适的。我之所以这样说,是为了在您需要该应用程序支持多种语言的情况下,第二种选择很麻烦。通过第一手方法,可以轻松地对文本进行本地化,而无需付出太多努力。


2

您可以输入更通用的消息,例如“确定要删除所选项目吗?”。


3
这当然是可行的,但是我认为询问者一目了然地显示即将删除的项目数的想法是一个好主意。我已经不止一次尝试从桌面删除文件,并意外删除了多个文件。
科迪·格雷

2

我取决于您希望收到的消息有多好。从最简单到最困难:

  1. 重新编写您的错误消息,以避免多元。对您的用户而言不是很好,但是更快。

  2. 使用更通用的语言,但仍包括数字。

  3. 使用“多元化”和偏转器系统ala Rails,因此您可以说出pluralize(5,'bunch')并得到5 bunches。Rails为此提供了一个很好的模式。

  4. 对于国际化,您需要查看Java提供的内容。这将支持多种语言,包括具有2或3个项目的形容词形式不同的语言。“ s”解决方案非常以英语为中心。

选择哪种选项取决于您的产品目标。-ndp


2

您为什么要呈现用户可以实际理解的信息?它有40多年的编程历史。Nooooo,我们正在做一件好事,不要以可理解的消息破坏它。


(j / k)


+1:很高兴在这里看到一些幽默。但是,即使您在开玩笑,我也明白您的基本观点。这些年来创建的许多程序都有非常糟糕的信息。通常是因为他们可以通过技术途径让普通用户理解。
岛之风Bråthen如此阐述

好点子。当收到诸如“用户输入错误494-B”这样的消息时,我总是喜欢它-它增加了关于什么是错误的神秘感,这使生活变得更加有趣。我最近在尝试创建一个简单地说“密码不符合安全要求”的密码时遇到错误。没有暗示我没有满足什么要求。我的密码包括大写和小写字母以及几个数字。我尝试添加社交角色。仍然没有。当我删除一个角色时,它终于过去了。我认为他们有一个规则,即您不能连续两次拥有相同的角色。
杰伊

2

像在《魔兽世界》中那样做:

BILLING_NAG_WARNING = "Your play time expires in %d |4minute:minutes;";

0

它会变短一点

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

0

我未曾提及的一种方法是使用替换/选择标签(例如,类似“您将要挤压{0} [?i({0} = 1):/ cactus / cacti /]”之类的方法)。 (换句话说,让一个类似格式的表达式根据参数零(取为整数)是否等于1来指定替换。)我已经在.net之前的日子里看到过这种标签;我不知道.net中的标准格式,我也不知道格式化它们的最佳方法。


0

我想开箱即用,这里的所有建议要么是进行多元化(并且担心多元性,性别等超过1个级别),要么根本不使用它,并且提供了很好的撤消。

我会采用非语言方式,并为此使用视觉队列。例如,想象一下一个Iphone应用程序,您通过擦手指来选择项目。在使用主删除按钮删除它们之前,它将“摇动”选定的项目并显示带有V(确定)或X(取消)按钮的带标题的问号框...

或者,在Kinekt / Move / Wii的3D世界中-想象选择文件,将手移到Delete按钮,然后告诉您将手移到头顶进行确认(使用与我之前提到的相同的视觉符号。例如,改为问您要删除3个文件吗?它将显示3个文件,上面有一个悬停的半透明红色X并告诉您进行确认。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.