首页>建站相关>typecho站点多语言设置简介

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();

被隐藏的语言设置项

Introduction_to_Multilingual_Settings_for_Typecho_Sites_p1

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

Introduction_to_Multilingual_Settings_for_Typecho_Sites_p2

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

Introduction_to_Multilingual_Settings_for_Typecho_Sites_p3

关于.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
    }
}
}

Introduction_to_Multilingual_Settings_for_Typecho_Sites_p4

整理好的文档内容如下,将其复制后保存为 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()" 输出翻译前的中文,看看会不会被自动转为英文吧。

Introduction_to_Multilingual_Settings_for_Typecho_Sites_p5

复制文档内容并另存为 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

移动端可扫我直达哦~

推荐阅读

typecho 2025-05-22

typecho主题的页眉header部分常用代码

网站页眉(Header)是网页顶部固定区域,包含网站核心导航和品牌标识,通常由Logo、主导航菜单、搜索框、实用工具(如登录/注册、购物车)和联系方式等组成。其特点是保持全站一致性、固定显示、响应式设计并强化品牌形象,设计需简洁明了、...

建站相关 typecho

typecho 2025-05-16

typecho 后台设置番外篇—数据的备份管理

因为考虑到服务器费用的问题,展开来说就是很多服务器商为了吸引用户,会给予新用户一个极低的价格,而在续费时却基本没有什么优惠,导致续费价格甚至需要在首年价格之后再添上一个0,也因此导致了一些不产生利润的站点如同候鸟一样在各大服务器商之间...

建站相关 typecho

typecho 2025-05-14

typecho后台设置页番外篇—设置页的美化

博主用过的typecho主题不多,见识也有限,在个人用过的主题里功能最全的那必须是joe主题。joe主题不光是有一个很漂亮的前台展现,对主题的后台也进行了美化,以下代码摘录自joe主题的functions.php文件。function...

建站相关 typecho

typecho 2025-04-29

typecho让后台设置的代码更为易读

利用deepseek写一个简单的后台控件类,来简化一下后台的书写,利用这个类,我们可以把参数以数组的形式组装在一起,由类来轮询读取并生成控件。虽然这个对于站点的运行速度不会有什么正向的收益,但因为后台设置我们可以仅在管理员登陆的情况下...

建站相关 typecho

typecho 2025-04-20

关于typecho主题的目录结构

wordpress的极简主题需要有两个文件,分别是index.php以及style.css,而在typecho中,因为主题的一些配置信息默认被放在了index.php而不是style.css文件中,所以直接往主题包里仍一个index....

建站相关 typecho

typecho 2025-04-20

从零开始做一个 Typecho 主题系列

Typecho是一款轻量级、高效的开源博客程序,由国内开发者团队开发维护。它采用PHP语言编写,支持MySQL、SQLite等多种数据库,安装包体积仅有500KB左右,运行时内存占用极低,却能提供出色的性能表现。这款博客程序最大的特点...

建站相关 typecho

typecho 2025-04-18

Typecho_Db 类以及各方法基础用例

Typecho_Db 是 Typecho 博客系统的数据库操作核心类,提供了数据库连接、查询构建和执行等功能。Typecho_Db 提供了简洁高效的数据库操作接口,是Typecho插件和主题开发中最常用的类之一。主要功能数据库连接管理...

建站相关 typecho

typecho 2025-04-16

typecho 1.2.1 给标签添加description说明文字

之前写过一篇为typecho标签添加说明字段的方法,对应的是typecho1.1版本,目前typecho的稳定版本是1.2.1, 因为服务器php版本较低,一直没有去尝试新版。这几天用小皮面板搭建了一个本地的php环境,终于是正经尝试...

建站相关 typecho

typecho 2025-04-11

Typecho博客系统中的config.inc.php文件

在 Typecho 博客系统中,config.inc.php 是一个核心配置文件,用于存储数据库连接信息和系统关键设置。它通常位于 Typecho 的安装根目录下,在安装过程中自动生成。Typecho 的安装包解压后并不包含这个文件,...

建站相关 typecho

typecho 2025-04-09

Typecho尝试获取主题的一些基础信息

在Typecho的主题一览里是利用了一个循环来遍历主题,遍历主题的时候可以通过activated参数来确定是否是当前主题,这样就可以利用官方提供的函数来获取主题信息了,缺点很明显,需要多使用一个循环,浪费资源。<?php \Wi...

建站相关 typecho

typecho 2025-04-02

typecho模板解析优先级

类似于wordpress ,Typecho的模板系统也遵循特定的优先级规则,当系统寻找模板文件时会按照以下顺序进行查找:模板文件查找优先级主题自定义模板 (最高优先级)usr/themes/[主题名]/[模板文件]例如:usr/the...

建站相关 typecho

typecho 2025-03-27

typecho如何实时更新被修改后的style.css文件

给新的站点“biib.top”加了个友情链接,顺便修改了一下主题的footer背景。但浏览器缓存了站点的css文件,修改后的效果并不实时生效。直接清除浏览器缓存是个简单粗暴的办法,问题在于这个效果也只是针对博主个人,用户可不会没事瞎清...

建站相关 typecho