网络翻译 - 不同语言的单个文件或单独文件?

Web translating - single or separate files for different languages?

简短说明

这将是立陶宛语-英语网站(只有 2 种语言)。

这将是招聘信息网站,因此不应翻译内容。如果雇主提供的工作是英文的,那么即使立陶宛语是 selected,也应该是英文的。应仅翻译字段名称、按钮和错误消息。


简短问题

为两种语言创建单个文件 index.php 或为 LT 和 EN 语言创建单独文件的更好方法是什么?


第一种方式

所以我可以通过几种方式实现它,例如:

www.mysite.com/jobs -- default Lithuanian language
www.mysite.com/en/jobs -- English language

所以在这种情况下,我需要有 2 个重复的网站(刚刚翻译)立陶宛语存储在 root/ 文件夹中,英语存储在 root/en/ 文件夹中?因此,如果我在立陶宛语网站中更改某些内容,我需要在英语网站中进行精确更改吗?

写两次代码看起来不是什么好习惯。


第二种方式

创建类似于 $lang = "en"; 的变量,以如下方式将所有字段名称存储在数据库中:

Id    FieldName_lt      FieldName_en
1     Vardas            First Name
2     Pavardė           Last Name
3     El. paštas        E-mail 

和 select 通过 PHP 来自数据库,就像 SELECT FieldName_ . $lang FROM table...,但如果我在 SQL 查询中使用变量,它可能会被 SQL 注入。


第三种方式

也许在数组中存储字段名称是更好的方法(可能会有 150 多个字段)?

如果我选择第二种或第三种方式,我应该在 cookie 中保存语言选择吗?所以这样网站 url 总是会像下面这样?

www.mysite.com/jobs.php?lang=en
www.mysite.com/jobs.php?lang=lt

也许还有另一种方法可以做到,根本不在地址栏中显示语言选择?或者隐藏语言选择表单地址栏是不好的做法?


额外

在 HTML 表单中,我在以下方面使用数据验证:

<input type="text" id="first-name" placeholder="" required 
        data-validation="length alphanumeric" 
        data-validation-length="3-12" 
        data-validation-error-msg="User name has to be an alphanumeric value (3-12 chars)"/>

那么如何翻译错误消息?

我认为数据库的方法很好。每当您想更改某些内容的翻译时,您只需编辑 table 条目。你可以写一个 class 来为你翻译,所以你只需要传递语言 ID 和语言。

如何保存语言/如何显示它:这取决于它的用途。如果人们很可能经常在您的网站上分享 link,您可以在 url 中包含语言,例如作为 GET 参数。如果它应该 "just" 对于访问该站点的用户保持不变,cookie 是一个不错的方法。

使用 cookie 来存储语言首选项是一种选择,但可能会导致 SEO 出现一些问题,这与求职网站相关。

在不使用 cookie 的情况下,您可以按照建议将语言放在目录路径中。你不需要有 2 个单独的网站,你可以使用 url 重写将路径的一部分更改为查询参数(对于 apache 使用 mod_rewrite)。

只使用一个查询参数,就像你的第二个建议一样,但看起来不太好。

确保为用户提供切换语言的选项,例如使用旗帜图标或仅使用文本链接。

与数据库方法相同,您可以为每种语言和翻译使用静态文件。

en.php

return [
  "somekey" => "English Translation"
];

lt.php

return [
  "somekey" => "Lithunian Translation"
];

如果您需要一些目录结构,或者简单的查询参数或 cookie(由其他人指定),您可以 mod 重写以从 url 获取语言。如果您使用任何 RESTfull 服务,也可以在 HTTP header 中设置它。还有许多框架可以帮助您开箱即用地解析来自 url 的数据。

$langCode 是从 Query PAram、url 路径、header 或 cookie

中获取的语言代码

您也可以在使用require_once拉取翻译资源之前使用http://php.net/file_exists检查翻译文件是否可用。

获得语言代码后即可使用

$stringResource = require_once "lang/{$langCode}.php";

然后你就可以通过$stringResource中的key获取所有的资源了。

    <?php $stringResource = require_once "lang/{$langCode}.php"; ;?>

<input type="text" id="first-name" placeholder="" required 
        data-validation="length alphanumeric" 
        data-validation-length="3-12" 
        data-validation-error-msg="<?php echo $stringResource['somekey'] ;?>"/>

您可以直接在编辑器中编辑翻译。不需要连接到数据库,因为它只是关联数组。它会更快。

查询:

www.mysite.com/jobs.php?lang=zh-CN 如前所述,它将在 SEO 方面被忽略。查询参数被爬虫忽略。

URL路径

www.mysite.com/en/jobs.php

这里你需要做 mod 重写 http://httpd.apache.org/docs/2.0/misc/rewriteguide.html 基本上只是捕获 url 并取出 en 部分并重写为 www.mysite.com/jobs.php?lang=en

两个数据都可以从$_GET['lang']得到。但是 url 路径将对 SEO 有好处。

Cookies

不会显示在地址栏中。但这也意味着如果 link 与其他用户共享,他们将看不到原始语言,他们将看到默认语言。

https://support.google.com/webmasters/answer/182192?hl=en#1 根据 google 文档。我相信使用 url 路径会很好。