Как вынести языковые переменные

Тема в разделе "PHP", создана пользователем NewS, 5 ноя 2008.

Статус темы:
Закрыта.
Модераторы: latteo
  1. NewS

    NewS

    Регистр.:
    15 авг 2008
    Сообщения:
    255
    Симпатии:
    84
    Вот решил я вынести весь язык в отдельный файл ru.php
    А как теперь использовать яз. переменные внутри функций?
    Получается что внутри каждой функции нужно с помощью include() подключать или есть какой-то способ получше?
    Функций в одном файле очень много и не хочется в каждую пихать одну и туже строчку.
    Файл ru.php:
    PHP:
    $lang "Языковая переменная";
    PHP:
    function name($per)
    {
    include(
    "./ru.php");
    echo 
    $lang;
    }
     
  2. PHP_Master

    PHP_Master

    Регистр.:
    3 фев 2008
    Сообщения:
    2.647
    Симпатии:
    590
    Есть несколько вариантов - начиная от массивов и заканчивая gettext.
    Пример:
    PHP:
    $lang = array();

    $lang['admin'] = 'Админ';
    $lang['user'] = 'Пользователь';
    $lang['welcome'] = 'Привет'
    PHP:
    <?php

    include './ru.php';

    echo 
    $lang['welcome'] . ', ' . ($is_admin $lang['admin'] : $lang['user']);

    ?>
     
  3. Hemi-Sync

    Hemi-Sync Постоялец

    Регистр.:
    17 дек 2006
    Сообщения:
    88
    Симпатии:
    38
    Более того, ассоциативные массивы в пхп просто чудная вещь. Поэтому можешь накидать функцию локализации, как это сделано в фреймворках, например ZF.

    В общих чертах там так. Есть класс, которому передется путь до файлов локализации. Потом, когда нужно, передается желаемый язык. Языковые файлы - массивы, хмл, ваш вариант.

    вызов такой
    PHP:
    echo $lang->translate('this must be translated');
    То есть при вызове пишем английскую фразу и если он не найдет ее локализированую версию, то вернет эту же английскую.
    А все благодаря тому, что в пхп ключи могут быть такими как 'this must be translated'. То есть получается дефолтовый язык английский (работает всегда), а локализация может быть отложена и выполнятся по мере возмжностей.
     
  4. Eihwaz

    Eihwaz

    Регистр.:
    7 окт 2007
    Сообщения:
    156
    Симпатии:
    54
    Я константами пользуюсь:
    russian.php
    PHP:
    define('USER_GREETING''Добро пожаловать!');
    define('HOW_USER_FEELS''Как Вы себя сегодня чувствуете?');
    index.php
    PHP:
    require 'russian.php';
    echo 
    USER_GREETING '<br>' HOW_USER_FEELS;
    Введет:
    Добро пожаловать!
    Как Вы себя сегодня чувствуете?
     
  5. VawKuar

    VawKuar Прохожие

    Можешь порыться в phpMyAdmin и взять некоторые идеи из него
     
  6. NewS

    NewS

    Регистр.:
    15 авг 2008
    Сообщения:
    255
    Симпатии:
    84
    Все хорошо конечно, но вопрос-то немного в другом.
    Обязательно подключать языковой файл в каждой функции или нет?
    Так не работает:
    PHP:
    include("./ru.php");

    function 
    name($per) {
    echo 
    $lang
    }
    function 
    name($per) { 
    echo 
    $lang
    }
    function 
    name($per) { 
    echo 
    $lang
    }
    Так работает:
    PHP:
    function name($per) { 
    include(
    "./ru.php"); 
    echo 
    $lang
    }
    function 
    name($per) { 
    include(
    "./ru.php"); 
    echo 
    $lang
    }
    function 
    name($per) { 
    include(
    "./ru.php"); 
    echo 
    $lang
    }
     
  7. B1rdEX

    B1rdEX Постоялец

    Регистр.:
    30 июн 2008
    Сообщения:
    141
    Симпатии:
    26
    Нет естественно :)
    Так у тебя скрипт будет как черепаха работать..

    Вариантов несколько:
    1) использовать global $lang в каждой функции
    хз, неудобно ппц..
    лучше если $lang - массив
    2) использовать $GLOBALS['lang']['нужная фраза']
    тоже неудобно
    3) написать функцию
    плюсы: функция всегда глобальна (видна отовсюду)

    так вот, вариант 3..
    возвращает перевод, при неудаче - переданный параметр
    работает только на пхп5.

    PHP:
    function translate$w ) {
    static 
    $lang '';
    if ( ! 
    is_arary$lang ) ) {
    include 
    '/путь/к/файлу/языков';
    // в файле должен быть массив $lang
    // например:
    // $lang = array( 'hello' => 'превед', 'bear' => 'медвед' )
    }
    return isset( 
    $lang[$w] ) ? $lang[$w] : $w
    }
     
  8. PHP_Master

    PHP_Master

    Регистр.:
    3 фев 2008
    Сообщения:
    2.647
    Симпатии:
    590
    А что в этой функции специфичного для PHP5?
     
  9. B1rdEX

    B1rdEX Постоялец

    Регистр.:
    30 июн 2008
    Сообщения:
    141
    Симпатии:
    26
    Статичные переменные работают как в моем скрипте только на пхп5, на 4 надо делать через стдкласс.

    смотри тут..
    http://ru2.php.net/static
     
  10. SHAKAL

    SHAKAL Создатель

    Регистр.:
    30 мар 2007
    Сообщения:
    10
    Симпатии:
    3
    Нет, необязательно сделай так как посоветовал Eihwaz
    Файл test.php
    Код:
    <?php
    include("lang.php");  
    
    function name($per) {  
    echo ""._HELLO." $per";  
    } 
    ?>
    
    файл lang.php

    Код:
    <?php
    define("_MESSAGE","Доступ запрещен");
    define("_HELLO","Привет");
    ?>
     
Статус темы:
Закрыта.