ساخت یک سایت چندزبانه با جنگو دروازهای برای ورود به بازارهای جهانی است، اما موفقیت در این مسیر نیازمند رعایت دقیق اصول سئوی بینالمللی (International SEO) است. یکی از مهمترین و در عین حال چالشبرانگیزترین بخشهای این فرآیند، پیادهسازی صحیح تگهای hreflang است. این تگها به گوگل و سایر موتورهای جستجو کمک میکنند تا نسخههای مختلف زبانی یا منطقهای یک صفحه را شناسایی کرده و نسخه مناسب را به کاربر نمایش دهند.
پیادهسازی نادرست hreflang میتواند منجر به مشکلاتی جدی مانند کنیبالیزیشن (رقابت صفحات خودی با یکدیگر)، ایندکس نشدن صفحات و نمایش نسخه زبانی اشتباه به کاربران شود. در این راهنمای کامل، به صورت قدم به قدم یاد میگیریم که چگونه به شکل اصولی و بهینه، مدیریت زبان در جنگو را انجام داده و تگهای hreflang را برای دستیابی به بهترین نتیجه در سئوی جهانی پیادهسازی کنیم.
تگ hreflang چیست و چرا برای سئوی بینالمللی حیاتی است؟
فهرست مقاله
- 1 تگ hreflang چیست و چرا برای سئوی بینالمللی حیاتی است؟
- 2 پیشنیازهای پیادهسازی hreflang در جنگو
- 3 روشهای پیادهسازی تگ hreflang در تمپلیتهای جنگو
- 4 مدیریت تگ x-default: استراتژی انتخاب زبان پیشفرض
- 5 اشتباهات رایج در پیادهسازی hreflang و نحوه جلوگیری از آنها
- 6 ابزارهای تست و اعتبارسنجی تگهای hreflang
- 7 جمعبندی: دستیابی به سئوی بینالمللی موفق با جنگو
- 8 سوالات متداول (FAQ)
تگ hreflang یک атрибуت HTML است که در بخش <head> صفحه قرار میگیرد و به موتورهای جستجو اعلام میکند که یک محتوا، نسخههای جایگزین برای زبانها یا مناطق جغرافیایی مختلف دارد. این تگ به گوگل سیگنال میدهد که صفحات مختلف با محتوای مشابه در زبانهای گوناگون، کپی یا تکراری نیستند، بلکه نسخههای معادل برای مخاطبان متفاوت هستند.
اهمیت این تگ برای یک سایت چندزبانه با جنگو در سه حوزه کلیدی خلاصه میشود:
- جلوگیری از محتوای تکراری (Duplicate Content): گوگل ممکن است محتوای ترجمهشده را به اشتباه به عنوان محتوای تکراری شناسایی کند.
hreflangاین ابهام را برطرف کرده و به گوگل میگوید این صفحات، جایگزین یکدیگرند نه کپی. - بهبود تجربه کاربری (User Experience): با استفاده از
hreflang، کاربری که از آلمان جستجو میکند، مستقیماً به نسخه آلمانی (de) صفحه هدایت میشود، نه نسخه انگلیسی (en). این کار نرخ پرش (Bounce Rate) را کاهش و رضایت کاربر را افزایش میدهد. - هدفگیری دقیق مخاطب: این تگها به شما اجازه میدهند تا نسخههای مختلف یک زبان را برای مناطق متفاوت هدفگیری کنید. برای مثال، میتوانید یک نسخه برای کاربران انگلیسیزبان در بریتانیا (
en-gb) و نسخهای دیگر برای کاربران آمریکایی (en-us) با واحد پول، اصطلاحات و پیشنهادات متفاوت داشته باشید.
پیشنیازهای پیادهسازی hreflang در جنگو
قبل از اینکه به سراغ کدنویسی برای افزودن تگهای hreflang برویم، باید مطمئن شویم که پروژه جنگوی ما به درستی برای پشتیبانی از چند زبان پیکربندی شده است. این زیرساخت برای مدیریت زبان در جنگو ضروری است.
فعالسازی Internationalization (i18n) و Localization (l10n)
جنگو ابزارهای قدرتمندی برای بینالمللیسازی (i18n) و محلیسازی (l10n) ارائه میدهد. برای فعالسازی آنها، تنظیمات زیر را در فایل settings.py پروژه خود اعمال کنید.
USE_I18N = True: این گزینه فریمورک ترجمه جنگو را فعال میکند.USE_L10N = True: این گزینه فرمتدهی دادهها (مانند تاریخ و اعداد) را بر اساس منطقه کاربر فعال میکند.LANGUAGES: لیستی از زبانهایی که سایت شما پشتیبانی میکند را تعریف کنید. این لیست شامل یک تاپل از کد زبان و نام آن است.LOCALE_PATHS: مسیری که فایلهای ترجمه (.poو.mo) در آن قرار دارند را مشخص کنید.
# settings.py
# ... سایر تنظیمات
# فعالسازی پشتیبانی از چند زبان
USE_I18N = True
USE_L10N = True
# زبانهای پشتیبانی شده
LANGUAGES = [
('fa', 'Farsi'),
('en', 'English'),
('de', 'German'),
]
# مسیر فایلهای ترجمه
LOCALE_PATHS = [
BASE_DIR / 'locale',
]
# Middleware برای تشخیص زبان
MIDDLEWARE = [
# ...
'django.middleware.locale.LocaleMiddleware',
# ...
]
اطمینان حاصل کنید که LocaleMiddleware در MIDDLEWARE شما وجود دارد و در جای درستی (بعد از SessionMiddleware و قبل از CommonMiddleware) قرار گرفته است.
ساختار URL برای سایت چندزبانه
بهترین و شفافترین روش برای مدیریت زبان در جنگو، استفاده از پیشوند زبان در URL است (مانند example.com/fa/about-us/ و example.com/en/about-us/). این ساختار هم برای کاربران و هم برای موتورهای جستجو قابل فهم است. جنگو با استفاده از تابع i18n_patterns این کار را بسیار ساده میکند.
در فایل urls.py اصلی پروژه، الگوهای URL خود را درون i18n_patterns قرار دهید.
# myproject/urls.py
from django.contrib import admin
from django.urls import path, include
from django.conf.urls.i18n import i18n_patterns
urlpatterns = [
path('admin/', admin.site.urls),
]
urlpatterns += i18n_patterns(
# URLهای خود را که نیاز به ترجمه دارند اینجا قرار دهید
path('', include('myapp.urls')),
# برای مثال: path('about/', views.about_view, name='about'),
# پیشوند /fa/ یا /en/ به این URLها اضافه خواهد شد
)
با این پیکربندی، جنگو به طور خودکار URLها را با پیشوند زبان مدیریت میکند و مکانیزم لازم برای جابجایی بین زبانها را فراهم میسازد.
روشهای پیادهسازی تگ hreflang در تمپلیتهای جنگو
اکنون که زیرساخت لازم فراهم شده، به بخش اصلی یعنی تولید دینامیک تگهای hreflang در تمپلیتها میپردازیم. راهکار ایدهآل، استفاده از یک Custom Template Tag است تا از تکرار کد جلوگیری کرده و مدیریت آن را آسان سازد.
روش پیشنهادی: استفاده از Template Tag سفارشی
این روش به شما اجازه میدهد تا با فراخوانی یک تگ ساده در تمپلیت پایه (base.html)، تمام لینکهای hreflang مورد نیاز را به صورت خودکار تولید کنید.
قدم اول: ساختار فایلها
در یکی از اپلیکیشنهای خود (مثلاً core یا main)، پوشهای به نام templatetags بسازید. درون آن، دو فایل __init__.py (خالی) و یک فایل پایتون دیگر (مثلاً language_tags.py) ایجاد کنید.
myapp/
├── templatetags/
│ ├── init.py
│ └── language_tags.py
├── …
قدم دوم: کدنویسی Template Tag
فایل language_tags.py را باز کرده و کد زیر را در آن قرار دهید. این کد یک تگ به نام get_hreflang_tags ایجاد میکند که لیستی از URLهای جایگزین برای هر زبان را برمیگرداند.
# myapp/templatetags/language_tags.py
from django import template
from django.conf import settings
from django.urls import resolve, reverse
from django.utils.translation import activate, get_language
register = template.Library()
@register.inclusion_tag('partials/hreflang_links.html', takes_context=True)
def get_hreflang_tags(context):
"""
این تگ، لینکهای hreflang را برای تمام زبانهای تعریفشده در settings.py تولید میکند.
همچنین تگ x-default را برای زبان پیشفرض (اولین زبان در LANGUAGES) میسازد.
"""
request = context['request']
current_language = get_language()
try:
url_parts = resolve(request.path_info)
url_name = url_parts.url_name
url_args = url_parts.args
url_kwargs = url_parts.kwargs
except Exception:
# اگر URL قابل شناسایی نباشد (مثلا صفحه 404)، تگها را رندر نمیکنیم
return {'hreflang_links': []}
hreflang_links = []
for lang_code, _ in settings.LANGUAGES:
try:
activate(lang_code)
# URL را برای زبان مورد نظر بازسازی میکنیم
translated_url = reverse(url_name, args=url_args, kwargs=url_kwargs)
hreflang_links.append({
'lang_code': lang_code,
'url': request.build_absolute_uri(translated_url),
})
except Exception:
# اگر ترجمه برای یک زبان خاص وجود نداشت، از آن عبور میکنیم
continue
# بازگرداندن زبان به حالت اولیه
activate(current_language)
# افزودن تگ x-default
# استراتژی: زبان اول در لیست LANGUAGES به عنوان پیشفرض در نظر گرفته میشود
if hreflang_links:
default_lang_code = settings.LANGUAGES[][]
activate(default_lang_code)
try:
default_url = reverse(url_name, args=url_args, kwargs=url_kwargs)
hreflang_links.append({
'lang_code': 'x-default',
'url': request.build_absolute_uri(default_url),
})
finally:
activate(current_language)
return {'hreflang_links': hreflang_links}
قدم سوم: ساخت تمپلیت برای تگ
یک تمپلیت کوچک برای رندر کردن لینکها بسازید. در اپلیکیشن خود، پوشه templates/partials/ را ایجاد و فایل hreflang_links.html را با محتوای زیر درون آن قرار دهید.
<!-- templates/partials/hreflang_links.html -->
{% for link in hreflang_links %}
<link rel="alternate" hreflang="{{ link.lang_code }}" href="{{ link.url }}" />
{% endfor %}
قدم چهارم: استفاده از تگ در تمپلیت اصلی
اکنون کافی است در تمپلیت پایه سایت خود (base.html)، این تگ را در بخش <head> فراخوانی کنید.
<!-- templates/base.html -->
{% load language_tags %}
<!DOCTYPE html>
<html lang="{{ request.LANGUAGE_CODE }}">
<head>
<meta charset="UTF-8">
<title>...</title>
<!-- تولید خودکار تگهای hreflang -->
{% get_hreflang_tags %}
<!-- سایر تگهای متا -->
</head>
<body>
...
</body>
</html>
با این روش، برای هر صفحهای که کاربر مشاهده میکند، به طور خودکار مجموعهای کامل از تگهای hreflang، شامل لینک به خود صفحه (self-referencing)، لینک به تمام زبانهای دیگر و تگ x-default تولید میشود. این راهکار کاملاً پویا و مقیاسپذیر است.
مدیریت تگ x-default: استراتژی انتخاب زبان پیشفرض
تگ hreflang="x-default" یکی از مهمترین و در عین حال کمتر درکشدهترین بخشهای سئوی بینالمللی است. این تگ به گوگل میگوید: “اگر زبان یا منطقه کاربر با هیچکدام از نسخههای مشخصشده مطابقت نداشت، او را به این URL بفرست.”
کد بالا اولین زبان تعریفشده در settings.LANGUAGES را به عنوان x-default در نظر میگیرد. این یک استراتژی رایج است، اما استراتژیهای بهتری نیز وجود دارد:
- صفحه انتخاب زبان: بهترین گزینه برای
x-default، یک صفحه فرود است که به کاربر اجازه میدهد زبان یا کشور مورد نظر خود را انتخاب کند. این صفحه نبایدhreflangخاصی داشته باشد. - محبوبترین زبان: میتوانید زبان انگلیسی یا هر زبانی که بیشترین مخاطب جهانی را دارد به عنوان
x-defaultانتخاب کنید. - صفحه اصلی سایت (بدون پیشوند زبان): اگر صفحه اصلی شما قابلیت تشخیص خودکار زبان کاربر (مثلاً بر اساس IP یا هدرهای مرورگر) را دارد، میتوانید آن را به عنوان
x-defaultمعرفی کنید.
برای پیادهسازی یک استراتژی متفاوت، کافی است منطق بخش x-default را در کد Template Tag تغییر دهید تا URL دلخواه شما را تولید کند.
اشتباهات رایج در پیادهسازی hreflang و نحوه جلوگیری از آنها
حتی با بهترین ابزارها، اشتباهات کوچک میتوانند کل استراتژی سئوی بینالمللی شما را تضعیف کنند. از این اشتباهات رایج دوری کنید:
- پیوندهای یکطرفه (Non-reciprocal links): تمام تگهای
hreflangباید دوطرفه باشند. اگر صفحه A به صفحه B لینک میدهد، صفحه B نیز باید به صفحه A لینک دهد. Template Tag سفارشی ما این مورد را به طور خودکار رعایت میکند. - استفاده از کدهای زبان یا کشور اشتباه: همیشه از کدهای استاندارد استفاده کنید: کد زبان ISO 639-1 و کد منطقه ISO 3166-1 Alpha 2. برای مثال
faصحیح است، اماirبه تنهایی اشتباه است (بایدfa-irباشد). - لینک دادن به صفحات غیرمرتبط یا ریدایرکت شده: URL موجود در
hreflangباید به نسخه ترجمهشده و کانونیکال (Canonical) همان محتوا اشاره کند و کد وضعیت200 OKرا برگرداند. - فراموش کردن تگ ارجاع به خود (Self-referencing): هر صفحه باید یک تگ
hreflangداشته باشد که به URL خودش اشاره میکند. این سیگنال را تقویت میکند که این صفحه بخشی از یک مجموعه چندزبانه است. - پیادهسازی ناقص: تگهای
hreflangباید در تمام نسخههای زبانی یک صفحه وجود داشته باشند. اگر نسخههای انگلیسی، فارسی و آلمانی دارید، هر سه صفحه باید حاوی سه تگhreflang(و یکx-default) باشند.
ابزارهای تست و اعتبارسنجی تگهای hreflang
پس از پیادهسازی، هرگز بدون تست و اعتبارسنجی کار را تمامشده ندانید. از ابزارهای زیر برای اطمینان از صحت عملکرد استفاده کنید:
- Google Search Console: گزارش “هدفگیری بینالمللی” (International Targeting) در سرچ کنسول قدیمی (که هنوز دادههای ارزشمندی دارد) یا بخش “Enhancements” در نسخههای جدیدتر، خطاها و مشکلات مربوط به
hreflangرا به شما نشان میدهد. - Ahrefs Site Audit: این ابزار قدرتمند در بخش “Localization” گزارش کاملی از وضعیت تگهای
hreflangسایت شما، شامل لینکهای شکسته، کدهای اشتباه و مشکلات بازگشتی ارائه میدهد. - SEMrush Site Audit: مشابه Ahrefs، این ابزار نیز بخشی اختصاصی برای بررسی مسائل سئوی بینالمللی و تگهای
hreflangدارد. - Hreflang Tags Testing Tool by Merkle: این ابزار آنلاین به شما اجازه میدهد URL یک صفحه را وارد کنید تا صحت تگهای
hreflangآن را بررسی کند.
جمعبندی: دستیابی به سئوی بینالمللی موفق با جنگو
پیادهسازی صحیح hreflang در یک سایت چندزبانه با جنگو بیش از یک بهینهسازی فنی است؛ این یک سرمایهگذاری استراتژیک برای رشد جهانی کسبوکار شماست. با پایهگذاری یک ساختار URL تمیز مبتنی بر پیشوند زبان و استفاده از یک Template Tag سفارشی، شما فرآیندی مقیاسپذیر، قابل نگهداری و بهینه برای مدیریت زبان در جنگو ایجاد میکنید. این رویکرد نه تنها مشکلات محتوای تکراری را حل میکند، بلکه با ارائه محتوای مناسب به مخاطب درست، تجربه کاربری را به شکل چشمگیری بهبود میبخشد و شانس شما را برای کسب رتبههای برتر در نتایج جستجوی جهانی افزایش میدهد. به یاد داشته باشید که hreflang یک سیگنال فنی است، اما موفقیت نهایی در سئوی بینالمللی به کیفیت محتوای ترجمهشده و درک عمیق از نیازهای مخاطبان در هر بازار بستگی دارد.
سوالات متداول (FAQ)
۱. تفاوت بین تگ hreflang و canonical چیست؟
تگ canonical به موتور جستجو میگوید که کدام نسخه از یک صفحه (در صورت وجود محتوای مشابه یا تکراری) نسخه “اصلی” یا “مرجع” است و باید ایندکس شود. در مقابل، تگ hreflang میگوید که این صفحات، نسخههای “جایگزین” برای زبانها یا مناطق مختلف هستند و هیچکدام بر دیگری ارجحیت ندارند، بلکه همگی معتبرند. این دو تگ میتوانند و باید با هم استفاده شوند.
۲. آیا برای هدفگیری مناطق مختلف با یک زبان (مثلاً آمریکا و انگلیس) هم به hreflang نیاز است؟
بله، این یکی از کاربردهای کلیدی hreflang است. شما میتوانید با استفاده از کدهای en-us و en-gb به گوگل اعلام کنید که کدام صفحه برای کاربران آمریکایی (با قیمت دلار و املای آمریکایی) و کدام برای کاربران بریتانیایی (با قیمت پوند و املای بریتانیایی) مناسب است.
۳. اگر برخی از صفحات سایت ترجمه نشده باشند، تکلیف hreflang چه میشود؟
هیچ مشکلی نیست. شما فقط باید تگهای hreflang را برای نسخههایی که وجود دارند قرار دهید. اگر یک مقاله فقط به زبان فارسی و انگلیسی موجود است اما سایت شما زبان آلمانی را هم پشتیبانی میکند، در آن صفحه خاص فقط تگهای hreflang برای fa و en قرار میگیرند. Template Tag سفارشی معرفیشده این مورد را به طور خودکار مدیریت میکند.
۴. پیادهسازی hreflang در هدر HTML بهتر است یا در نقشه سایت (Sitemap)؟
هر دو روش معتبر هستند. پیادهسازی در <head> صفحه (روشی که در این مقاله توضیح داده شد) باعث میشود موتورهای جستجو هنگام خزش صفحه، فوراً سیگنالها را دریافت کنند و برای سایتهای داینامیک مانند جنگو، مدیریت آن سادهتر است. استفاده از نقشه سایت برای سایتهای بسیار بزرگ (صدها هزار صفحه) میتواند بار سرور را کاهش دهد، اما پیادهسازی آن پیچیدهتر است. برای اکثر پروژهها، روش هدر HTML توصیه میشود.


