Comments 32
Ниже замечания по делу:
1. Для строковых ресурсов так, как вы написали, не напишешь.
Вот правильный пример:
<string name="welcome_messages">Hello, %1$s! You have %2$d new messages.</string>
2. Plurals не всегда корректно работают с локалями.
3. Для облегчения перевода одинаковые строки можно объединить в одну, а остальные ссылать на нее:
<string name="my_string">111</string>
<string name="your_string">@string/my_string</string>
4. Чтобы проще было разделять ресурсы по блокам, не обязательно использовать конструкцию, как у вас
<!-- Работает -->
// Тоже работает!
<string name="...">...</string>
- Можно и так, как в статье. Цифры нужны только для изменения порядка использования параметров.
- А можно вообще регионы использовать.
По 2 пункту — о каких регионах речь?
При наличии 2 и более будет выдана ошибка:
Error:(1264) Multiple substitutions specified in non-positional format; did you mean to add the formatted=«false» attribute?Наверное потому мы везде использовали %1$, даже при наличии лишь 1 параметра — выглядит целостнее.
...
endregion
Ctrl+Alt+T нажмите.
- Выше приведен пример, что все работает.
- В статье был сделан акцент на разделении строк, а ваш пункт №3 категорически этому противоречит.
- Я бы сказал, что это зависит от code style, в xml не принято ставить такого типа комментарии
// Also works
2) активно пользую в проектах, в т.ч. с right-to-left локалями, пока ни разу не корректностей не встречал, буду ОЧЕНЬ благодарен за конкретные локали или проблемные варианты использования
3) поддержу автора — ссылки на строки внутри хорошо, если мало локалей, но как только переваливает через 10 языков и в команде от 5 человек, которые паралельно работают с строковыми ресурсами, то это превращается в постоянный рефакторинг строковых ресурсов, проще сразу разделять сразу разделять
4) // — недопустимо для xml, и пока мало локалей то всё ок, но если приходится, ДАЖЕ ИНОГДА, прибегать к сторонним утилитам для сверки и консолидации переводов — это будет первое место для ругани
Не пытаюсь что-то доказать, но я встречал лишь несколько реально крупных проектов, написанных не мной. Примером может послужить Telegram. По ссылке вот тут xml для русской локализации — ССЫЛКА и там нету Plurals и %s. Наверное о чем-то это говорит у проекта с многомилионной аудиторией. Или вы думаете, что они просто не умеют?
По поводу ссылок на свои же ресурсы — это же даже не рекомендация, я написал что можно так делать. Как плюс — можно добиться существенной экономии на переводе.
По // тоже самое, так можно, но я же не настаиваю :)
2. Plurals не всегда корректно работают с локалями.
это просто предположение? спрашиваю серьезно, так как активно ими пользуюсь при разработки или не трогаю их при рефакторинге
сорри если показалось сильной критикой с моей стороны, просто я прывик что 90% стоимости кода — это его поддержка и в данном случаи Ваши варианты (3 и 4) ведут к усложнению саппорта
У нас на проектах используется
MessageFormat
.не одной заявления о некорректной работе strings plurals
как правило strings plurals — везде отмечен как правильный ответ на вопрос об локализации множественных
по указаной Вами ссылке не нашел ни одного места, где бы plurals вообще можно бы было использовать (просто небыло потребностей)
Не стоит для аргументации использовать telegram. Он (там один разработчик клиента) переписал половину андроид, даже саппорты гугловые не использует, я не удивлен, что и в строках он что-то не применяет.
MessageFormat
более гибок, чем телеграм и пользуется.Почему не стоит его использовать при аргументации? Если проект имеет многомиллионную аудиторию и что-то не использует — стоит задуматься «почему?». Я исследовал их исходники, код не идеален с точки зрения читабельности, но фрагменты не используются в угоду скорости и плавности анимаций, коих с фрагментами объективно не добиться. Класс
BaseFragment
есть, просто он не extends Fragment
.Странно, что автор не участвует в дискуссии, мне его статься витися интересной.
Я отвечаю на те комментарии, на которые считаю необходимым.
Не пойму аргументации о единстве стиля. А чем "везде, где один аргумент, писать %s" не стиль? Если изменится количество аргументов, все равно код и строку менять придется.
Количество пользователей вообще никак не коррелирует с качеством кода и используемых подходов. Что телеграмм на практике доказывает. Он занимается велосипедостроением, оправдывая это стремлением к стабильности. Если ресурсы телеграмма позволяют писать собственную реализацию sqlite, им везёт, большинство проектов к такому не готовы. Да и смысла нет.
Я, например, делаю вот так, профит замечаешь позже, главное не скатиться с такого именования
<string name="history.status.received">Получен</string>
<string name="history.status.canceled">Отклонен</string>
В java коде правда это автоматом заменяется на такую конструкцию
R.string.history_status_receiverd
Но мне все равно нравится
А в чем профит, собственно? Который перевешивает нарушение code-style.
например так
<string name="shopping_list.category.other">Другое</string>
На мой взгляд выгляди лаконичней, в сравнении с таким вариантом
<string name="shopping_list_category_other">Другое</string>
На одном сравнительно недавнем проекте сначала было требование поддерживать 2.3.1 — пришлось использовать оберточку https://github.com/populov/android-i18n-plurals.
Подход с %1$s я например использую всегда. Даже зная что кроме русского и английского других языков в принципе не будет. И для моего open-source кода тоже.
Android string.xml — несколько вещей, которые стоит помнить