WPML

WooCommerce 产品是带有自定义字段的自定义 WordPress“文章”。它们使用“产品分类”和“产品标签”自定义分类法进行排列。在这里,我们将向您展示多语言 WooCommerce 网站的工作原理,以及您的 WooCommerce 主题需要满足哪些条件才能实现 Multilingual Ready。

多语言 WooCommerce 网站的工作原理

当网站使用 WPML 时,系统会为每个内容元素分配一种语言。这意味着每个产品、分类和标签都将具有语言属性。翻译作为单独的产品保存在数据库中,并使用 WPML 的语言表链接在一起。翻译后的产品共享相同的图像,并拥有自己独立的字段,其中包含正确语言的文本。

分配给不同内容元素的翻译示例

网站管理员可以使用 WPML 的产品翻译表方便地进行翻译。这样,他们就可以专注于翻译所需的文本,而不必担心翻译是如何存储在数据库中的。

由于翻译在数据库中是分开的,因此显示多语言 WooCommerce 网站也很容易。实际上,如果您使用 WordPress 和 WooCommerce API,您的主题可能已经实现了 Multilingual Ready。只需进行少量测试和可能的微调,您就可以实现完全的多语言兼容性并进军新市场。

多语言 WooCommerce 网站所需的插件

要运行多语言 WooCommerce 网站,需要以下插件:

WPML 及所有相关插件(包括 WPML Multilingual & Multicurrency for WooCommerce)均包含在 Multilingual CMS 帐户类型中。

模板中的硬编码文本

您的模板文件会混合显示产品信息和硬编码文本。例如,大多数模板将包含产品名称和“Buy”链接。产品名称来自数据库,因此您无需担心如何翻译它。

您应确保使用 GetText 使所有硬编码文本都可翻译。

正确

<p><?php _e('Similar products:', 'my-textdomain') ?></p><input type="button" name="buy-button" value="<?php esc_attr_e('Buy now!', 'my-textdomain') ?>" />

在下面的示例中,“Similar products”和“Buy now!”没有包装在 GetText 调用中。

错误

<p><?php echo 'Similar products:'; ?></p>

<input type="button" name="buy-button" value="Buy now!" />

正确

<p><?php _e('Similar products:', 'my-textdomain') ?></p><input type="button" name="buy-button" value="<?php esc_attr_e('Buy now!', 'my-textdomain') ?>" />

错误

<p><?php echo 'Similar products:'; ?></p><input type="button" name="buy-button" value="Buy now!" />

Similar products”和“Buy now!”没有包装在 GetText 调用中。

正确错误
<p><?php _e('Similar products:', 'my-textdomain') ?></p><input type="button" name="buy-button" value="<?php esc_attr_e('Buy now!', 'my-textdomain') ?>" /><p><?php echo 'Similar products:'; ?></p><input type="button" name="buy-button" value="Buy now!" />Similar products”和“Buy now!”没有包装在 GetText 调用中。

确保对所有 GetText 调用使用主题的 textdomain。

硬编码的 WooCommerce 页面

许多电子商务主题包含特殊页面,例如购物车帐户页面。主题通常包含指向这些页面的链接,这些链接会显示在网站的每个页面上。

如果您对这些链接使用 WordPress 菜单,那么一切就绪。WPML 会为每种语言显示不同的 WordPress 菜单,因此指向这些“特殊页面”的链接会因语言而异。但是,如果您在模板文件中硬编码了这些链接,则需要允许 WPML 将这些链接替换为正确语言的页面链接。

链接到特殊 WooCommerce 页面的正确方法是使用 WordPress API 函数和 WooCommerce 页面 ID。WPML Multilingual & Multicurrency for WooCommerce 会过滤带有 WooCommerce 页面 ID 的 get_option() 调用。它将返回当前语言页面的 ID。

正确

<a href="<?php echo get_permalink(get_option('woocommerce_shop_page_id')) ?>"><?php _e('Shop page', 'my-textdomain') ?></a>
<a href="<?php echo get_permalink(wc_get_page_id('shop')) ?>"><?php _e('Shop page', 'my-textdomain') ?></a>

shop”是默认语言页面的别名。

错误

<a href="<?php echo get_permalink(5) ?>"><?php _e('Shop page', 'my-textdomain') ?></a>

shop page” ID 是硬编码的。它在不同网站和不同语言中会有所不同。

<a href="/shop"><?php _e('Shop page', 'my-textdomain') ?></a>

shop page” URL 是硬编码的。它在不同语言中会有所不同。

正确错误
<a href="<?php echo get_permalink(get_option('woocommerce_shop_page_id')) ?>"><?php _e('Shop page', 'my-textdomain') ?></a>

