Какие хорошие стратегии для организации файлов локализации для trans() в Laravel 5.x?

Это вопрос о методологии и предлагаемых методах. Я знаю, что он не строго привязан к фреймворку и даже не к PHP, и ответ может быть "это зависит от вас". Но я беспокоюсь о передовой практике и методологии, так как обычно существует лучший подход для определенного контекста.

Я хотел бы знать, каковы наилучшие методы именования ключей для trans() функция Laravel 5.1?

Учитывая, что встроенные переводы Laravel хранятся в массиве, меня беспокоит то, какой наем позволяет мне достигать следующих целей:

согласованность: поэтому я минимизирую возможность использования разных слов для одного и того же значения или создания множества разных ключей, которые в итоге получат один и тот же перевод (как обычные слова).

возможность повторного использования: поэтому я минимизирую общий размер файлов перевода и выполняю как можно меньше переводов и сохраняю гибкость.

удобочитаемость. Таким образом, переводчики могут определить назначение ключа даже при отсутствии значения перевода.

организация: Таким образом, разработчик может легко запомнить полный путь к ключу и свести к минимуму проверку файлов трансляции каждый раз.


В качестве примера, скажем, я хочу назвать успешное оповещение об обновлении модели пользователя для профиля управления. Возможные подходы:

trans('manager.user.update.alert.sucess')

trans('alerts.success.manager.user.update')

trans('manager.user.alert.update.success')

trans('alert.the_user_was_updated_successfully')

Обновить

Похоже, что к ноябрю 2016 года Laravel 5.4 представляет механизм перевода на основе JSON, который может упростить файлы перевода. Тем не менее, забота об умной файловой структуре и хорошо организованных текстах является плюсом.

1 ответ

Решение

Мое предложение было бы использовать параметр параметризованного перевода в Laravel.

Я бы предложил иметь такую ​​структуру:

Для контента, который является общим и может быть повторно использован:

trans('messages.alerts.update.success', ['item' => 'User']);   // results in: 'User has successfully been updated'
trans('messages.alerts.update.success.default');               // results in: 'Updated was successfull.'

Для контента, который строго связан с определенной областью / проблемой... (менеджер в этом случае):

trans('manager.alerts.update.user.success');   // results in: 'User has successfully been updated'

или же

trans('manager.alerts.update.success', ['item' => 'User']);   // results in: 'User has successfully been updated'
trans('manager.alerts.update.success.default');               // results in: 'Updated was successfull.'

Идея заключается в том, что для чего-то определенного для менеджера, такого как наличие сообщения об успешном обновлении, которое может отличаться от других сообщений об успешном обновлении, следует начинать с чего-то определенного, например: manager.alerts..., В общих случаях (когда одно и то же сообщение может использоваться в нескольких случаях), вы должны начать с чего-то общего, например messages.alerts.update...,

Называть как trans('alert.the_user_was_updated_successfully') На мой взгляд, следует избегать, потому что у вас может быть БОЛЬШАЯ проблема, когда вы хотите изменить сообщение. Ключ будет по-прежнему отражать старое значение, а значение будет новым.

Относительно ваших целей:

последовательность и возможность повторного использования: определенное количество контента будет продублировано. Этого нельзя избежать. Однако эту проблему можно минимизировать, структурируя контент и имея файл (ы) с общими словами и фразами, например. commons.words commons.phrases или 2 файла (слова и фразы) с несколькими категориями. Пример: commons.time.day , commons.hello_world ...

удобочитаемость: это будет проблемой, если вы не передадите переводчику файл, в котором уже есть все его значения (на языке по умолчанию или на начальном языке, с которого он / она может переводить). Я действительно не понимаю, почему у вас не будет первоначального перевода / содержания.

организация: Вы должны думать и думать, как если бы вы были в шкуре разработчика. Если вы пытаетесь найти что-то конкретное, вы найдете что-то и попытаетесь найти что-то в этой конкретной темеmanager.alerts.... в этом случае) но если вы ищете что-то более общее, вы, скорее всего, будете искать что-то общее (messages.alerts.... в этом случае)

У меня есть похожая проблема, и я опубликовал вопрос об этом. К сожалению, также не было большого интереса к этой теме.

Другие вопросы по тегам