{"id":375739,"date":"2026-09-27T11:47:18","date_gmt":"2026-09-27T11:47:18","guid":{"rendered":"https:\/\/uk.wordpress.org\/plugins\/translit-standards\/"},"modified":"2026-09-27T11:47:06","modified_gmt":"2026-09-27T11:47:06","slug":"plugforge-transliteration-standards","status":"publish","type":"plugin","link":"https:\/\/pcd.wordpress.org\/plugins\/plugforge-transliteration-standards\/","author":23553886,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"0.1.0","stable_tag":"0.1.0","tested":"7.1.2","requires":"6.2","requires_php":"7.4","requires_plugins":null,"header_name":"PlugForge Transliteration Standards","header_author":"PlugForge","header_description":"Transliterates new slugs and file names using documented national, UN and BGN\/PCGN romanisation standards. Thirteen of them, across eleven languages.","assets_banners_color":"fcf5ed","last_updated":"2026-09-27 11:47:06","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/plugforge.net\/plugins\/plugforge-transliteration-standards\/","header_author_uri":"https:\/\/plugforge.net\/","rating":0,"author_block_rating":0,"active_installs":0,"downloads":45,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"0.1.0":{"tag":"0.1.0","author":"plugforge","date":"2026-09-27 11:47:06","revision":3715430}},"upgrade_notice":[],"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3715430,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3715430,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3715430,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3715430,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["0.1.0"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3715430,"resolution":"1","location":"assets","locale":"","width":944,"height":1463},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3715430,"resolution":"2","location":"assets","locale":"","width":944,"height":2016},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3715430,"resolution":"3","location":"assets","locale":"","width":944,"height":939}},"screenshots":{"1":"A standard per language, each linked to the document it comes from. The\npreview beside every choice shows the address that choice would produce.","2":"What your existing slugs would become, with the language each post is in.\nThe whole list downloads as a CSV, and rewriting needs a tick and a click.","3":"Exceptions are whole words and whole phrases, for brand names and for\nspellings someone's passport already carries."}},"plugin_section":[],"plugin_tags":[6562,561,8312,161908,286],"plugin_category":[45],"plugin_contributors":[282004],"plugin_business_model":[],"class_list":["post-375739","plugin","type-plugin","status-publish","hentry","plugin_tags-cyrillic","plugin_tags-slug","plugin_tags-transliteration","plugin_tags-ukrainian","plugin_tags-woocommerce","plugin_category-ecommerce","plugin_contributors-plugforge","plugin_committers-plugforge"],"banners":{"banner":"https:\/\/ps.w.org\/plugforge-transliteration-standards\/assets\/banner-772x250.png?rev=3715430","banner_2x":"https:\/\/ps.w.org\/plugforge-transliteration-standards\/assets\/banner-1544x500.png?rev=3715430","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/plugforge-transliteration-standards\/assets\/icon-128x128.png?rev=3715430","icon_2x":"https:\/\/ps.w.org\/plugforge-transliteration-standards\/assets\/icon-256x256.png?rev=3715430","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/plugforge-transliteration-standards\/assets\/screenshot-1.png?rev=3715430","caption":"A standard per language, each linked to the document it comes from. The\npreview beside every choice shows the address that choice would produce."},{"src":"https:\/\/ps.w.org\/plugforge-transliteration-standards\/assets\/screenshot-2.png?rev=3715430","caption":"What your existing slugs would become, with the language each post is in.\nThe whole list downloads as a CSV, and rewriting needs a tick and a click."},{"src":"https:\/\/ps.w.org\/plugforge-transliteration-standards\/assets\/screenshot-3.png?rev=3715430","caption":"Exceptions are whole words and whole phrases, for brand names and for\nspellings someone's passport already carries."}],"raw_content":"<!--section=description-->\n<p>Cyrillic, Greek, Georgian or Armenian in a URL gets percent-encoded, and a link\nthat reads <code>%d0%ba%d0%b8%d1%97%d0%b2<\/code> is no use to anyone. Transliteration\nfixes that. The question is which Latin letters to use, and tables written so\nthe Latin can be turned back into the original produce addresses no one would\ntype, such as <code>shhastya<\/code> or <code>czokol<\/code>.<\/p>\n\n<p>PlugForge Transliteration Standards uses the romanisation standards that countries and the\nUnited Nations publish: a resolution of Ukraine's Cabinet of Ministers,\nBulgaria's Transliteration Act, Georgia's national system and others. Some of\nthem change a letter by its place in the word. Bulgarian \u0438\u044f is ia at the end of\na word and iya inside one, and the plugin follows rules like that as written.<\/p>\n\n<p>Nothing changes until you choose a standard for a language.<\/p>\n\n<h4>Features<\/h4>\n\n<ul>\n<li>13 standards for 11 languages, each linked to its source document.<\/li>\n<li>New posts, pages, terms, products and uploaded files get readable addresses.<\/li>\n<li>Exceptions for brand names and established spellings, as whole words or\nwhole phrases.<\/li>\n<li>The language of each post with Polylang.<\/li>\n<li>A report of what your existing post slugs would become, with a CSV download.<\/li>\n<li>Nothing loaded on the public site, and no outbound requests.<\/li>\n<\/ul>\n\n<h4>Supported standards<\/h4>\n\n<ul>\n<li><strong>Ukrainian<\/strong>: Resolution no. 55 of the Cabinet of Ministers, 27 January\n\n<ol>\n<li>\u041a\u0438\u0457\u0432 \u2192 <code>kyiv<\/code>. All 76 worked examples in its annex come out exactly.\n<a href=\"https:\/\/zakon.rada.gov.ua\/laws\/show\/55-2010-\u043f\">https:\/\/zakon.rada.gov.ua\/laws\/show\/55-2010-\u043f<\/a><\/li>\n<\/ol><\/li>\n<li><strong>Russian<\/strong>: Three standards, because Russian has three and they disagree.\nPick the one your paperwork names. ICAO Doc 9303, what a Russian passport\nuses: \u042e\u0436\u043d\u043e \u2192 <code>iuzhno<\/code>. BGN\/PCGN 1947, what English-language publishing uses:\n\u042e\u0436\u043d\u043e \u2192 <code>yuzhno<\/code>. \u0413\u041e\u0421\u0422 7.79-2000 system B, the reversible scheme described\nabove, for matching addresses your site already has: \u0426\u043e\u043a\u043e\u043b\u044c \u2192 <code>czokol<\/code>.\n<a href=\"https:\/\/www.icao.int\/sites\/default\/files\/publications\/DocSeries\/9303_p3_cons_en.pdf\">https:\/\/www.icao.int\/sites\/default\/files\/publications\/DocSeries\/9303_p3_cons_en.pdf<\/a><\/li>\n<li><strong>Bulgarian<\/strong>: The Transliteration Act of 2009, an act of parliament.\n\u0421\u043e\u0444\u0438\u044f \u2192 <code>sofia<\/code>.\n<a href=\"https:\/\/www.mrrb.bg\/static\/media\/ups\/articles\/attachments\/TRANSLITERATION%20ACT48938c89238d30492f9d6456d4b8ee7e.pdf\">https:\/\/www.mrrb.bg\/static\/media\/ups\/articles\/attachments\/TRANSLITERATION%20ACT48938c89238d30492f9d6456d4b8ee7e.pdf<\/a><\/li>\n<li><strong>Serbian<\/strong>: The United Nations system of 1977, which is Gaj's Latin\nalphabet. \u0428\u0430\u0431\u0430\u0446 \u2192 <code>sabac<\/code>. <a href=\"https:\/\/arhiiv.eki.ee\/wgrs\/rom1_sr.htm\">https:\/\/arhiiv.eki.ee\/wgrs\/rom1_sr.htm<\/a><\/li>\n<li><strong>Macedonian<\/strong>: The United Nations system of 1977. \u040c\u0435\u0441\u0435\u043d\u0434\u0440\u0435 \u2192 <code>kesendre<\/code>.\n<a href=\"https:\/\/arhiiv.eki.ee\/wgrs\/rom1_mk.htm\">https:\/\/arhiiv.eki.ee\/wgrs\/rom1_mk.htm<\/a><\/li>\n<li><strong>Belarusian<\/strong>: The United Nations system of 2012, based on the national\n\u0142acinka of 2007. \u0412\u0456\u0446\u0435\u0431\u0441\u043a \u2192 <code>viciebsk<\/code>. <a href=\"https:\/\/arhiiv.eki.ee\/wgrs\/rom1_be.htm\">https:\/\/arhiiv.eki.ee\/wgrs\/rom1_be.htm<\/a><\/li>\n<li><strong>Greek<\/strong>: ELOT 743, what Greece prints on passports and road signs.\n\u0386\u03b3\u03b3\u03b5\u03bb\u03bf\u03c2 \u2192 <code>angelos<\/code>. <a href=\"https:\/\/arhiiv.eki.ee\/wgrs\/rom1_el.htm\">https:\/\/arhiiv.eki.ee\/wgrs\/rom1_el.htm<\/a><\/li>\n<li><strong>Georgian<\/strong>: The national system of 2002, approved by presidential decree\nin 2011. \u10d7\u10d1\u10d8\u10da\u10d8\u10e1\u10d8 \u2192 <code>tbilisi<\/code>.\n<a href=\"https:\/\/matsne.gov.ge\/ka\/document\/view\/1216954?publication=0\">https:\/\/matsne.gov.ge\/ka\/document\/view\/1216954?publication=0<\/a><\/li>\n<li><strong>Kazakh<\/strong>: BGN\/PCGN 1979, for Kazakh written in Cyrillic. Kazakhstan\npublishes no romanisation of its own. \u049a\u044b\u0437\u044b\u043b\u043e\u0440\u0434\u0430 \u2192 <code>qyzylorda<\/code>.<\/li>\n<li><strong>Armenian<\/strong>: BGN\/PCGN 1981, for eastern Armenian. \u0535\u0580\u0587\u0561\u0576 \u2192 <code>yerevan<\/code>.\n<a href=\"https:\/\/assets.publishing.service.gov.uk\/media\/636cd40ad3bf7f164de3c9f3\/ROMANIZATION_OF_ARMENIAN_2022_final.pdf\">https:\/\/assets.publishing.service.gov.uk\/media\/636cd40ad3bf7f164de3c9f3\/ROMANIZATION_OF_ARMENIAN_2022_final.pdf<\/a><\/li>\n<li><strong>Mongolian<\/strong>: MNS 5217:2012, Mongolia's own standard. \u0423\u043b\u0430\u0430\u043d\u0431\u0430\u0430\u0442\u0430\u0440 \u2192\n  ulaanbaatar.<\/li>\n<\/ul>\n\n<p>An address keeps plain letters only. WordPress folds diacritics away, so\nSerbian \u040b\u0438\u0440\u0438\u043b\u0438\u0446\u0430 and \u0427\u0438\u0440\u0438\u043b\u0438\u0446\u0430 both end up as <code>cirilica<\/code>, and the apostrophes\nthe Georgian and Armenian standards write are dropped.<\/p>\n\n<h4>Existing URLs<\/h4>\n\n<p>Installing the plugin changes no existing address.<\/p>\n\n<p>The \"What would change\" screen lists your existing posts whose slug does not\nmatch the standard you chose, with the address each has now, the address it\nwould get and the language of the post. A row that would collide with another\nis marked and left for you to resolve by hand. Reading the list or downloading\nit as a CSV changes nothing.<\/p>\n\n<p>A button under the list rewrites the posts on that page, after you tick a box\nto confirm. WordPress keeps each old post slug and redirects it to the new one,\nso links already published go on working.<\/p>\n\n<p>Pages, categories, tags and media files already on your site are never\nconverted. WordPress keeps no record of their old addresses, so nothing would\nredirect them.<\/p>\n\n<h4>Exceptions<\/h4>\n\n<p>Whole words and whole phrases for brand names and for spellings someone's\npassport already carries. One per line: the word or phrase, an equals sign,\nwhat it becomes.<\/p>\n\n<pre><code>\u0432\u043e\u0440\u0434\u043f\u0440\u0435\u0441 = wordpress\n\u0416\u0443\u043a\u043e\u0432\u0441\u044c\u043a\u0438\u0439 = Zhukovsky\n<\/code><\/pre>\n\n<p>Matching ignores case, and spaces, hyphens and underscores between words count\nas the same join. Only whole words are replaced. Digits and symbols that belong\nto a name, as in \u0424\u043e\u0440\u043c\u0443\u043b\u0430 1 or AT&amp;T, have to be written as they appear.<\/p>\n\n<h4>Multilingual sites<\/h4>\n\n<p>On a site with one language, the standard follows the site language. With\nPolylang, it follows the language set on each post or term, so two posts in the\nsame admin can go through two different standards. On such a site, a slug that\ncarries no language, such as one created by WP-CLI, is left alone.<\/p>\n\n<p>The language is never guessed from the text: \u0413\u043e\u0440\u0430 is <code>hora<\/code> in Ukrainian and\n    gora in Russian, and the letters are identical.<\/p>\n\n<p>WPML is not supported, because it has not been tested with this plugin.<\/p>\n\n<h4>WooCommerce<\/h4>\n\n<p>Tested with WooCommerce 11. New product slugs, product categories and tags,\nshipping classes, attribute names and terms, downloadable files and product\nimages are all transliterated. Coupon codes are left alone, because customers\ntype them and codes already printed have to go on working. So is the product\npermalink base, which you set yourself.<\/p>\n\n<h4>Privacy and performance<\/h4>\n\n<ul>\n<li>No outbound requests: no update server of its own, no licence check, no usage\nstatistics.<\/li>\n<li>No background jobs. A conversion you start runs while you watch it.<\/li>\n<li>No stylesheet and no script on any public page.<\/li>\n<li>Files already uploaded are never renamed.<\/li>\n<li>One dashboard notice, for administrators, and only if the PHP mbstring\nextension is missing.<\/li>\n<\/ul>\n\n<h4>For developers<\/h4>\n\n<ul>\n<li><code>translit_standards_language<\/code>: The language code to transliterate by. Return\nan empty string to leave a string alone.<\/li>\n<li><code>translit_standards_result<\/code>: The transliterated string, with the text the\nengine was given and the standard key.<\/li>\n<li><code>translit_standards_site_languages<\/code>: The language codes the settings screen\noffers a row for.<\/li>\n<\/ul>\n\n<!--section=installation-->\n<ol>\n<li>Install and activate PlugForge Transliteration Standards.<\/li>\n<li>Go to Settings &gt; PlugForge Transliteration Standards.<\/li>\n<li>Choose a standard for each language your site writes in. None is selected on\ninstall, and a language you leave alone stays untouched.<\/li>\n<li>Add exceptions if you need them.<\/li>\n<li>Open \"What would change\" to see what your existing post slugs would become.<\/li>\n<\/ol>\n\n<p>The plugin needs the PHP mbstring extension.<\/p>\n\n<!--section=faq-->\n<dl>\n<dt id=\"will%20activation%20change%20my%20existing%20urls%3F\"><h3>Will activation change my existing URLs?<\/h3><\/dt>\n<dd><p>No. It affects slugs and file names created after you choose a standard.\nExisting post slugs change only if you rewrite them from the \"What would\nchange\" screen.<\/p><\/dd>\n<dt id=\"why%20are%20existing%20pages%20and%20categories%20not%20converted%3F\"><h3>Why are existing pages and categories not converted?<\/h3><\/dt>\n<dd><p>When a post slug changes, WordPress stores the old one and redirects visitors\nfrom it. It does nothing of the kind for pages and terms, so a changed address\nwould break every link to it.<\/p><\/dd>\n<dt id=\"why%20are%20existing%20media%20files%20not%20renamed%3F\"><h3>Why are existing media files not renamed?<\/h3><\/dt>\n<dd><p>A file's address appears in post content, in caches, in a CDN and on other\npeople's pages. Renaming it breaks all of those at once, and nothing can put\nthem back.<\/p><\/dd>\n<dt id=\"can%20i%20edit%20the%20transliteration%20table%3F\"><h3>Can I edit the transliteration table?<\/h3><\/dt>\n<dd><p>No. A standard edited letter by letter stops matching the document it came\nfrom, and that match is why you picked it. Use exceptions instead.<\/p><\/dd>\n<dt id=\"my%20site%20is%20in%20two%20languages.%20which%20one%20does%20it%20use%3F\"><h3>My site is in two languages. Which one does it use?<\/h3><\/dt>\n<dd><p>The language set on the post or term, if Polylang can tell it. Without a\nlanguage the text is left unchanged.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>0.1.0<\/h4>\n\n<ul>\n<li>First release.<\/li>\n<\/ul>","raw_excerpt":"Transliterates new slugs and file names using documented national, UN and BGN\/PCGN romanisation standards.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/pcd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/375739","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/pcd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/pcd.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/pcd.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=375739"}],"author":[{"embeddable":true,"href":"https:\/\/pcd.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/plugforge"}],"wp:attachment":[{"href":"https:\/\/pcd.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=375739"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/pcd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=375739"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/pcd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=375739"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/pcd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=375739"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/pcd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=375739"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/pcd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=375739"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}