Какие хорошие стратегии для организации файлов локализации для 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....
в этом случае)
У меня есть похожая проблема, и я опубликовал вопрос об этом. К сожалению, также не было большого интереса к этой теме.