[c#] 사용자 메시지의 복수

사용자에게 표시하는 메시지를 생성 할 때 많은 시간, 메시지의 번호가 포함됩니다 뭔가를 내가 대해 고객에게 통보 할 것이다.

예를 들어 보겠습니다. 고객이 1 개 이상에서 여러 항목을 선택하고 삭제를 클릭했습니다. 이제 고객에게 확인 메시지를 전하고 싶은데, 그가 선택한 항목의 수를 언급하여 여러 항목을 선택하고 항목 중 하나만 삭제하고 싶을 때 삭제를 클릭하여 실수 할 가능성을 최소화하고 싶습니다. 그들.

한 가지 방법은 다음과 같은 일반 메시지를 만드는 것입니다.

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

은 “문제는”여기의 경우 noofitemselected1, 우리는 쓰기에이 항목 대신 항목그들 .

내 정상적인 해결책은 다음과 같습니다.

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

코드 내부에 숫자에 대한 참조가 많고 실제 메시지를 읽기가 어려워지면 이것은 매우 길고 매우 끔찍해집니다.

그래서 제 질문은 간단합니다. 이와 같은 메시지를 생성하는 더 좋은 방법이 있습니까?

편집하다

메시지 상자 안에 메시지를 표시해야한다고 언급하고 메시지 상자 사용을 아예 피하는 방법에 대한 답변을 제공 한 경우에 많은 사람들이 매우 전화를 끊는 것을 보았습니다. .

그러나 복수화의 문제는 메시지 상자 외에 프로그램의 다른 위치에도 적용된다는 점을 기억하십시오. 예를 들어, 그리드에서 선택된 라인 수를 표시하는 그리드 옆의 레이블은 복수화와 관련하여 동일한 문제를 갖습니다.

따라서 이것은 기본적으로 프로그램에서 어떤 방식 으로든 출력되는 대부분의 텍스트에 적용되며 솔루션은 더 이상 텍스트를 출력하지 않도록 프로그램을 변경하는 것만 큼 간단하지 않습니다. 🙂



답변

아무리 작더라도이 앱을 다른 언어로 번역해야 할 가능성이 있다면 둘 다 잘못된 것입니다. 이를 수행하는 올바른 방법은 다음과 같습니다.

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)". 진취적인 코드를 작성할 때 누구에게도 깊은 인상을 줄 필요는 없습니다. 그러나 이것은 프로그래머가 게으르다는 인상을 주므로 앱의 품질에 대한 의견을 낮추기 때문에 공개적으로 사용되는 앱에 대해이 작업을 수행하지 않는 것이 좋습니다. 저를 믿으세요,이 문제와 같은 작은 것들.


답변

메시지없이 항목을 삭제하고 사용자에게 정말 좋은 실행 취소 기능을 제공함으로써이 모든 복잡한 복수를 피할 수 있습니다. 사용자는 아무것도 읽지 않습니다 . 당신은 좋은 취소 설비를 구축해야한다 어쨌든 프로그램의 일환으로.

포괄적 인 실행 취소 기능을 만들면 실제로 두 가지 이점이 있습니다. 첫 번째 이점은 사용자가 실수를 되돌리고 읽기를 최소화 할 수 있도록하여 사용자의 삶을 편하게합니다. 두 번째 이점은 앱이 실수뿐만 아니라 사소하지 않은 워크 플로의 반전을 허용하여 실제 생활을 반영한다는 것입니다.

한 번은 단일 대화 상자 나 확인 메시지를 사용하지 않고 앱을 작성했습니다. 심각한 생각이 필요했고 확인 유형 메시지를 사용하는 것보다 구현하기가 훨씬 더 어려웠습니다. 그러나 최종 결과는 최종 사용자에 따라 사용하기에 다소 좋았습니다.


답변

그냥 어때 :

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

이렇게하면 번호 동의 문제가 제거되고 사용자에게 더 짧고 정확한 오류 메시지가 추가로 표시됩니다. 우리 모두는 사용자가 어쨌든 오류 메시지를 읽지 않는다는 것을 알고 있습니다. 길이가 짧을수록 적어도 텍스트를 한 가능성이 높아 집니다.

또는 사용자가 오류 메시지를 읽지 않는다는 지식으로 무장하면 다른 방식으로 접근 할 수 있습니다. 확인 메시지를 모두 건너 뛰고 삭제 된 항목에 관계없이 Just Works라는 실행 취소 기능을 제공하십시오. 대부분의 사용자는 이미 원하는 작업이 아니라는 것을 알았을 때 작업을 실행 취소하는 데 익숙하며 다른 성가신 팝업을 처리하는 것보다이 동작이 더 자연 스럽습니다.


답변

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 번들과 잘 작동하고 복수 또는 단수 단어 개념이없는 언어 (예 : 일본어)에 대해 적절하게 번역을 제공 할 수 있다는 것입니다.


답변

메시지를 하드 코딩하지 않고 별도의 리소스 파일에 두 개의 메시지를 제공합니다. 처럼

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 메시지는 단일 위치에 있습니다.


답변

메시지를 다르게 표현하여 문제를 완전히 회피 할 수 있습니다.

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


답변

내가 제안하고 싶은 첫 번째 것은 : use 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 앱에서 리소스 문자열이 파이프로 구분되어 단수 및 복수 메시지 (또는 0 / 단일 / 다수 메시지)를 포함하는 시스템을 보았습니다. 그런 다음 사용자 지정 변환기를 사용하여이 리소스를 구문 분석하고 관련 (서식이 지정된) 문자열을 사용할 수 있으므로 Xaml은 다음과 같습니다.

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