【问题标题】:Multi-language website - PHP Class - What is the correct approach? [closed]多语言网站 - PHP 类 - 正确的做法是什么? [关闭]
【发布时间】:2014-02-12 03:30:43
【问题描述】:

我刚开始使用 PHP OOP,我想写一个类来制作一个多语言网站。我从 this 开始,但我想使用 OOP,所以我想出了这个:

Language.php

<?php

class Language {

    private $UserLng;
    private $langSelected;
    public $lang = array();


    public function __construct($userLanguage){

        $this->UserLng = $userLanguage;
    }

    public function userLanguage(){

        switch($this->UserLng){
            /*
            ------------------
            Language: English
            ------------------
            */
            case "en":
                $lang['PAGE_TITLE'] = 'My website page title';
                $lang['HEADER_TITLE'] = 'My website header title';
                $lang['SITE_NAME'] = 'My Website';
                $lang['SLOGAN'] = 'My slogan here';
                $lang['HEADING'] = 'Heading';

                // Menu

                $lang['MENU_LOGIN'] = 'Login';
                $lang['MENU_SIGNUP'] = 'Sign up';
                $lang['MENU_FIND_RIDE'] = 'Find Ride';
                $lang['MENU_ADD_RIDE'] = 'Add Ride';
                $lang['MENU_LOGOUT'] = 'Logout';

                return $lang;
                break;

                /*
                ------------------
                Language: Italian
                ------------------
                */

            case "it":
                $lang['PAGE_TITLE'] = 'Il titolo della mia pagina';
                $lang['HEADER_TITLE'] = 'Il mio titolo';
                $lang['SITE_NAME'] = 'Il nome del mio sito';
                $lang['SLOGAN'] = 'Uno slogan';
                $lang['HEADING'] = 'Heading';

                // Menu

                $lang['MENU_LOGIN'] = 'Entra';
                $lang['MENU_SIGNUP'] = 'Registrati';
                $lang['MENU_FIND_RIDE'] = 'Trova gruppi';
                $lang['MENU_ADD_RIDE'] = 'Aggiungi gruppo';
                $lang['MENU_LOGOUT'] = 'Esci';

                return $lang;
                break;

        }
    }
}

index.php

<?php 
$lang = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2);//Detecting Default Browser language
$language = New Language($lang);
$langArray = array();
$langArray =  $language->userLanguage();
?>

<div class="cssmenu">
    <ul>
        <li> class="active"><a href="/login"><?php echo $langArray['MENU_LOGIN']?></a></li>                                                                                         
        <li><a href="/rides"><?php echo $langArray['MENU_FIND_RIDE']?></a></li>                                               
        <li><a  id ="btnShow"><?php echo $langArray['MENU_ADD_RIDE']?></a></li>                                              
        <li><a href="/logout.php"><?php echo $langArray['MENU_LOGOUT']?> </a></li>                                                   
        <li><a href="/register"><?php echo $langArray['MENU_SIGNUP']?></a></li>
    </ul>
</div>

虽然这非常有效,但我不确定这是正确的方法。我没有找到很多关于如何使用 OOP 做到这一点的教程,所以我有以下疑问:

  1. 这是正确的做法吗?
  2. 此代码可维护吗?
  3. 在数据库中创建一个包含所有不同语言的表是否更有意义?
  4. 我仍在努力理解“抽象类”。是否会创建一个抽象类 language.php,然后将该类与其他语言类(english.php、italian.php 等)扩展(我希望这是正确的术语)。

【问题讨论】:

  • 这个问题似乎是题外话,因为它属于另一个网络站点:codereview.stackexchange.com
  • 我什至不知道 codereview.stackexchange.com。我现在该怎么办?从这里删除并发布到其他网站?
  • 我认为你不需要这样做,你的问题会迁移(如果 moredators 会这样做)
  • 您可能会发现这个问题很有用:Best practice multi language website

标签: php oop multilingual


【解决方案1】:

这是正确的方法。

但是,你可以创建一些语言文件

- english.php
define('ABOUT_US', 'About us');
....
- french.php
....

它可能更优化。

在数据库中创建一个包含所有不同语言的表是一个想法(vbulletin 使用这种方式),但它可能会占用大量系统资源。

【讨论】:

  • 如果您想在用户访问期间动态更改语言(您更愿意),这有点限制。声明的常量在尝试再次初始化它们时会引发错误,因为它们是 constants 而不是 variables
【解决方案2】:

你的进度非常好,除了一点,你的数据和代码是交织在一起的,这不是一种好的设计形式。不同的人使用不同的方法来处理 i18N。我更喜欢使用 .ini 文件,您可以将数据保存在不同的 INI 文件中,甚至可以根据需要添加部分。使用您的示例,您可以执行以下操作:

-- en.ini

PAGE_TITLE = 'My website page title'
HEADER_TITLE = 'My website header title'
SITE_NAME' = 'My Website'
SLOGAN = 'My slogan here'
HEADING = 'Heading'

--it.ini

PAGE_TITLE = 'Il titolo della mia pagina'
HEADER_TITLE = 'Il mio titolo'
SITE_NAME = 'Il nome del mio sito'
SLOGAN = 'Uno slogan'
HEADING = 'Heading'

那么你的代码可以改写为:

<?php

class Language {

private $UserLng;
private $langSelected;
public $lang = array();


public function __construct($userLanguage){

    $this->UserLng = $userLanguage;
    //construct lang file
    $langFile = '/path/to/ini/files/'. $this->UserLng . '.ini';
    if(!file_exists($langFile)){
        throw new Execption("Language could not be loaded"); //or default to a language
    }

    $this->lang = parse_ini_file($langFile);
}

public function userLanguage(){
    return $this->lang;
}

}

【讨论】:

  • 我正在寻找这样的例子。谢谢!
猜你喜欢
  • 2010-10-04
  • 2018-03-14
  • 1970-01-01
  • 1970-01-01
  • 2016-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多