我非常不一个javascript / html / css人。
即便如此,我发现自己处于必须要做网页的位置。它是静态的,你唯一能做的就是点击标志来改变基于cookie的dispay语言。
如果cookie说“this”,我用一种语言写文本,如果cookie说“那”我用另一种语言写。这很好用,但我必须使用很多的document.write语句,这很丑陋。
现在我输入我想要的文字,并在emacs中使用宏来折叠文本
80个字符,并在每行的开头放置document.write("
,在结尾放置");
。然后我将其粘贴到if(cookie_this) { } else { }
。
必须有更好的方法来做...请?
的修改:
我正在寻找解决document.write
约束:
答案 0 :(得分:3)
您可以显示或隐藏给定lang
属性(或任何其他条件,例如类名)的内容。在jQuery和HTML中:
<p>Language:
<select id="languageSelector">
<option value="en">English</option>
<option value="es">Español</option>
</select>
</p>
<div lang="en-us">
Hello
</div>
<div lang="es">
Hola
</div>
<script type="text/javascript">
var defaultLanguage = 'en';
var validLanguages = ['en', 'es'];
function setLanguage(lang, setCookie) {
if(!$.inArray(languages, lang))
lang = defaultLang;
if(typeof(setCookie) != 'undefined' && setCookie) {
$.cookie('language', lang);
}
// Hide all things which can be hidden due to language.
$('*[lang]').filter(function() { return $.inArray(languages, $(this).attr('lang')); }).hide();
// Show currently selected language.
$('*[lang^=' + lang + ']).show();
}
$(function() {
var lang = $.cookie('language'); // use jQuery.cookie plugin
setLanguage(lang);
$('#languageSelector').change(function() {
setLanguage($(this).val(), true);
});
});
</script>
答案 1 :(得分:1)
jQuery可以轻松地做到这一点,但你可以创建一个元素然后设置元素innerHTML属性。您可能需要稍微更改一下您的呼叫,以便附加子元素。有关详细信息,请参阅createElement函数。例如
<script type="text/javascript">
function writeElement(language, elementId) {
var newElement = document.createElement("span");
if (language = "this") {
newElement.innerHTML = "text for this";
}
else {
newElement.innerHTML = "text for that";
}
var element = document.getElementById(elementId);
element.appendChild(newElement);
}
</script>
<强>用法强>
<span id="data1"></span>
<script type="text/javascript">
writeElement("this", "data1")
</script>
如果你可以支持jQuery,你可以添加一个评论,而你想要一个样本。
答案 2 :(得分:1)
我认为解决这个问题的正确方法是解析Accept-Language标头,然后执行此服务器端。
但是在您遇到客户端脚本的情况下。假设您的内容标记为此
<script type="text/javascript">
if(cookie_this) {
document.getElementById('esContent').style.display = 'block';
} else {
document.getElementById('enContent').style.display = 'block';
}
</script>
<div id="esContent" style="display:none">
Hola, mundo.
</div>
<div id="enContent" style="display:none">
Hello, world.
</div>
对于启用了CSS且禁用JavaScript的用户,这不会降低。其他方法可能包括使用Ajax基于cookie值加载内容(您可以使用jQuery)。
答案 3 :(得分:1)
如果您只想要一个可见的URL,但可以在服务器上托管多个页面,您也可以尝试XHR。我使用jQuery因为我最熟悉它,尽管它可以单独在javascript中实现:
<html>
<head>
<script type="text/javascript" src="path/to/jquery.js"> </script>
<script type="text/javascript">
$(document).ready(function () {
if (cookie_this) {
$("body").load("onelanguage.html body");
} else {
$("body").load("otherlanguage.html body");
}
});
</script>
</head>
<body>
</body>
</html>
答案 4 :(得分:0)
检测应该在服务器上(最好是基于客户端发送的Accept-Language标头),你应该发送一个已经本地化的静态文件。
答案 5 :(得分:0)
这不符合原始问题的(已修改)条件,但无论如何都可能有用。
使用服务器端脚本。您正在寻找的内容可以在PHP中轻松完成。你可能想要一个基于语言的文档层次结构,并且会在那里查找。例如,目录树:
/en/
/en/page1.html
/en/page2.html
/es/
/es/page1.html
/es/page2.html
在PHP中,它就像
一样简单$language = $_GET['lang'];
$page = $_GET['page'];
include($language . '/' . $page);
// URL is: /whatever.php?lang=LANGUAGE_HERE&page=PAGE_HERE
但是,这有很多安全问题。清理您的输入并确保目录和文件存在。富勒示例:
$contentRoot = './'; // CHANGE ME. Do include trailing /.
$defaultLanguage = 'en'; // CHANGE ME.
$defaultPage = 'home'; // CHANGE ME.
if(isset($_GET['lang']))
$language = $_GET['lang'];
else
$language = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 2);
if(isset($_GET['page']))
$page = $_GET['page'];
else
$page = $defaultPage;
$languageDir = basename($_GET['lang']) . '/';
$pageFile = basename($page) . '.html';
if(!file_exists($contentRoot . $languageDir) || !is_dir($contentRoot . $languageDir))
$languageDir = $defaultLanguage;
$fullFileName = $contentRoot . $languageDir . $pageFile;
if(!file_exists($fullFileName) || !is_file($fullFileName) || !is_readable($fullFileName))
$pageFile = $defaultPage;
readfile($fullFileName);
// Or, if you want to parse PHP in the file:
include($fullFileName);
您可能还想使用mod_rewrite
(Apache)来允许http://www.mysite.com/en/page1
等网址。 (请务必隐藏实际页面。)
// TODO mode_rewrite rules
另一种方法是将上述层次结构放入文档根目录并直接分发URL。这样可以降低功耗(例如模板化更困难),但您必须担心外部介质的正确引用。
如果您正在寻找动态方法,请在客户端使用Javascript来使用Ajax获取数据。这也很简单,不需要动态服务器后端。我推荐一个Javascript框架,比如jQuery,以使其尽可能简单。
答案 6 :(得分:0)
在JS中没有好办法做到这一点。最好的方法是使用非常简单的PHP代码。 但是,如果你愿意,JS中有一种方法 - 准备这样的页面: