typecho站点多语言设置简介

网站一般会有一个语言标记,亲如果右键查看本页的html源代码,会在前两行看到类似下面这样的内容,这段代码里涉及到了一个lang 属性,这个属性是 HTML 中用于声明网页或元素内容语言的重要属性,它对网页的可访问性、SEO 和用户体验都有重要影响。在typecho里,可以通过它来影响站点的语言展现。

<!DOCTYPE html>
<html lang="zh-CN">

先说结论

echo  _t('站点 LOGO 地址');

typecho里的多语言设置一般会用到上面这个函数,如果没有多语言需求,无论是单一的英文或者中文站点,我们都可以直接输出字符串,想实现中文主题就直接输出中文:

echo  '站点 LOGO 地址';

而英文主题就直接输出英文:

echo  'site logo';

完结撒花~~

语言设置参数的提取与修改

获取值

在主题的页面展示部分,我们可以通过 $this->options->lang 来获取typecho站点的语言设置,而在后台,如果无法通过前一个命令获取到值,比如在functions.php文件里想提取这个值的时候,我们需要使用 Helper::options()->lang 这样的形式。

修改值

正常情况,对于站点的语言设置,我们可以去后台的设置项里直接修改,如果希望利用代码修改的,可以参考下方的代码:

function changeLanguageToEnglish() {
    $db = Typecho_Db::get();
    $db->query($db->update('table.options')
        ->rows(array('value' => 'en-US'))
        ->where('name = ?', 'lang'));
    
    // 可选:清除缓存,使更改立即生效
    if (method_exists('Typecho_Widget', 'destory')) {
        Typecho_Widget::destory('Widget_Options');
    }
}

// 调用函数(例如在插件激活时或主题初始化时)
changeLanguageToEnglish();

被隐藏的语言设置项

typecho站点多语言设置简介

既然是多语言,那我们提取到的必然是一个可变的值,但博主打赌,即便亲翻遍了基本设置页所有项,也找不到语言设置的按钮。显示语言设置项需要一个很大的前摇;

typecho站点多语言设置简介

首先需要进入typecho安装文件夹(注意:不是主题文件夹)根目录下的usr文件夹内,新建一个名为“langs”的文件夹,然后把对应语言(比如 en-US.mo)文件放进去;

typecho站点多语言设置简介

关于.po.mo文件,这是两种专用于翻译领域的文件格式,虽然看着都是陌生后缀,实际操作一遍下来,最麻烦的步骤反而是下载它们的专用编辑器“Poedit”。

翻译实操

比如以下的代码,已经提前利用 _t() 函数对需要翻译的语句做了处理,现在我们可以直接把它扔给deepseek等ai工具,

