我有一个 Next.js、Express Web 应用程序。
我想用两种语言制作我的网站,即英语和阿拉伯语。
我读过有关 i18n 的内容,但它不起作用。
在大多数语言中,例如英语和西班牙语,它们都是 LTR 导向的,因此翻译是可行的。
但是我不能只翻译阿拉伯语,因为我还必须将组件制作为RTL,所以我必须在阿拉伯语版本中更改一些CSS。 (不同的UI结构)
所以最好的解决方案是每页制作 2 页,一页阿拉伯文,一页英文。
import { useRouter } from 'next/router'
function BasePage () {
const router = useRouter()
return (
router.locale === 'en' ? (
<EnglishPage />
) : (
<ArabicPage />
)
)
}
但是这种方法行不通,因为它对 SEO 非常不利,因为没有任何东西会成为 SSR,所有页面都将是组件。
那么我还能做些什么来为每个内容制作 2 页吗?或者我应该考虑寻找重定向的解决方案?
您不需要为每种语言制作两个组件。您可以使用 i18n 库,例如next-intl 并通过
dir
元素中的 <html>
属性利用 CSS 中的 CSS 逻辑属性。
引用我在另一个问题的回答:
CSS 为逻辑属性提供内置支持。此功能允许您定义一次属性,浏览器会根据父级的
dir
属性自动调整它们,从而简化了样式。
例如,您应该选择
padding-left: 1rem
,而不是指定 padding-inline-start: 1rem
。
[property]-[axis]-[direction]: [value]
inline
或 block
。start
或 end
。
支持的属性包括:要利用逻辑属性,请设置父级的页面方向(或
html
标签),如下所示:
// This is a JSX code
<html dir={lang === "ar" ? "rtl" : "ltr"}>
随后,使用逻辑属性而不是物理属性。例如:
不要 | 做 |
---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
、 、 、
|
|
|
|
|
|
|
|
|
|
|
通过这样做,
padding-inline-start
在LTR语言中充当padding-left
,在RTL语言中充当padding-right
。对于从上到下的语言(例如日语),请使用 padding-block-start
而不是 padding-top
。