Вроде как комбинация ответов выше, вы можете использовать как потоки, так и дополнительные (плюс это однострочный).
private boolean findProduct(String prodName) {
return orderItems.stream()
.map(Optional::ofNullable)
.anyMatch(o -> o
.map(OrderItem::getProduct)
.map(Product::getProductName)
.map(s -> s.equals(prodName))
.isPresent());
}
Наша игра Gemsweeper была переведена на 8 различных языков. Некоторые вещи я учился во время того процесса:
, Если переводчику дают единственные предложения для перевода, удостоверьтесь, что он знает о контексте, что каждое предложение используется в. Иначе он мог бы обеспечить один возможный перевод, но не тот, который Вы имели в виду. Инструменты такой как Babelfish переводит, не понимая контекст, который является, почему результат обычно так плох. Просто попытайтесь перевести любой нетривиальный текст из английского языка немецкому языку и назад и Вы будете видеть то, что я имею в виду.
Предложения, которые должны быть переведены, не должны быть повреждены в различные части по той же причине. Поэтому необходимо поддержать контекст (см. предыдущую точку), и потому что некоторые языки могли бы иметь переменные вначале или конец предложения. Используйте заполнителей вместо того, чтобы разбить предложение. Например, вместо [1 121]
"Это - шаг" "нашего учебного руководства с 15 шагами"
Запись что-то как:
"Это - шаг %1 нашего учебного руководства с 15 шагами"
, и замените заполнителя программно.
не ожидают, что переводчик будет забавным или творческим. Он обычно не мотивируется достаточно, чтобы сделать это, если Вы не называете конкретные текстовые проходы и платите ему дополнительный. Например, если Вы имеете и шутки слова в Ваших активах языка, говорите переводчику в примечании стороны не пытаться перевести их, но пропустить их или заменить их более мрачным предложением вместо этого. Иначе переводчик, вероятно, переведет шутку пословно, которая обычно приводит к полной ерунде. В нашем случае у нас были один переводчик и один писатель шутки для самого критического перевода (английский язык).
Попытка найти переводчика, кто первый язык, является языком, он собирается перевести Ваше программное обеспечение в, не наоборот. Иначе он, вероятно, запишет текст, который мог бы быть правильным, но звучит нечетным или старомодным носителям языка. Кроме того, он должен жить в стране, для которой Вы нацелены со своим переводом. Например, немецкоязычный парень из Швейцарии не был бы хорошим выбором для немецкого перевода.
, Если кто-либо возможный, имейте одного из своих общедоступных пользователей тестирования бета-версии, который понимает, что конкретный перевод проверяет переведенные активы и завершенное программное обеспечение. у Нас были некоторые очень хорошие и очень плохие переводы, в зависимости от человека, который обеспечил его. По словам некоторых наших пользователей, шведский перевод был всем мусором, но было слишком поздно для делания с этим чего-либо.
знать, что для каждой обновленной версии с новыми возможностями необходимо будет перевести активы языков. Это может создать некоторые серьезные издержки.
знать, что конечные пользователи будут ожидать, что техническая поддержка будет говорить на их языке, если Ваше программное обеспечение будет переведено. Еще раз, Babelfish по всей вероятности не сделает.
Редактирование - еще Некоторые точки
Делают переключение между локализациями максимально легким. В Gemsweeper, у нас есть горячая клавиша для переключения между различными языками. Это делает тестирование намного легче.
, Если Вы собираетесь использовать экзотические шрифты, удостоверьтесь, что они включают специальные символы. шрифты, которые мы выбрали для Gemsweeper, были хорошо для английского текста, но мы должны были добавить довольно много символов вручную, которые только существуют на немецком, французском, Portughese, шведском языке...
не кодируют Вашу собственную платформу локализации. Вы, вероятно, очень более обеспечены с платформой с открытым исходным кодом как Gettext. Gettext поддерживает функции как переменные в предложениях или плюрализации и надежен. Локализованные ресурсы компилируются, таким образом, никто не может вмешаться в них. Плюс, можно использовать инструменты как Poedit для перевода файлов / проверка чужого перевода и удостоверяясь, что все строки правильно переводятся и все еще актуальные в случае, если Вы изменяете базовый исходный код. Я попробовал и прокрутку моего собственного и использующего Gettext вместо этого, и я должен сказать, что Gettext плюс PoEdit были выше путем.
Редактирования - Еще больше Точек
Понимает, что различные культуры имеют различные стили числовых форматов и форматов даты. Нумерации только не отличаются на культуру, но также и на цель в той культуре. В EN-США Вы могли бы отформатировать номер '-1234'; '-1 234' или (1,234) в зависимости от того, какова цель числа. Поймите, что другие культуры делают то же самое.
Знают, откуда Вы получаете свою информацию глобализации. , Например, Windows имеет настройки для CurrentCulture, UICulture и InvariantCulture. Поймите то, что каждое средство и как оно взаимодействует с Вашей системой (они не так очевидны, как Вы могли бы думать).
, Если Вы собираетесь сделать восточноазиатский перевод, действительно сделайте свою домашнюю работу. восточноазиатские языки имеют довольно много различий от языков здесь. В дополнение к наличию нескольких алфавитов, которые используются одновременно, они могут использовать различные системы расположения (нисходящие) или основанные на сетке. Также числа на восточноазиатских языках могут очень отличаться. В en-США Вы только изменяете системы для ограниченных условий (например, 1 по сравнению с 1-м), существуют дополнительные числовые соображения помимо просто запятой и период.
- Мои меню и различные списки в приложении отсортированы в алфавитном порядке для каждого языка для более легкого чтения.
списки должны быть отсортированы, меню не были должны. имейте в виду, что данный пользователь мог бы хотеть использовать Ваше приложение больше чем на одном языке, он должен все еще найти везде в том же месте.
то же с ярлыками, если у Вас есть кто-либо: не переводят их .
также, помните, что интернационализация и перевод являются двумя совсем другими вещами, управляют ими отдельно.
Когда мы работали над i18n/l10n проблемами Dreamfall и Age Conan, мы столкнулись с несколькими проблемами, которые стоит иметь в виду. Некоторые из них, которые мы решили, некоторые были решены для нас и некоторых, которые мы работали вокруг. Некоторые мы никогда не решали...
Удостоверяются, все Ваши инструменты и весь Ваш код поддерживают все наборы символов, Вы хотите использовать, и проверить то предположение дважды дважды в ходе проекта и еще несколько раз быть уверенными.
Удостоверяются, что Вы используете шрифт, который поддерживает все языки, которые Вы хотите использовать. Большинство шрифтов, которые утверждают, что были unicode, только unicode в том смысле, что символы, которые он имеет, в корректной кодовой точке. Это не означает, что это имеет применимые символы для всех кодовых точек.
Перенос текста не только сделан в пробелах, поскольку некоторые языки не делают использование пространство для разделения слов (китайский язык приходит на ум). Удостоверьтесь, что Ваши стандартные программы переноса текста обрабатывают текст без любых пробелов вообще.
множественное число Обработки правильно хитро в легких случаях и проклятое трудно в жестких чехлах. Удостоверьтесь, что Вы знаете достаточно о языках, которые Вы будете использовать, чтобы быть в состоянии написать код для обработки множественной проблемы правильно. Следует иметь в виду, что английский язык (и другие "западные" языки среди легких.
Никогда предложения повреждения и строки сборки с ними для установки переменной, поскольку переменная могла бы быть помещена в другое место в предложении на другом языке. Используйте заполнителей.
Имеют в виду, что для некоторых языков, значение заполнителя могло бы измениться, как записать предложение. Грамматика тверда. Удостоверьтесь, что у Вас есть план относительно контакта с ним. (А именно, удостоверьтесь, что у Вас есть способ классифицировать значения, которые Вы используете в заполнителях согласно полу, время, и т.д.).
Я хотел бы сделать следующие комментарии - это из некоторых инструкций компании, где продукты класса 1 переводятся в [1 113] 31 различные локали. После этих инструкций дал нам (наша группа разработчиков, а не целая компания) самую большую производительность в переводе.
не пытаются снова использовать отрывки сообщений об ошибках. Например, не думайте, что, потому что у Вас есть эти две ошибки "You selected the wrong menu item"
и "That menu item is not yet available"
, можно извлечь "menu item"
в отдельный объект и использовать его в обоих местах. Весь сообщения должны быть сам содержавшие, поскольку их переводы могут измениться на основе контекста.
Использование профессиональный переводчик хорошо осведомленный о технологии. Если Вы идете около сервиса как BabelFish, Вы собираетесь получить все, чего Вы заслуживаете. Например, "Microsoft Windows"
"Microsoft Windows"
везде на планете, это не становится "Microsoft Fenster"
в Германии.
Попытка не к встроенным переменным в [1 116] Ваши сообщения (такой как "The %1 has failed"
, где %1
изменения динамично) начиная с положений и, действительно, пол может измениться: "La table est rubbish"
по сравнению с "L'Homme est drunk"
, или "The red table"
по сравнению с [1 111]. Лучше использовать универсальное существительное с добавленными параметрами: "The item has failed [%1]"
.
Только переводят вещи, которые пользователь ожидается к [1 117], посмотрите. Журнал обменивается сообщениями в файле журнала (что только Вы будете использовать), должен быть на английском языке (или Ваш родной язык), не переведен во что-то как суахили, которого Вы не могли читать так или иначе.
Меню должны быть отсортированы по функциональности, не сопоставив порядок.
Переводимые единицы должны быть сохранены внешний к коду и загружены в во времени выполнения. Это делает перевод проблемой из просто отправки внешнего файла, не пробуя к изменениям рожка для обуви в середину кода. Это также делает добавление других языков легче в будущем.
Это достаточно на данный момент. Лучше для остановки перед отключением:-)
Вещь о числах: на английском языке, как я понимаю, Вы просто используете исключительное с 1 и множественное число с 2 или больше. Как: “You имеют 1 message”; “2 messages”; “3... messages”. На русском языке эти вещи становятся более сложными. Вы используете исключительный для 1, 21, 31, 41... 101, 121 (так, для всего заканчивающегося 1 кроме тех случаев, когда это заканчивается 11). Тогда Вы используете исключительный родительный падеж для 2, 3, 4; 22, 23, 24; 32, 33, 34... 102, 103, 104; 122, 123, 124. И во всех других случаях Вы используете множественный родительный падеж .
It’s не действительно трудно для реализации. Что является твердо, хотя должен реализовать что-то, что будет знать, как иметь дело с любым априорным неизвестным языком со всей его странностью:-)
И that’s просто числа:-)
Я не имею много для добавления к большим ответам до сих пор, но здесь являюсь несколькими вещами рассмотреть и проверить.
Хорошо, я имел больше для высказывания, чем я думал...
Одна вещь я научился на горьком опыте: если у Вас есть несколько файлов, которые должны быть переведены, включать дополнительный тег в имя, так, чтобы позже можно было искать целую папку тот тег.
, например, вместо того, чтобы назвать файл 'sample-database.txt' называют английскую версию 'sample-database-loc-en.txt', итальянская версия 'sample-database-loc-it.txt
Мой первый ответ в StackOverflow, таким образом простите, если некоторые глупые были сказаны.
На основе моего опыта:
Да, это крупно предмет. Разбирание в нем является очень большой работой.
В моей программе я использую целочисленный ключ для каждой части текста и ищу его в файле по мере необходимости в зависимости от языка. Нет никаких литеральных строк нигде в коде, только ключи. Я определяю их с "перечислением" в C++, таким образом, я на самом деле не ввожу числа. Я записал утилиту для синхронизации различных файлов языка, когда я добавляю больше перечислений, и переводчики восполняют пробелы.
Каждый ключ также имеет связанную подсказку, изображение, сочетание клавиш, и т.д.
Что касается времен и дат... снова, это намного более сложно, чем Вы могли бы думать, но не делаете дескриптора PHP это для Вас? (Я не знаю, я - парень C++...)
PHP представляет строки внутренне как потоки байтов и принимает iso-8859-1 для случаев, где кодирование имеет значение. По большей части можно просто использовать UTF-8 повсеместно, и Вы будете в порядке. Один глюк, если Ваш сайт берет вход от своих пользователей, то, что Вы никогда не можете быть на 100% уверены, что они отправляют содержание в надлежащем кодировании. Вы могли бы хотеть использовать mb_detect_encoding
проверить вход или использовать скрытое поле с "экзотическими" символами для проверки против.
Знайте, что все связанные со строкой функции в PHP, что работа на символьном основании, принимают тот символ = байт. Это означает, что Вы обычно не можете доверять строковым функциям. Взгляните на эту страницу для получения дополнительной информации.
Другой хороший ресурс для PHP, cheatsheet Nick Nettleton.
Предметом, который очень тесно связан с наборами символов/кодировкой, является сопоставление. Вам нужны Ваши сопоставления для соответствия языку/культуре, с которым Вы работаете. По крайней мере, в MySql (вероятно, в другом RDBMS'es также), можно указать сопоставление на разных уровнях, такой как для каждой базы данных, на таблицу, для каждого столбца и даже в самом запросе.