if (isset($_POST['type'])) {
    $value = $db->fetchRow($db->select()->from('table.options')->where('name = ?', 'theme:' . $name))['value'];
    if ($_POST["type"] == "backup") {
        $backupData = [
            'backup_time' => date('Y-m-d H:i:s'),
            'theme' => $name,
            'settings' => unserialize($value)
        ];
        $jsonData = json_encode($backupData, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
        $filename = $backupDir . 'theme_' . $name . '_backup.json';
        if (file_put_contents($filename, $jsonData)) {
            ?>
            <script>alert("<?php echo _t('主题设置已备份!'); ?>");</script>
            <?php
        } else {
            ?>
            <script>alert("<?php echo _t('备份失败,请检查 backup 目录权限!'); ?>");</script>
            <?php
        }
    }
    
    if ($_POST["type"] == "recovery") {
        $backupFile = $backupDir . 'theme_' . $name . '_backup.json';
        if (file_exists($backupFile)) {
            $backupContent = file_get_contents($backupFile);
            $backupData = json_decode($backupContent, true);
            if ($backupData && isset($backupData['settings'])) {
                $serializedSettings = serialize($backupData['settings']);
                $db->query($db->update('table.options')->rows(array('value' => $serializedSettings))->where('name = ?', 'theme:' . $name));
                ?>
                <script>
                    alert("<?php echo _t('已从备份文件恢复主题设置!'); ?>");
                    window.location.href="<?php Helper::options()->adminUrl('options-theme.php');?>";
                </script>
                <?php
            } else {
                ?>
                <script>
                    alert("<?php echo _t('备份文件解析失败,文件可能已损坏!'); ?>");
                </script>
                <?php
            }
        } else {
            ?>
            <script>
                alert("<?php echo _t('未能找到备份文件,无法恢复!'); ?>");
            </script>
            <?php
        }
    }
    
if ($_POST["type"] == "download") {
    $backupFile = $backupDir . 'theme_' . $name . '_backup.json';
    ob_clean();
    ob_start();
    if (file_exists($backupFile)) {
        header('Content-Description: File Transfer');
        header('Content-Type: application/octet-stream');
        header('Content-Disposition: attachment; filename="theme_' . $name . '_backup.json"');
        header('Content-Length: ' . filesize($backupFile));
        header('Expires: 0');
        header('Cache-Control: must-revalidate');
        header('Pragma: public');
        ob_end_flush();
        readfile($backupFile);
        exit;
    } else {
        ?>
        <script>
            alert("没有找到可下载的备份文件!"); 
        </script>
        exit;
        <?php
    }
}
}

typecho站点多语言设置简介

整理好的文档内容如下,将其复制后保存为 en_US.po 文件。

# Typecho Theme Backup Translations
# Copyright (C) 2023 Your Theme Name
msgid ""
msgstr ""
"Project-Id-Version: Your Theme Backup\n"
"POT-Creation-Date: 2023-11-20 10:00+0800\n"
"PO-Revision-Date: 2023-11-20 10:00+0800\n"
"Last-Translator: Your Name <your@email.com>\n"
"Language-Team: Your Team <team@email.com>\n"
"Language: zh_CN\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"

msgid "主题设置已备份!"
msgstr "Theme settings have been backed up!"

msgid "备份失败,请检查 backup 目录权限!"
msgstr "Backup failed, please check backup directory permissions!"

msgid "已从备份文件恢复主题设置!"
msgstr "Theme settings have been restored from backup!"

msgid "备份文件解析失败,文件可能已损坏!"
msgstr "Failed to parse backup file, the file may be corrupted!"

msgid "未能找到备份文件,无法恢复!"
msgstr "Backup file not found, unable to restore!"

msgid "没有找到可下载的备份文件!"
msgstr "No downloadable backup file found!"

电脑上安装好Poedit软件,用它来打开准备好的 po 文件,点击保存后会自动生成同名 mo 文件,用这个mo文件去就可以进行翻译测试工作了。在后台设置页将语言设置修改为英文(en_US),保存后尝试 "_t()" 输出翻译前的中文,看看会不会被自动转为英文吧。

typecho站点多语言设置简介

复制文档内容并另存为 po 文件的操作尽量使用更专业的编辑器(sumlime、notepad++等),避免使用windows自带的那个,可能会引发不必要的错误。

语言包能否直接放主题里呢

安装了一个主题还不够,还得去主题文件夹新建文件夹,上传文件,听听也觉得头大,那么问题来了,能否把语言包直接放主题里呢,答案是可以的。

use Typecho\I18n;
define( 'AUG_THEME_DIR' , __DIR__ );
I18n::setLang(AUG_THEME_DIR . '/langs/en-US.mo');

利用上面的语句,我们可以把语言包直接放在主题根目录的langs文件里读取,遗憾的是,如果这么做了,那么设置里那个隐藏的多语言选项就不可见了。

I18n::setLang(AUG_THEME_DIR . '/langs/' . Helper::options()->Auglangs . '.mo');

博主的解决方案是在主题后台设置项里增加一个语言选项,供用户在主题设置页面设置语言项目,但这样一来,就跳过了typecho官方渠道参数,后期可能会导致一些不便,容博主碰到相关问题再进行补充吧。

标签: typecho

移动端可扫我直达哦~

推荐阅读

thumbnail 2025-06-08

typecho前台ajax登录与错误处理

尝试了在主题前台做一个登录框,登陆的功能是实现了,有一个小小的不便,就是如果输错了密码,因为页面又跳回了首页,所以弹出式登录框又被隐藏了,登录成功与否不够明显,二次登录的场合操作也较繁琐,所以想实现前台以ajax的方式登录。实现aja...

建站相关 typecho

thumbnail 2025-06-08

聊聊html里的head部分

HTML文档的<head>部分是一个容器,用于包含文档的元数据(metadata)和链接到外部资源的信息,这些内容不会直接显示在网页上,但对网页的功能和表现至关重要。主要元素和功能1. 基础元素<title>:...

建站相关 typecho

thumbnail 2025-06-04

typecho前端实现站点语言的切换

前端修改的数据能及时反馈到后端,那当然需要一个前后端都可以无障碍读取的东西,所以最初是想要用localstorage,但发现php无法直接读取其值,所以就换成了cookie。前端通过js来设置参数值:document.cookie='...

建站相关 typecho

thumbnail 2025-06-02

typecho 主题中的模板与模块的概念

模板是 typecho 主题中一个重要的概念,我们说过typecho的极简主题可以只存在 index.php 这一个文件,但需要展现分类页的时候,typecho事实上会先去寻找名为 category.php 的分类页模板,文章页当然也...

建站相关 typecho

thumbnail 2025-06-02

typecho的几种常见的文章列表调用

处理好了header与面包屑,接下来就按照自己的需求自由发挥了,先放一个分类列表,再挑出一个喜欢的标签,自定义一个该标签下内容展示模块。Typecho 提供了多种文章循环方式,以下是常用的几种方法:标准文章循环<?php whi...

建站相关 typecho

thumbnail 2025-06-02

在typecho里实现面包屑导航

什么是面包屑导航面包屑导航是一种网站导航方式,通常在网站顶部显示,大多会放在站点header的下方,用于显示用户当前位置。 面包屑导航由导航元素构成,每个元素代表一个网站导航项,各个元素通常包含对应链接,供用户跳转。面包屑导航示例首页...

建站相关 typecho

thumbnail 2025-05-29

关于typecho中的路由知识

路由(Routing)是博客系统中将URL地址映射到具体处理逻辑的机制,它决定了当用户访问某个网址时,系统应该执行什么操作、显示什么内容。typecho站点一般都会开启伪静态,伪静态通过URL重写将"漂亮"的URL映射到实际的文件路径...

建站相关 typecho

thumbnail 2025-05-29

Typecho 模板中的翻译函数 _t 与 _e

在 Typecho 模板开发中,_t 和 _e 是用于国际化处理的函数,核心区别在于输出方式:"_t" 函数‌‌功能‌:获取翻译后的字符串但不直接输出,需结合 echo 使用。‌示例‌:<?php echo _t('欢迎语');...

建站相关 typecho

thumbnail 2025-05-26

typecho文章自定义字段的删除与修改

涉及数据库的操作,务必请提前做好备份!提前做好备份!!做好备份!!!小鸟数据的当前主题的缩略图字段命名为augPostThumb,这几天在尝试完善一下原有主题,下载了原站的数据库导入了测试站用于测试页面效果,测试主题的缩略图相关字段拟...

建站相关 typecho

thumbnail 2025-05-26

typecho的文章自定义字段的知识笔记

在typecho中,除了可以自定义设置项之外,我们也可以给文章自定义一些额外的字段,比如给文章编辑界面添加一个缩略图选项,或者增加一个keywords输入框,用来修改编辑当前内容页的关键词信息。// 主题设置 function th...

建站相关 typecho