PHP получает многоязычные данные из базы данных с мгновенными переменными - PullRequest
0 голосов
/ 14 мая 2018

Я хотел бы сохранить каждое слово / предложение / ... в таблице базы данных следующим образом:

Название таблицы:

translate

столбцы:

id, var, dutch, english, french

Пример:

'1', 'titleOne', 'Hallo Wereld!', 'Hello World!', 'Bonjour le monde!'

Я хотел бы напечатать переменную, например, в разделе заголовка:

<?php
echo $titleOne;
?>

Поскольку будут сотни строк, я не хочу устанавливать $titleOne = $row['titleOne'] для каждой строки.

Может кто-нибудь помочь мне с хорошим запросом, извлечением, извлечением, массивом, циклом, ... как бы вы это ни называли? (или хороший альтернативный способ тоже хорош!)

Это обычный PHP, фреймворки не используются.

PS: я вообще не эксперт по PHP, поэтому постарайтесь сделать это проще: -)!

Большое спасибо!

Ответы [ 2 ]

0 голосов
/ 14 мая 2018

Я 2-й совет, данный другими о структуре таблицы, но чтобы ответить на ваш вопрос, вы можете использовать извлечение

$row = array(
    col_1 => 'a', 
    col_2 => 'b', 
    col_3 => 'c' 
)

extract($row);


// results in:

//   $col_1  assigned value 'a'
//   $col_2  assigned value 'b'
//   $col_3  assigned value 'c'
0 голосов
/ 14 мая 2018

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

-- For Dutch (pseudocode)
$query = 'SELECT var, dutch FROM translate';

$translations = array();   
while loop ($row = $query) {
    $translations['var'] = $row['dutch'];
}

// Then, to access translations you would:
echo $translations['titleOne'];

НО вы не хотите этого делать.Эта структура таблицы приведет вас на путь сожаления.Обратите внимание на наши предупреждения.Есть много способов сделать это, и вы выбрали путь SQL, поэтому вот несколько советов.

Измените структуру таблицы, чтобы вам не приходилось добавлять новый столбец при каждом добавленииновый язык.

Таблица: языки (Добавить новую строку для поддержки нового языка)

id, locale, language

1, en_CA, English
2, en_US, English
3, en_UK, English
4, es_ES, Spanish
5, es_MX, Spanish
...

Таблица: переводы (добавить новую строку для добавления перевода)

id, locale, translation_key, translation

1, en_CA, 'hello', 'Hi from Canada'
2, en_US, 'hello', 'Hi from the US'
3, en_UK, 'hello', 'Hi from the UK'
4, es_ES, 'hello', 'Hi from Spain'
5, es_MX, 'hello', 'Hi from Mexico'
...

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

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

  • выяснить, какую локаль использовать.Это будет одна из самых сложных частей.Ex.Вы должны использовать тот, который указан в URL, сеансе, настройке браузера?Что произойдет, если ни один из них не указан?Какой резервный язык?Посмотрите мою getLanguage() функцию в https://stackoverflow.com/a/49758067/296555 для некоторых идей.
  • Извлеките все переводы для этой локали и сохраните их в памяти.Вот основной запрос, чтобы получить все переводы для данной локали.

    <?pseudocode 
    $locale = 'en_CA';    
    
    // Find all translations for a given locale
    $dbQuery = 'SELECT translation_key, translation
    FROM translations
    WHERE locale = :locale';
    ;
    
  • Поместите те записи, которые вы только что вытащили в память.

    <?pseudocode 
    $translations = array();
    while loop ($row = $dbQuery) {
        $translations[$row['translation_key']] = $row['translation'];
    }
    
  • Теперь в вашем приложении вы можете получить доступ к переводам через этот массив.

    echo $translations['hello'];

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

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

...