---
title: "What are the language codes for Simplified and Traditional Chinese?"
description: "Simplified Chinese is `zh-Hans` and Traditional Chinese is `zh-Hant`, BCP 47 tags with an ISO 15924 script subtag. Add a region only when the market matters (`zh-Hans-CN`, `zh-Hant-TW`, `zh-Hant-HK`). The older `zh-CN` and `zh-TW` tags still work but only imply the script."
category: general
date: 2026-10-09
canonical: https://localizely.com/i18n-questions/general/what-are-the-language-codes-for-simplified-and-traditional-chinese/
---

# What are the language codes for Simplified and Traditional Chinese?

Simplified Chinese is `zh-Hans` and Traditional Chinese is `zh-Hant`. Both are BCP 47 language tags: `zh` is the ISO 639 code for Chinese and `Hans` and `Hant` are ISO 15924 script codes, so the tag names the writing system rather than the place where the reader lives.

Add a region subtag only when the content differs by market: `zh-Hans-CN` (mainland China), `zh-Hans-SG` (Singapore), `zh-Hant-TW` (Taiwan), `zh-Hant-HK` (Hong Kong), `zh-Hant-MO` (Macao). All of them are registered in the [IANA language subtag registry](https://www.iana.org/assignments/language-subtag-registry/language-subtag-registry), so any BCP 47 parser accepts them. [RFC 5646](https://www.rfc-editor.org/rfc/rfc5646) asks for "as precise a tag as possible, but no more specific than is justified", and for most apps two locales, `zh-Hans` and `zh-Hant`, are enough.

The older `zh-CN`, `zh-TW` and `zh-HK` tags are still everywhere. They are valid, but they name a region and leave the script implied: CLDR's likely-subtags data expands `zh-TW` to `zh-Hant-TW` and `zh-HK` to `zh-Hant-HK`, while plain `zh`, and with it `zh-CN` and `zh-SG`, resolves to Simplified. Script subtags remove that guesswork, for example for Traditional Chinese readers outside Taiwan and Hong Kong.

How each platform writes the same thing:

```html
<html lang="zh-Hant">
```

Android resource folders use the BCP 47 form with a `b+` prefix: `values-b+zh+Hans` and `values-b+zh+Hant` (Android's [resource docs](https://developer.android.com/guide/topics/resources/providing-resources) list this form from Android 7.0, API level 24); the legacy `values-zh-rCN` and `values-zh-rTW` folders still work.

iOS and macOS name `.lproj` folders after the Apple language ID, which follows BCP 47: `zh-Hans.lproj` and `zh-Hant.lproj`.

Flutter:

```dart
supportedLocales: const [
  Locale.fromSubtags(languageCode: 'zh', scriptCode: 'Hans'),
  Locale.fromSubtags(languageCode: 'zh', scriptCode: 'Hant'),
],
```

Two things that are not script codes. Cantonese is a separate language with its own subtag, `yue` (the registry lists it under the `zh` macrolanguage), so Cantonese as written in Hong Kong is `yue-Hant-HK`, not a variant of `zh-Hant`. And `zh-Hant-TW` and `zh-Hant-HK` differ in vocabulary and conventions, not in script, so split them into two locales only if you translate them separately.

Full lists: [language and country codes](/language-country-codes/) and [ISO 15924 script codes](/iso-15924-list/).

Source: https://localizely.com/i18n-questions/general/what-are-the-language-codes-for-simplified-and-traditional-chinese/
