Соглашения о конфигурации, реестре и именах языков - PullRequest
1 голос
/ 04 февраля 2011

Хорошо, вот большой вопрос, который всегда беспокоил меня.

Введение

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

Давайте углубимся

Давайте поговорим об использовании этих классов

# config.reg.php
self::set('configuration-name');
# whatever-file.php
reg::get('configuration-name');

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

# it.lang.php
self::set('duck-you', 'Daffanculo');
# en.lang.php
self::set('duck-you', 'Duck you');
# whatever-file.php
lang::get('duck-you');

Реальное дело

Хорошо, теперь.Я всегда в значительной степени d * cked при выборе правильного имени для конфигураций и для языковых индексов, и я всегда получаю что-то вроде:

self::set('that-error-message-that-appear-when-a-user-is-not-logged-in');

Или:

self::set('your-login-action-has-encountered-a-problem-please-get-back-later');

для языков и:

self::set('that-cookie-name-used-in-X-file');

для конфигураций.... что не так здорово.

Последний вопрос

Итак, мне было интересно, есть ли соглашения об именах, которые могли бы помочь мне пройти через это и двигаться дальше?

1 Ответ

1 голос
/ 04 февраля 2011

для начала ваши языковые значения не должны быть инкапсулированы в вашем объекте реестра.

ваш объект реестра должен содержать только такие объекты, как Session, Language, Input, output и т. Д., Поэтому ваш статический класс должен быть скомпонован так:

abstract class Registry
{
    public static function get($key)
    {
    }

    public static function set($key,$object)
    {
    }
}

затем вы вставляете свои объекты в Реестр следующим образом:

Registry::set("Language", new Language());

Затем вы должны использовать ваш языковой класс для извлечения ваших языковых файлов:

$Language = Registry::get("Language");
$Message = $Language->get("YourMessageKey");

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

, поэтому следующая строка:

that-error-message-that-appear-when-a-user-is-not-logged-in

станет

that_error_message_that_appear_when_a_user_is_not_logged_in

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

$Language->errors("user_not_logged_in");

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

/locale/en/primary.php | loaded by default
/locale/en/errors.php
/locale/en/menu.php
/locale/en/user.php

Каждый будет загружен только тогда, когдаПозвонил, например:

$Language->user("welcome_new_user");
/*         ^                      */

В вашем языковом классе создайте метод вызова, чтобы иметь возможность делать такой выбор:

 public function __call($context,$params)
 {
     if(!$this->contextLoader($context))
     {
         $this->loadContext($context)
     }
     return $this->languages[$this->lid][$context][$params[0]];
 }

Это сделает вещи намного более управляемыми.

Примечание:

Вымойте свой грязный рот!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...