Multi-language SEO goes far beyond translating meta tags. On TopVideoHub, which serves video content across 9 Asia-Pacific regions, I implemented a comprehensive SEO strategy for CJK and Southeast Asian languages.
The Multi-Language SEO Stack
- hreflang tags (covered in a previous article)
- Structured data with
inLanguage - Open Graph tags per region
- Dynamic meta descriptions
- CJK-aware title optimization
- Multi-language sitemap
Structured Data with VideoObject
Each video page includes Schema.org VideoObject markup with proper language tags:
function videoStructuredData(array $video, string $region): string {
$locale = Region::from($region)->hreflang();
$schema = [
'@context' => 'https://schema.org',
'@type' => 'VideoObject',
'name' => $video['title'],
'description' => $video['description'] ?? $video['title'],
'thumbnailUrl' => $video['thumbnail_url'],
'uploadDate' => $video['published_at'],
'embedUrl' => "https://www.youtube.com/embed/{$video['video_id']}",
'inLanguage' => $locale,
'interactionStatistic' => [
'@type' => 'InteractionCounter',
'interactionType' => 'https://schema.org/WatchAction',
'userInteractionCount' => $video['view_count'],
],
];
return '<script type="application/ld+json">'
. json_encode($schema, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)
. '</script>';
}
Key: JSON_UNESCAPED_UNICODE is essential. Without it, CJK characters get encoded as \uXXXX which some search engines handle poorly.
Region-Aware Meta Tags
class MetaGenerator {
public function generate(string $page, ?string $region, array $data): array {
$locale = $region ? Region::from($region)->hreflang() : 'en';
return match($page) {
'home' => $this->homeMeta($locale, $region),
'category' => $this->categoryMeta($locale, $region, $data['category']),
'watch' => $this->watchMeta($locale, $data['video']),
default => $this->defaultMeta($locale),
};
}
private function homeMeta(string $locale, ?string $region): array {
$titles = [
'en' => 'Trending Videos | TopVideoHub',
'ja' => '人気動画トレンド | TopVideoHub',
'ko' => '인기 동영상 트렌드 | TopVideoHub',
'zh-TW' => '熱門影片趨勢 | TopVideoHub',
'vi' => 'Video thịnh hành | TopVideoHub',
'th' => 'วิดีโอยอดนิยม | TopVideoHub',
];
$descriptions = [
'en' => 'Discover the best trending videos from Japan, Korea, Taiwan, Singapore and more. Browse trending content across 9 Asia-Pacific regions.',
'ja' => '日本、韓国、台湾、シンガポールなどアジア太平洋圣9地域のトレンド動画を発見。',
'ko' => '일본, 한국, 대만, 싱가포르 등 아시아 태평양 9개 지역의 인기 동영상을 발견하세요.',
];
return [
'title' => $titles[$locale] ?? $titles['en'],
'description' => $descriptions[$locale] ?? $descriptions['en'],
'og:locale' => str_replace('-', '_', $locale),
];
}
private function watchMeta(string $locale, array $video): array {
// For watch pages, use the video's actual title
$title = mb_substr($video['title'], 0, 60) . ' | TopVideoHub';
$desc = mb_substr($video['title'] . ' - ' . ($video['description'] ?? ''), 0, 155);
return [
'title' => $title,
'description' => $desc,
'og:type' => 'video.other',
'og:video' => "https://www.youtube.com/embed/{$video['video_id']}",
'og:image' => $video['thumbnail_url'],
'og:locale' => str_replace('-', '_', $locale),
];
}
}
CJK Title Optimization
CJK titles have different optimal lengths than English:
function optimizeTitle(string $title, string $locale): string {
$maxChars = match(true) {
str_starts_with($locale, 'ja'),
str_starts_with($locale, 'ko'),
str_starts_with($locale, 'zh') => 30, // CJK: ~30 chars visible in SERP
str_starts_with($locale, 'th'),
str_starts_with($locale, 'vi') => 50, // Thai/Vietnamese: similar to Latin
default => 60, // English/Latin: standard
};
$suffix = ' | TopVideoHub';
$available = $maxChars - mb_strlen($suffix);
if (mb_strlen($title) > $available) {
$title = mb_substr($title, 0, $available - 1) . '…';
}
return $title . $suffix;
}
Open Graph for Multi-Region Sharing
When someone shares a TopVideoHub link on social media, the OG tags should match the region:
function renderOGTags(array $meta): string {
$tags = '';
foreach ($meta as $property => $content) {
if (str_starts_with($property, 'og:')) {
$tags .= '<meta property="' . $property . '" content="'
. htmlspecialchars($content) . '">' . "\n";
}
}
return $tags;
}
Multi-Language Sitemap
The sitemap includes hreflang references and language-appropriate lastmod dates:
function generateMultiLangSitemap(\PDO $db): string {
$regions = ['US','GB','JP','KR','TW','SG','VN','TH','HK'];
$baseUrl = 'https://topvideohub.com';
$xml = '<?xml version="1.0" encoding="UTF-8"?>' . "\n";
$xml .= '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"' . "\n";
$xml .= ' xmlns:xhtml="http://www.w3.org/1999/xhtml">' . "\n";
// Home page with all regional variants
$xml .= " <url>\n <loc>{$baseUrl}/</loc>\n";
foreach ($regions as $r) {
$lang = Region::from($r)->hreflang();
$xml .= " <xhtml:link rel=\"alternate\" hreflang=\"{$lang}\" href=\"{$baseUrl}/?region={$r}\"/>\n";
}
$xml .= " <xhtml:link rel=\"alternate\" hreflang=\"x-default\" href=\"{$baseUrl}/\"/>\n";
$xml .= " </url>\n";
$xml .= '</urlset>';
return $xml;
}
SEO Impact on TopVideoHub
After implementing full multi-language SEO on TopVideoHub:
- Pages indexed by Google across 7+ regional search engines
- Organic traffic from Asian search engines grew significantly
- Google Search Console shows zero hreflang errors
- Video rich results appearing in Google Japan and Korea
Multi-language SEO is not optional for platforms targeting Asia-Pacific. It's the difference between being invisible and being discoverable in the world's largest digital market.
Top comments (0)