多言語サイトでURLが ja(日本語コンテンツ)なのに英語メニューが表示されたりしないようURLベースでメニューを固定するハック

提供: GeeklogJpWiki

目次

標準的な設置方法

メニューとコンテンツ

言語により、ヘッダ・フッタを以下のように切り替えることができます。

header.thtml, footer.thtml の事例

あらかじめ _header_xx _footer_xx のidで多言語用のコンテンツを静的ページで作成しておき、テンプレートファイルのheader.thtml, footer.thtmlに、以下のように記述します。

header.thtml:

{!!staticpage_content _header_'.{switchlang}.' !!}


footer.thtml:

{!!staticpage_content _footer_'.{switchlang}.' !!}

言語切替メニューを設置

言語切替メニューを設置して、他の言語へ切り替えることができます。

    <a href="/switchlang.php/ja">日本語</a> | <a href="/switchlang.php/en">ENGLISH</a>

Geeklog2.1での言語自動判定の仕組みの問題を解決するために

上記の設置では、URLで指定された言語と、ヘッダ・フッタの言語が一致しないケースがある、切り替えが動作しないケースがある、といった問題が生じてきました。

これらはGeeklog2.1の言語判定が1.ログインユーザの言語設定、2.Cookieの言語設定、3.ブラウザの言語設定を見て判断しているためです。Cookieが絡みますので初回アクセス時には問題は起こらないですが、何度もアクセスし多言語のページを切り替えて多数見ているとCookieの言語設定とブラウザの言語設定とのパターンによりメニューと内容の言語が食い違ったり言語切替が反応しないことが起こります。

そうしたことを避け、URLが_jaのサイトはメニューも内容も日本語で表示するというよくある多言語サイトを運用をするためのハックを公開します。


多言語サイト用URLベースの言語切替ハック

修正ファイルは lib-common.php です。

<public_html>/lib-common.php

COM_getLanguageFromURL()を追加

COM_getLanguageFromBrowser関数(7636行付近)の下に以下の関数を追加します。

// 2015/07 add hiroron
function COM_getLanguageFromURL($url='') {
    global $_CONF;
    if (empty($url)) { $url=COM_getCurrentURL(); }
    $retval = '';
    if ($_CONF['url_rewrite']) {
        // for "rewritten" URLs we assume that the first parameter after
        // the script name is the ID, e.g. /article.php/story-id-here_en
        $p = explode('/', $url);
        $parts = count($p);
        for ($i = 0; $i < $parts; $i++) {
            if (substr($p[$i], -4) == '.php') {
                // found the script name - assume next parameter is the ID
                if (isset($p[$i + 1])) {
                    $l = strrpos($p[$i + 1], '_');
                    if ($l !== false) {
                        $retval = substr($p[$i + 1], $l+1);
                    }
                }
                break;
            }
        }
    } else { // URL contains '?' or '&'
        $url = explode('&', $url);
        $urlpart = $url[0];
        $l = strrpos($urlpart, '_');
        if ($l !== false) {
            $retval = substr($urlpart, $l+1);
        }
    }
    return $retval;
}

COM_getLanguage() hack

表示するページの言語判定を、1. URL 2. ユーザーの言語 3. Cookieの言語 4. ブラウザの言語の順番 の優先順位で判定します。

function COM_getLanguage()
{
    global $_CONF, $_USER;
    static $langfile;

    if ($langfile !== null) {
        return $langfile;
    }

    $langfile = '';
    $langfile = COM_getLanguageFromURL();

    if (empty($langfile)) {
                if (!empty($_USER['language'])) {
                    $langfile = $_USER['language'];
                } elseif (!empty($_COOKIE[$_CONF['cookie_language']])) {
                    $langfile = $_COOKIE[$_CONF['cookie_language']];
                } elseif (isset($_CONF['languages'])) {
                    $langfile = COM_getLanguageFromBrowser();
                }
        }

    $langfile = COM_sanitizeFilename($langfile);
    if (!empty($langfile)) {
        if (is_file($_CONF['path_language'] . $langfile . '.php')) {
            return $langfile;
        }
    }

    // if all else fails, return the default language
    $langfile = $_CONF['language'];

    return $langfile;
}



<public_html>/switchlang.php

カレントの言語モードによってただしく言語切り替えができない不具合を解消します。

143行目「$oldlang = COM_getLanguageId();」の下に次のコードを追加します。

    // 2015/07 add hiroron
    if ($lang == $oldlang) {
        $urllang = COM_getLanguageFromURL($ret_url);
        $oldlang = !empty($urllang) ? $urllang : $oldlang;
    }
個人用ツール