javascript - PHP中的gettext翻译工作正常,但不适用于javascript
问题描述
我将 gettext 与 *.po 和 *.mo 文件结合使用,将我的小网站翻译成不同的语言。用户可以在下拉列表中选择他们的首选语言,网站会刷新并显示所选语言。
当涉及到翻译用户交互时出现的 javascript 内容时(例如:在输入字段下方键入至少 6 个字符的注释),我不知道如何正确解决它。有没有一种简单的方法可以像在 php 翻译中一样使用 gettext 来获取这些注释?我在这里阅读了很多关于它的内容并尝试了我能做的,但不知何故我无法弄清楚。
这是简化的 index.js 代码:
let messageUserText;
let userInput;
messageUserText = document.getElementById('userMsg');
userInput = document.getElementById('usernameInput');
function validInput() {
const userName = usernameInput.value;
let messageUserName = '';
if (userName === '') {
messageUserName = 'Please enter username';
} else if (userName.search(/[^a-zA-Z0-9üÜöÖäÄ]/) === -1) {
messageUserName = 'Username accepted';
} else {
messageUserName = 'Please check username';
}
messageUserText.innerHTML = messageUserName;
}
这是 index.php 中的简化代码:
<?php
require_once("locale.php");
include_once('header.php');
?>
...
<!-- DROPDOWN LANGUAGE SELECTION -->
<form name="locale" action="index.php" method="POST">
<button type="button" class="dropdown">
<!-- SHOW CHOSEN LANGUAGE -->
<?php
if (isset($_POST['locbtn'])) {
if ($_POST['locbtn'] === 'en_EN') {
echo "EN";
} else if ($_POST['locbtn'] === 'de_DE') {
echo "DE";
}
}
else {
echo "EN";
}?>
</button>
<ul class="dropdown-menu">
<li><button class="item" type="submit" value="en_EN" name="locbtn"><?php echo _("DE"); ?></button></li>
<li><button class="item" type="submit" value="de_DE" name="locbtn"><?php echo _("EN"); ?></button></li>
</ul>
</form>
...
<!-- INPUT FORM -->
<div>
<form>
<!-- Floating Labels INPUT USER -->
<input type="text"
placeholder="<?php echo _("Username"); ?>"
aria-label="<?php echo _("Username"); ?>"
id="usernameInput"
onkeyup="validInput()"
required>
<label for="usernameInput">
<?php echo _(" Username"); ?>
</label>
<!-- NOTE MESSAGE: THIS IS WHERE I CANT TRANSLATE APPEARING JAVASCRIPT CONTENT-->
<p id="userMsg"></p>
...
<!-- Javascripts-->
<script type="text/javascript" src="includes/js/index.js"></script>
<?php include('footer.php'); ?>
这是 locale.php
<?php
//Locale Main & HTML Handler
if (isset($_POST['locbtn'])) {
$locale = $_POST['locbtn'];
if ($_POST['locbtn'] === 'en_EN') {
$htmlLanguage = 'en';
} else if ($_POST['locbtn'] === 'de_DE') {
$htmlLanguage = 'de';
}
} else {
$htmlLanguage = 'en';
$locale = 'en_EN';
}
// Set lang env
putenv("LANGUAGE=$locale");
// Set locale:
setlocale( LC_MESSAGES, $locale);
// Name of translation files
$domain = 'test';
// Set the path for a domain
$pathToDomain = "/home/locale/";
bindtextdomain($domain, $pathToDomain);
// Set codeset
bind_textdomain_codeset($domain, 'UTF-8');
textdomain($domain);
?>
解决方案
这是一个使用对象创建每种语言翻译的键/值对的基本示例。
let selected_lang = "en"; //use cookies, localstorage or even php to hardcode the language that they previously selected
let translations = {};
translations["en"] = {
"username-empty" : "Please enter username",
"username-valid" : "Username accepted",
"username-unknown" : "Please check username"
};
translations["de"] = {
"username-empty" : "GERMAN Please enter username",
"username-valid" : "GERMAN Username accepted",
"username-unknown" : "GERMAN Please check username"
};
function getTranslation(field){
return translations[selected_lang][field];
}
function validInput() {
const userName = usernameInput.value;
let messageUserName = '';
if (userName === '') {
messageUserName = getTranslation("username-empty");
} else if (userName.search(/[^a-zA-Z0-9üÜöÖäÄ]/) === -1) {
messageUserName = getTranslation("username-valid");
} else {
messageUserName = getTranslation("username-unknown");
}
messageUserText.innerHTML = messageUserName;
}
console.log(getTranslation("username-unknown"))
推荐阅读
- webpack - Typescript,Webpack:未捕获的 TypeError:Object(...) 不是函数
- python - Matplotlib 具有固定的轴大小和轴外的图例
- c# - 如何要求 HTTPS 但不重定向
- logging - AEM 6.3 使用 appender 和 slf4j 自定义日志消息
- java - `Thread-`后面的数字是多少?
- angular - 带有 Firebase 和 Angular 6 的图库
- ios - 如何阻止 objc 代码转换为可选代码
- c++ - C++ 通用指针函数或模板
- c# - C# 中的静态构造函数死锁是否与 ECMA CLI 标准相矛盾?
- reporting-services - 如果组字段小计为零,SSRS 如何隐藏详细信息