Plurality in user messages

前端 未结 25 1516
没有蜡笔的小新
没有蜡笔的小新 2021-01-30 01:53

Many times, when generating messages to show to the user, the message will contain a number of something that I want to inform the customer about.

I\'ll give a

25条回答
  •  孤城傲影
    2021-01-30 02:48

    I had this exact same question posed to me yesterday by a member of our team.

    Since it came up again here on StackOverflow I figured the universe was telling me to have a bash at producing a decent solution.

    I've quickly put something together and it's by no means perfect however it might be of use or spark some discussion/development.

    This code is based on the idea that there can be 3 messages. One for zero items, one for one item and one for more than one item which follow the following structure:

    singlePropertyName
    singlePropertyName_Zero
    singlePropertyName_Plural

    I've created an internal class to test with in order to mimick the resource class. I haven't tested this using an actual resource file yet so I'm yet to see the full result.

    Here's the code (currently i've included some generics where I know I could have specified the third param simply as a Type and also the second param is a string, I think there's a way to combine these two parameters into something better but I'll come back to that when I have a spare moment.

        public static string GetMessage(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();
    }
    

    Test resource class:

    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";}}
    }
    

    and my quick executing method

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

提交回复
热议问题