Чому рядкові ресурси зазвичай зберігаються зовні коду, а не всередині коду?


18

Як правило, на багатьох платформах я записую свої рядкові ресурси у файл .resx або .xml, а потім отримую їх, використовуючи підхід, залежний від платформи.

Тобто на iOS я отримую їх через NSBundle.MainBundleі через Context.ResourcesAndroid.

Які переваги цього підходу, а чому немає прямого доступу до коду, наприклад:

  1. У крос-платформному проекті будь-яка платформа може отримати доступ до нього безпосередньо, без інтеграції.

  2. Під час будівництва не виникає сумнівів щодо того, чи добре створені ресурси.

  3. Кодер може використовувати такі функції, як багатомовна керованість

Довге коротке оповідання: що є причиною структури струнних ресурсів таким чином?

[Редагувати]

Скажімо, що мій файл є частиною "основного" проекту, який ділиться між іншими проектами. (Подумайте про структуру файлів міжплатформних проектів PCL.)

І припустимо, що мій файл просто повністю схожий на файл .resx / .xml, виглядає так (я не є профі в xml, вибачте!): Параметри Paramètres

Отже, це в основному власний xml, де ви вказуєте на ключ / мову, щоб отримати відповідний рядок.

Цей файл буде частиною програми так само, як ви додаєте будь-який доступний файл всередині програми та система для доступу до рядкових ресурсів, кодованих за допомогою PCL. Чи додасть це додаткові накладні додатки?



6
Ні, мої проблеми не стосуються інтернаціоналізації, а, скоріше, архітектури та крос-платформи, вибачте.
Леон Пелтьє

1
Це питання може бути узагальнено до будь-якого виду ресурсів, насправді навіть з простотою локалізації / інтернаціоналізації вбік. Які переваги зберігати будь-який ресурс окремо від коду? Чому зображення або аудіофайли зазвичай не кодуються у джерелі як бінарні рядки? (Звичайно, URI даних є, але для великих файлів, як правило, недоцільно). Інші вже дали досить хороші відповіді, але я хотів лише зазначити, що рядки, що читаються користувачем, - це не єдиний тип ресурсів, який отримує вигоду від екстерналізації.
JAB

Відповіді:


38

Локалізація та інтернаціоналізація,

Якщо зберегти рядки зовнішніми, вони можуть змінюватись (читати: перекладено), не потребуючи перекомпіляції (максимум просто перейменування, а в кращому випадку просто потрапляючи в нову папку).


Ця посилання на рекомпіляцію - це вагома причина, дякую.
Леон Пелтьє

2
Все-таки єдина людина, яка зрозуміла питання.
Леон Пелтьє

3
@ratchetfreak - це погана форма приймати занадто рано (протягом годин, безумовно, вважається важливим). Не дає часу на інші відповіді на міхур. Це просто, і до речі, і точно ... але хтось може завтра (або наступного місяця з цього питання) отримати більш повну, більш детальну відповідь.
WernerCD

3
Додатково: Перекладачу може бути нормально редагувати XML-файл, але ніколи не дозволяйте їм загравати біля фактичного коду ...
Darkhogg

Тепер питання: "Чи все ще ця відповідь застосовується для інтерпретованих мов?". Я запитую, тому що не було б переповнень чи перекомпіляцій.
Томас Едінг

10

Якщо у вас є файл, який містить лише рядкові ресурси, ви можете надати файл ресурсу агенції з перекладу чи щось подібне та отримати переклад. Я думаю, ви можете собі уявити, як важко це могло б отримати, якщо вам доведеться надати багато кодових файлів лайперсону, щоб зробити якийсь переклад (крім того, можливо, не бажаючи видавати свій код комусь).


2
Ну, різниці між файлом, що входить до проекту, та файлом ресурсів немає. Проблеми немає.
Леон Пелтьє

Я говорю про включення ресурсів безпосередньо в код, а потім обробляти все, що знаходиться всередині програми, тож це більш зручно для PCL / крос-платформи.
Леон Пелтьє

2
якщо у вас є "кодовий" файл з усіма вашими рядковими ресурсами (словник definiton або щось подібне) і нічого іншого в ньому .. ну, ніж це, в основному, файл ресурсів (але один для однієї платформи, наприклад, android не буде візьміть будь-який код об'єктивного с). Якщо в ньому є інший код або він розділений на кілька файлів, важче отримати зовнішній переклад. У крос-платформенному варіанті текстовий формат, як xml, має перевагу, яку ви можете читати та використовувати на будь-якій мові / платформі (але, можливо, вам доведеться це зробити)
Flo

7

На додаток до інтернаціоналізації / локалізації, відокремлення текстових рядків таким чином дозволяє коректору надсилати виправлення до правопису / граматики / пунктуації, які є ізольованими до messages.${LOCALE}, не торкаючись істинного файлу вихідного коду. У вас може виникнути затемнення щодо змін коду, але приймайте такі виправлення тексту. Якщо ви приймаєте одночасні зміни і в коді, і в повідомленнях, зберігання їх розділеним полегшує об'єднання патчів, за умови, що зміни коду не переробляють жодних повідомлень, які існували, коли коректор перевірявся messages.en_US.

Крім того, залежно від того, як це реалізовано, можливо, навіть не потрібно буде повторно зв’язувати програму. Код може просто захопити рядок 138 messages.${LOCALE}для певного повідомлення, при цьому номер рядка визначається під час виконання.


0

Це лише те, що ваша мова / платформа вирішили реалізувати локалізацію рядків. Всі підходи до локалізації потребують якихось зовнішніх файлів ресурсів, щоб отримати переклади. Основним больовим моментом є те, як ви підтримуєте ці ресурси.

Схоже, вам потрібно підтримувати ці файли ресурсів вручну , що може бути досить тягарем. Це також ускладнює обмін повторюваними рядками. А це робити, коли ви зараз доставляєте лише одну мову, - це ще більше тягаря.

Поширеною альтернативою є підхід GNU Gettext - це просто маркування трансляційних рядків у вихідному коді та автоматичне вилучення цих рядків до стандартних файлів PO, які добре працюють міжплатформованими та перехресними мовами. З точки зору розробника, він може обійтися ручним обслуговуванням файлів ресурсів XML в будь-який день.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.