Почему мое вложенное множественное сообщение ICU не работает в реакции-intl FormattedMessage? - PullRequest
0 голосов
/ 11 января 2020

Я использую response-intl и его тег <FormattedMessage />.

Я хочу иметь структурированное сообщение, которое выберет правильный вариант множественного числа на основе предоставленных значений, чтобы позволить переводчикам работать с правилами их язык, т. е. если они имеют разные варианты для «один», «два», «многие», элементы, и т. д. c. Я не хотел, чтобы он был жестко закодирован в бизнес-логике приложения c с помощью операторов switch, которые использовали бы только правила Engli sh для "нуля", "одного" и "другого".

<FormattedMessage id="myMessage" values={{applesCount: 4, orangesCount: 0, pearsCount: 1}} /> должен выдать I have some apples and some pears из следующего источника.

По некоторым причинам он возвращает I have some apples, some pears, and some oranges

{applesCount, plural, 
    zero {{pearsCount, plural, 
        zero {{orangesCount, plural, 
            zero {I have no fruit}
            other {I have some oranges}
        }}
        other {{orangesCount, plural, 
            zero {I have some pears}
            other {I have some pears and some oranges}
        }}
    }}
    other {{pearsCount, plural, 
        zero {{orangesCount, plural, 
            zero {I have some apples}
            other {I have some apples and some oranges}
        }}
        other {{orangesCount, plural, 
            zero {I have some apples and some pears}
            other {I have some apples, some pears, and some oranges}
        }}
    }}
}

Я проверял это с помощью https://format-message.github.io/icu-message-format-for-translators/editor.html

Кроме того, у меня есть этот код и ящик, в котором можно с ним повозиться: https://codesandbox.io/s/react-intl-formattedmessage-using-plural-x8ki5

Для справки я проверил http://userguide.icu-project.org/formatparse/messages и https://formatjs.io/guides/message-syntax/ и ожидаем, что моя структура сообщений поддерживается.

Можете ли вы помочь мне обнаружить, что не так, или как мне изменить это, чтобы оно заработало?

1 Ответ

1 голос
/ 14 января 2020

Проблема:

Engli sh, поскольку язык не имеет грамматики, специально предназначенной для нулевого числа предметов .

В основном это единственное или множественное число (в некоторых редких остаточных случаях dual ).

Синтаксис, который вы используете, специально для тех языков, где грамматика специализируется специально для нулевого числа элементов , (Примеры: арабский c и латышский)

Читать здесь: https://formatjs.io/guides/message-syntax/#plural -формат .
Кроме того, эта статья в Википедия объясняет то же самое

Таким образом, подход не будет работать для Engli sh. Вместо этого вам нужно использовать =0 (= синтаксис значения) для сопоставления количества с нулем, чтобы решение работало.

{applesCount, plural, 
    =0 {{pearsCount, plural, 
        =0 {{orangesCount, plural, 
            =0 {I have no fruit}
            other {I have some oranges}
        }}
        other {{orangesCount, plural, 
            =0 {I have some pears}
            other {I have some pears and some oranges}
        }}
    }}
    other {{pearsCount, plural, 
        =0 {{orangesCount, plural, 
            =0 {I have some apples}
            other {I have some apples and some oranges}
        }}
        other {{orangesCount, plural, 
            =0 {I have some apples and some pears}
            other {I have some apples, some pears, and some oranges}
        }}
    }}
}

Аналогично, для 1 числа one не будет работать для Engli sh. Вы должны использовать синтаксис =value (=1).
Пробовал это на песочнице и работает нормально.

Надеюсь, это поможет. Возврат для любых сомнений.

...