<a href="<?php echo get_permalink(wc_get_page_id('shop')) ?>"><?php _e('Shop page', 'my-textdomain') ?></a>
shop”是默认语言页面的别名。
<a href="<?php echo get_permalink(5) ?>"><?php _e('Shop page', 'my-textdomain') ?></a>
“shop page” ID 是硬编码的。它在不同网站和不同语言中会有所不同。<a href="/shop"><?php _e('Shop page', 'my-textdomain') ?></a>shop page” URL 是硬编码的。它在不同语言中会有所不同。

Multilingual Ready 产品列表

如果您使用 WooCommerce 简码来显示产品列表,那么一切就绪。WooCommerce 将加载正确语言的产品并将其显示出来。

如果您更喜欢使用自己的代码手动加载产品,请确保您使用的是 WordPress API 或 WooCommerce API 调用。如果您直接访问数据库,WPML 将不会过滤您的调用,您将获得所有语言的所有产品的混合列表。

正确

<?php $products = get_posts(array('post_type' => 'product', 'suppress_filters' => 0)); ?><?php
$args = array(
'post_type' => 'product',
'posts_per_page' => 10,
);
$products = new WP_Query( $args );
?>

错误

<?php $products = get_posts(array('post_type' => 'product')); ?>

suppress_filters 默认将设置为 true,这会阻止语言过滤。

$products = $wpdb->get_results($wpdb->prepare(“SELECT * FROM {$wpdb->posts} WHERE post_type='product' ORDER BY ID DESC LIMIT %d", 10));

WPML 不会过滤低级别的 SQL 查询。系统将返回所有语言的所有产品。

正确错误
<?php $products = get_posts(array('post_type' => 'product', 'suppress_filters' => 0)); ?><?php
$args = array(
'post_type' => 'product',
'posts_per_page' => 10,
);
$products = new WP_Query( $args );
?>
<?php $products = get_posts(array('post_type' => 'product')); ?>
suppress_filters 默认将设置为 true,这会阻止语言过滤。$products = $wpdb->get_results($wpdb->prepare(“SELECT * FROM {$wpdb->posts} WHERE post_type='product' ORDER BY ID DESC LIMIT %d", 10));
WPML 不会过滤低级别的 SQL 查询。系统将返回所有语言的所有产品。

加载正确的产品后,您在显示它们时就无需担心语言问题。每个产品都将带有自己的自定义字段,其中包含正确语言的信息。

Multilingual Ready 产品模板

由于翻译存储在单独的产品中,因此在多语言 WooCommerce 网站上显示单个产品不需要额外的操作。

多货币支付选项

您的多语言 WooCommerce 网站可能还包含多种货币。对于许多非美国网站来说,支持多种货币是一项非常重要的功能。例如,许多欧洲网站需要收取欧元、英镑和美元。东欧网站通常需要俄罗斯卢布,而亚洲网站则需要各种其他不同的货币。

WPML Multilingual & Multicurrency for WooCommerce 包含多货币支持功能。要允许访问者在货币之间切换,您的主题应包含一个可选的货币切换器。

您可以通过使用 PHP 调用或插入简码来显示货币切换器。

<?php do_action('currency_switcher', array('format' => '%name (%symbol)')); ?>
[currency_switcher]

有关更多信息,请参阅有关 WooCommerce 多货币的教程。请注意,只有在网站使用多种货币时,您才会在前端看到货币切换器。

使您的 WooCommerce 网站兼容 RTL

WooCommerce 主题需要遵循与任何其他 WordPress 主题相同的 RTL 主题支持指南。您应该创建一个 rtl.css 文件,其中包含用于 RTL 显示的 CSS 规则。

使用流式设计处理不同语言的不同文本长度

在创建 Multilingual Ready WooCommerce 主题时,请记住某些文本在某些语言中会更长,而在其他语言中会更短。有时,您甚至无法进行测试,因为您的最终用户将自行翻译。

例如,请看这两个产品区块。

针对英文短文本优化的 CSS

较长的西班牙语文本不适合该空间

根据经验,请使用长度为 2 倍和 1/2 的文本来测试您的主题。这将涵盖大多数情况。处理不同大小文本的最佳方法是允许流式布局。流式布局允许元素调整大小并占据它们所需的区域。创建具有流式大小的优雅模板并非易事,但这样做有助于避免视觉故障

文本从一行很好地换行到另一行,没有显示故障

准备好开始了吗?

如果您是开发人员,正在构建 WooCommerce 主题或扩展,您绝对应该加入我们的 Go Global 计划。您将获得一个免费的 WPML 开发者帐户,并获得我们兼容性团队的优先支持。WooCommerce 商店只是您主题的一个(重要)部分。您绝对应该阅读我们关于实现主题 WPML 兼容性的指南。

在为客户构建网站?购买 WPML,开始构建适用于 WooCommerce 及更多平台的多语言网站。

作者:Amir · 最后更新时间:2024年10月16日