Постоянно защищенный модуль
Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску
Документация по модулю [ просмотреть ] [ изменить ] [ историю ] [ очистить ]

Этот модуль существует в первую очередь для обеспечения правильной разметки html для неанглоязычного текста, где этот текст используется в англоязычной Википедии. Его второстепенная цель - обеспечить правильный визуальный рендеринг этого неанглийского текста. Модуль был разработан для консолидации обработки для , в (большинстве) и шаблонов в единый источник и использовать четко определенный набор данных извлекаются из международных стандартов. Он обеспечивает проверку ошибок и создание отчетов, чтобы убедиться, что отображаемый HTML-код является правильным для браузеров и программ чтения с экрана.{{Lang}}{{lang-??}}{{Transl}}

Другие шаблоны, которые получают поддержку имени языка из этого модуля:

Набор данных

Набор данных указывается в Module: Lang / data и включенных в него модулях данных:

  • языковые данные тегов и имен
    • Модуль: Язык / данные / языки iana - из файла реестра IANA language-subtag-registry
  • данные языкового сценария
    • Модуль: Язык / данные / скрипты iana - из файла реестра языковых вложенных тегов IANA
  • данные языкового региона
    • Модуль: Язык / данные / регионы iana - из файла реестра языковых подтегов IANA
  • данные языкового варианта
    • Модуль: варианты языка / данных / iana - из файла реестра языковых вложенных тегов IANA
  • данные подавленного сценария
    • Модуль: Подавленные скрипты языка / данных / iana - из файла реестра IANA language-subtag-registry

Набор данных также включает дополнительные модули данных:

  • переопределение и другие нестандартные данные
    • Модуль: Синонимы языка / ISO 639 - сопоставляет трехсимвольные коды ISO 639-2, -2T, -3 с двухсимвольными кодами ISO 639-1 - из кодов для представления названий языков.
    • Модуль: Lang / tag from name - поменять местами данные тега и имени языка, чтобы имя языка было ключом, а языковой тег - значением

Тестовые наборы

  • Модуль: Lang / testcases ( запустить )
  • category_from_tag ()
    • Модуль: Lang / testcases / ISO 639-1 категория из тега ( запустить )
    • Модуль: Lang / testcases / ISO 639-3-1 категория из тега (A – H) ( запустить )
    • Модуль: Lang / testcases / ISO 639-3-2 категория из тега (I – N) ( запустить )
    • Модуль: Lang / testcases / ISO 639-3-3 категория из тега (O – Z) ( запустить )
    • Модуль: Lang / testcases / ISO 639 устарел и переопределить категорию из тега ( запустить )
  • name_from_tag ()
    • Модуль: Lang / testcases / ISO 639-1 имя из тега ( запустить )
    • Модуль: Lang / testcases / ISO 639-3-1 имя из тега (A – H) ( запустить )
    • Модуль: Lang / testcases / ISO 639-3-2 имя из тега (I – N) ( запустить )
    • Модуль: Lang / testcases / ISO 639-3-3 имя из тега (O – Z) ( запустить )
    • Модуль: Lang / testcases / ISO 639 устарел и переопределить имя из тега ( запустить )
  • tag_from_name ()
    • Модуль: Lang / testcases / ISO 639-1 tag from name ( run )
    • Модуль: Lang / testcases / ISO 639-3-1 тег из имени (A – H) ( запустить )
    • Модуль: Lang / testcases / ISO 639-3-2 tag from name (I – N) ( run ).
    • Модуль: Lang / testcases / ISO 639-3-3 tag from name (O – Z) ( run )
    • Модуль: Lang / testcases / ISO 639 устарел и заменить тег из имени ( запустить )

Категории отслеживания

  • Категория: Ошибки шаблонов Lang и lang-xx  (51)
  • Категория: Ошибки в шаблоне переводчика  (11)
  • Категория: код языка и языка-xx повышен до ISO 639-1  (158)
  • Категория: Lang и lang-xx с использованием устаревших кодов ISO 639  (23)

Смотрите также

MoS на иностранных словах:

  • Википедия: Руководство по стилю / форматированию текста § Иностранные термины

знак равноПоддержка Lua шаблонов {{lang}}, {{lang-xx}} и {{transl}} и замена различных поддерживающих шаблонов. знак равноrequire ( 'Модуль: без глобальных переменных' );local  getArgs  =  require  ( 'Модуль: аргументы' ). getArgs ;local  unicode  =  require  ( "Модуль: данные Unicode" ); - для is_latin () и is_rtl ()local  yesno  =  require  ( 'Модуль: Да нет' );локальный  lang_data  =  mw . loadData  ( 'Модуль: Lang / data' ); - таблицы подсказок для переопределения названий языков и транслитерацииlocal  lang_name_table  =  lang_data . lang_name_table ; - языковые коды, имена, регионы, скрипты, подавленные скриптылокальный  lang_table  =  lang_data . lang_name_table . lang ;локальный  lang_dep_table  =  lang_data . lang_name_table . lang_dep ;локальная  таблица_скриптов  =  lang_data . lang_name_table . сценарий ;local  region_table  =  lang_data . lang_name_table . регион ;локальный  вариант_таблицы  =  lang_data . lang_name_table . вариант ;локальная  таблица suppressed_table  =  lang_data . lang_name_table . подавлен ;локальная  override_table  =  lang_data . переопределить ;локальная  таблица_синонимов  =  mw . loadData  ( 'Модуль: синонимы Lang / ISO 639' ); - Перевод кода ISO 639-2 / 639-2T в код 639-1локальное  пространство имен  =  mw . название . getCurrentTitle (). пространство имен ; - используется для категоризацииместные  this_wiki_lang  =  mw . язык . getContentLanguage (). код ; - получить язык этой викилокальный  initial_style_state ; - устанавливается lang_xx_normal () и lang_xx_italic ()местные  maint_cats  =  {}; - категории обслуживания находятся здесьлокальный  maint_msgs  =  {}; - и их сообщения идут сюда- [[-------------------------- <IS _ SET> --------------- -------------------------------------------------- -Возвращает истину, если аргумент установлен; в противном случае - ложь. Аргумент «установлен», если он существует (не ноль) или когда это не пустая строка.]]локальная  функция  is_set (  var  ) не  возвращать ( var  ==  nil  или  var  ==  '' );конец- [[-------------------------- <ИНВЕРТИРОВАТЬ _ ИТАЛИКА> --------------- ----------------------------------Эта функция пытается инвертировать курсивную разметку в args.text, добавляя / удаляя начальную / конечную курсивную разметку.в args.text. Подобно | italic = unset, | italic = invert отключает автоматическую разметку курсивом. Индивидуальные ведущие / конечныеапострофы преобразуются в их эквивалент числовой сущности html, так что новая курсивная разметка не становитсяжирная разметка непреднамеренно.Начальная и конечная разметка вики извлекается из args.text в отдельные элементы таблицы. Добавление, удаление,Замена разметки вики обрабатывается таблицей замены string.gsub (), работающей только с этими отдельными элементами.В шаблоне соответствия string.gsub () '. *' Соответствует пустой строке, а также трем ожидаемым шаблонам разметки вики.Эта функция ожидает, что разметка в args.text будет полной и правильной; в противном случае может возникнуть странность.]]локальная  функция  invert_italics  ( источник )local  invert_pattern_table  =  { - начальная / конечная разметка добавить / удалить / заменить шаблоны[ "" ] = " \ '\' " , - пустая строка становится курсивной разметкой[ " \ '\' " ] = "" , - курсивная разметка становится пустой строкой[ " \ '\' \ ' " ] = " \' \ '\' \ '\' " , - жирный шрифт становится полужирным курсивом[ " \ '\' \ '\' \ ' " ] = " \' \ '\' " , - жирный курсив становится жирным};локальный  сегмент  =  {};source  =  source : gsub  ( "% f [ \ ' ] \' % f [^ \ ' ]" ,  ' & # 39; ' ); - защитить одинарные кавычки от интерпретации полужирной разметкисегмент [ 1 ]  =  источник : совпадение  ( '^ ( \' \ ' +% f [^ \' ]). + ' )  или  ' ' ; - получить начальную разметку, если есть; игнорировать одинарную кавычкусегмент [ 3 ]  =  источник : совпадение  ( '. + (% f [ \' ] \ '\' +) $ ' )  или  ' ' ; - получить конечную разметку, если есть; игнорировать одинарную кавычкуесли  ''  ~ =  seg [ 1 ]  и  ''  ~ =  seg [ 3 ],  то - извлеките 'текст'seg [ 2 ]  =  source : match  ( '^ \' \ ' +% f [^ \' ] (. +)% f [ \ ' ] \' \ ' + $' ) - между ведущей и конечной разметкойelseif  ''  ~ =  seg [ 1 ]  тогдаseg [ 2 ]  =  source : match  ( '^ \' \ ' +% f [^ \' ] (. +) ' ) - следующая начальная разметкаelseif  ''  ~ =  seg [ 3 ]  тогдаseg [ 2 ]  =  source : match  ( '(. +)% f [ \' ] \ '\' + $ ' ) - предшествующая конечная разметкаещеseg [ 2 ]  =  source - при отсутствии разметкиконецSEG [ 1 ]  =  invert_pattern_table [ SEG [ 1 ]]  или  SEG [ 1 ]; - заменить ведущую разметку в соответствии с таблицей шаблоновSEG [ 3 ]  =  invert_pattern_table [ SEG [ 3 ]]  или  SEG [ 3 ]; - заменить ведущую разметку в соответствии с таблицей шаблоноввернуть  table.concat  ( сегмент ); - собрал все вместе и готовоконец- [[-------------------------- <ПОДТВЕРДИТЬ _ ИТАЛИЧЕСКИЙ> --------------- ---------------------------------проверяет | курсивом = или | курсивом = присвоенные значения.Если установлен | italic = и ему присвоено допустимое значение, вернуть соответствующее значение свойства стиля шрифта css или,для особого случая «по умолчанию» вернуть ноль.Если | italic = не установлен или имеет недопустимое присвоенное значение, возвращается nil и сообщение об ошибке nil.Если установлены как | italic =, и | italics =, возвращается nil и сообщение об ошибке «конфликтующее».Возвращаемое значение nil заставляет вызывающую функцию lang, lang_xx или transl установить args.italic в соответствии с шаблоном.определены по умолчанию («наследовать» для {{lang}}, «наследовать» или «курсив» для {{lang-xx}} в зависимости оттребования отдельного шаблона, курсив для {{transl}}) или значение, соответствующее | script =, если установлено ({{lang}}и только {{lang-xx}}).Допустимые значения и значения, которые возвращает эта функция:nil - когда | курсив = отсутствует или не установлен; возвращает нольпо умолчанию - для полноты, должен использоваться редко, если вообще когда-либо; возвращает нольyes - принудительно отображать args.text курсивным шрифтом; возвращает курсивno - принудительно отображать args.text обычным шрифтом; возвращает "нормальный"unset - отключает управление шрифтом, чтобы стиль шрифта, применяемый к тексту, определялся разметкой внутри или вне шаблона; возвращает "наследование"инвертировать - отключает управление шрифтом, чтобы стиль шрифта, применяемый к тексту, определялся разметкой снаружи или инвертировался внутри шаблона; возвращает 'инвертировать']]локальная  функция  validate_italic  ( args )local  properties  =  {[ 'yes' ]  =  'курсив' ,  [ 'no' ]  =  'normal' ,  [ 'unset' ]  =  'наследовать' ,  [ 'invert' ]  =  'invert' ,  [ 'default' ]  =  nil };местный  счетчик  =  0for  _ ,  arg  в  парах  { 'курсив' ,  'курсив' ,  'i' }  делатьесли  args [ arg ],  тоcount  =  count  +  1конецконецесли  count  >  1,  то - вернуть nil и сообщение об ошибке, если установлено более одногоreturn  nil ,  'можно указать только один из | italic =, | italics = или | i =' ;конецвернуть  свойства [ args . курсив  или  аргументы . курсив  или  аргументы . i ],  ноль ; - вернуть соответствующее значение и сообщение об ошибке nilконец- [= [-------------------------- <ПРОВЕРИТЬ _ CAT _ ARGS> ------------ ----------------------------------------------По умолчанию шаблоны {{lang}} и {{lang-xx}} добавляют категоризацию, когда шаблоны используются в основном пространстве.Эта функция по умолчанию может быть отключена установкой | nocat = yes или | cat = no. Эта функция выбирает один из этих двух параметров.для управления категоризацией.Поскольку наличие двух параметров с «противоположными» именами и «противоположными» значениями сбивает с толку, эта функция принимает только утвердительныезначения для | nocat = и только отрицательные значения для | cat =; в обоих случаях «другой» смысл (и бессмысленность) не принимается, ипараметр обрабатывается так, как если бы он не был задан в шаблоне.Устанавливает args.nocat в значение true, если категоризация должна быть отключена; в ноль, если должно применяться поведение по умолчанию.Допустимые значения для | nocat = - текстовые строки:'yes', 'y', 'true', 't', on, '1' - [[Module: Yesno]] возвращает логическое истинное значение для всех этих параметров; ложь или еще нольдля | cat ='no', 'n', 'false', 'f', 'off', '0' - [[Module: Yesno]] возвращает логическое false для всех этих параметров; правда или ноль иначезнак равнолокальная  функция  validate_cat_args  ( args )если  нет  ( args . nocat  или  args . cat ),  то - оба равны нулю, поэтому классифицируйтевозврат ;конецесли  false  ==  yesno  ( args . cat )  или  true  ==  yesno  ( args . nocat ),  тоаргументы . nocat  =  true ; - установить в true, если args.nocat положительный; nil else (как если бы параметр не был задан в шаблоне)else - args.nocat - это фактически используемый параметр.аргументы . nocat  =  ноль ;конецконец- [[-------------------------- <IN _ ARRAY> --------------- -----------------------------------------------Находится ли иголка в стоге сена]]локальная  функция  in_array  (  игла ,  стог сена  )если  игла  ==  ноль,  товернуть  ложь ;конецдля  n , v  в  ipairs (  стог сена  )  делатьесли  v  ==  игла,  тоreturn  n ;конецконецвернуть  ложь ;конец- [[-------------------------- <FORMAT _ IETF _ TAG> ------------- -----------------------------------prettify теги ietf для использования рекомендуемых форматов вложенных тегов:код: нижний регистрсценарий: падеж предложенийрегион: верхний регистрвариант: нижний регистрprivate: нижний регистр с префиксом -x-]]локальная  функция  format_ietf_tag  ( код ,  скрипт ,  регион ,  вариант ,  частный )локальный  выход  =  {};если  is_set  ( частный ),  тоreturn  table.concat  ({ код : нижний (),  'x' ,  частный : нижний ()},  '-' ); - если приватный, все остальные теги игнорируютсяконецtable.insert  ( выход ,  код : нижний ());если  is_set  ( скрипт ),  тоскрипт  =  скрипт : нижний (): gsub  ( '^% a' ,  string.upper );table.insert  ( выход ,  скрипт );конецесли  is_set  ( регион ),  тоtable.insert  ( вне ,  регион : верхний ());конецесли  is_set  ( вариант ),  тоtable.insert  ( вне ,  вариант : нижний ());конецвернуть  table.concat  ( out ,  '-' );конец- [[-------------------------- <ПОЛУЧИТЬ _ IETF _ ЧАСТИ> ------------- -------------------------------------извлекает и возвращает части языковых тегов IETF:вложенный тег основного языка (обязательно) - 2- или 3-значный код языка IANAвложенный тег скрипта - четырехсимвольный код скрипта IANAподтег региона - двухбуквенный или трехзначный код региона IANAвариантный подтег - четырехзначный или 5-8-значный код варианта; поддерживается только один вариант подтегачастный вложенный тег - x-, за которым следует частный код 1-8 alnum; поддерживается только с тегом основного языкав любой из этих формlang lang-variantlang-скрипт lang-скрипт-вариантlang-region lang-region-variantрегион-скрипт-язык вариант-регион-скрипта-языкаlang-x-privateкаждый из языков, сценариев, регионов, вариантов и частных, если они используются, должен быть действительным.Языки с двухсимвольными и трехсимвольными кодовыми синонимами повышаются до двухсимвольных синонимов, потому чтов файле реестра IANA отсутствует синонимичный трехсимвольный код; мы не можем полагаться на понимание браузерамисинонимичные трехсимвольные коды в атрибуте lang =.Для шаблонов {{lang-xx}} поддерживаются параметры | script =, | region = и | variant = (не поддерживаются в {{lang}}потому что эти параметры излишни для вложенных тегов IETF в | code =)возвращает шесть значений; все строчные. Действительные детали возвращаются сами по себе; пропущенные части возвращаются как пустые строки, недопустимыдетали возвращаются как ноль; шестой возвращаемый элемент - это сообщение об ошибке (если ошибка обнаружена) или ноль.см. http://www.rfc-editor.org/rfc/bcp/bcp47.txt раздел 2.1.]]локальная  функция  get_ietf_parts  ( источник ,  args_script ,  args_region ,  args_variant )локальный  код ,  скрипт ,  регион ,  вариант ,  частный ; - части тега ietfесли  не  is_set  ( источник ),  товернуть  nil ,  nil ,  nil ,  nil ,  nil ,  'отсутствующий языковой тег' ;конецlocal  pattern  =  { - таблица таблиц, содержащих допустимые шаблоны тегов ietf и короткие имена части ietf, захваченные шаблоном{ '^ (% a% a% a?)% - (% a% a% a% a)% - (% a% a)% - (% d% d% d% d) $' ,  's' ,  'r' ,  'v' },  - 1 - ll-Ssss-RR-вариант (где вариант - 4 цифры){ '^ (% a% a% a?)% - (% a% a% a% a)% - (% d% d% d)% - (% d% d% d% d) $' ,  ' s ' ,  ' r ' ,  ' v ' }, - 2 - ll-Ssss-DDD-вариант (где регион - 3 цифры; вариант - 4 цифры){ '^ (% a% a% a?)% - (% a% a% a% a)% - (% a% a)% - (% w% w% w% w% w% w?% w ?% w?) $ ' ,  ' s ' ,  ' r ' ,  ' v ' }, - 3 - ll-Ssss-RR-option (где вариант - 5-8 alnum символов){ '^ (% a% a% a?)% - (% a% a% a% a)% - (% d% d% d)% - (% w% w% w% w% w% w? % w?% w?) $ ' ,  ' s ' ,  ' r ' ,  ' v ' }, - 4 - ll-Ssss-DDD-вариант (где регион - 3 цифры; вариант - 5-8 буквенных символов){ '^ (% a% a% a?)% - (% a% a% a% a)% - (% d% d% d% d) $' ,  's' ,  'v' }, - 5 - ll-Ssss-вариант (где вариант - 4 цифры){ '^ (% a% a% a?)% - (% a% a% a% a)% - (% w% w% w% w% w% w?% w?% w?) $' ,  's' ,  'v' }, - 6 - ll-Ssss-option (где вариант - это 5-8 буквенных символов){ '^ (% a% a% a?)% - (% a% a)% - (% d% d% d% d) $' ,  'r' ,  'v' }, - 7 - ll- RR-вариант (где вариант - 4 цифры){ '^ (% a% a% a?)% - (% d% d% d)% - (% d% d% d% d) $' ,  'r' ,  'v' }, - 8 - ll-DDD-вариант (где регион - 3 цифры; вариант - 4 цифры){ '^ (% a% a% a?)% - (% a% a)% - (% w% w% w% w% w% w?% w?% w?) $' ,  'r' ,  'v' }, - 9 - ll-RR-вариант (где вариант - это 5-8 буквенных символов){ '^ (% a% a% a?)% - (% d% d% d)% - (% w% w% w% w% w% w?% w?% w?) $' ,  'r ' ,  ' v ' }, - 10 - ll-DDD-вариант (где регион - 3 цифры; вариант - 5-8 буквенных знаков){ '^ (% a% a% a?)% - (% d% d% d% d) $' ,  'v' }, - 11 - ll-вариант (где вариант - 4 цифры){ '^ (% a% a% a?)% - (% w% w% w% w% w% w?% w?% w?) $' ,  'v' }, - 12 - ll-вариант (где вариант - 5-8 буквенных знаков){ '^ (% a% a% a?)% - (% a% a% a% a)% - (% a% a) $' ,  's' ,  'r' }, - 13 - ll- Ssss-RR{ '^ (% a% a% a?)% - (% a% a% a% a)% - (% d% d% d) $' ,  's' ,  'r' }, - 14 - ll-Ssss-DDD (регион состоит из 3 цифр){ '^ (% a% a% a?)% - (% a% a% a% a) $' ,  's' }, - 15 - ll-Ssss{ '^ (% a% a% a?)% - (% a% a) $' ,  'r' }, - 16 - ll-RR{ '^ (% a% a% a?)% - (% d% d% d) $' ,  'r' }, - 17 - ll-DDD (регион состоит из 3 цифр){ '^ (% a% a% a?) $' }, - 18 - ll{ '^ (% a% a% a?)% - x% - (% w% w?% w?% w?% w?% w?% w?% w?) $' ,  'p' }, - 19 - ll-x-pppppppp (частный - 1-8 буквенных символов)}местный  t  =  {}; - таблица захватов; служит переводчиком между захваченными частями тега ietf и именованными переменнымиfor  i ,  v  в  ipairs  ( pattern )  do - пролистать таблицу шаблонов в поисках совпаденияместные  c1 ,  c2 ,  c3 ,  c4 ; - снимки в 'шаблоне' из таблицы шаблонов идут сюдаc1 ,  c2 ,  c3 ,  c4  =  источник : совпадение  ( шаблон [ i ] [ 1 ]); - установлен один или несколько захватов, если источник соответствует шаблону [i])если  c1,  то - c1 всегда устанавливается при совпаденииcode  =  c1 ; - первый захват всегда кодt  =  {[ шаблон [ i ] [ 2 ]  или  'x' ]  =  c2 , - заполнить таблицу захватов остальными захватами[ шаблон [ i ] [ 3 ]  или  'x' ]  =  c3 , - взять имена индексов из таблицы шаблонов и назначить последовательные захваты[ pattern [ i ] [ 4 ]  или  'x' ]  =  c4 , - имя индекса может быть нулем в таблице pattern [i], поэтому "или 'x'" подделывает имя для этого индекса в этой таблице};скрипт  =  т . s  или  '' ; - переводить содержимое таблицы в именованные переменные;регион  =  t . г  или  '' ; - отсутствующие записи в таблице равны нулю, поэтому установите для именованных частей ietf пустую строку для конкатенациивариант =  т . v  или  '' ;частный  =  т . p  или  '' ;перерыв ; - и готовоконецконецесли  не  код,  тоreturn  nil ,  nil ,  nil ,  nil ,  nil ,  table.concat  ({ 'нераспознанный языковой тег:' ,  источник }); - не знаю, что у нас есть, но он искаженконецкод  =  код : нижний (); - убедитесь, что мы используем и возвращаем строчные версии этогоесли  нет  ( override_table [ code ]  или  lang_table [ code ]  или  synonym_table [ code ]  или  lang_dep_table [ code ]),  тоreturn  nil ,  nil ,  nil ,  nil ,  nil ,  table.concat  ({ 'нераспознанный код языка:' ,  code }); - неверный языковой код, не знаю о других (все равно?)конецif  synonym_table [ code ]  то - если код 639-2 / 639-2T имеет синоним 639-1table.insert  ( maint_cats ,  table.concat  ({ 'Ланг и Ланг-хе коды повышены до ISO 639-1 |' ,  код }));table.insert  ( maint_msgs ,  table.concat  ({ 'код:' ,  код ,  'назначен код:' ,  synonym_table [ код ]}));код  =  таблица_синонимов [ код ]; - используйте синонимконецесли  is_set  ( скрипт ),  тоесли  is_set  ( args_script ),  то код возврата ,  nil ,  nil ,  nil ,  nil ,  'избыточный тег скрипта' ; - оба кода со скриптом и | скрипт = не разрешеныконецещескрипт  =  args_script  или  '' ; - используйте args.script, если он указанконец если  is_set  ( скрипт ),  тоскрипт  =  скрипт : нижний (); - убедитесь, что мы используем и возвращаем строчные версии этогоесли  не  script_table [ script ],  то код возврата ,  ноль ,  ноль ,  ноль ,  ноль ,  table.concat  ({ 'нераспознанный скрипт:' ,  скрипт ,  'для кода:' ,  код }); - код языка в порядке, неверный сценарий, не знаю о других (все равно?)конецконецесли  suppressed_table [ скрипт ],  тогда - убедитесь, что код-скрипт не использует подавленный скриптесли  in_array  ( код ,  suppressed_table [ скрипт ]),  то код возврата ,  ноль ,  ноль ,  ноль ,  ноль ,  table.concat  ({ 'скрипт:' ,  скрипт ,  'не поддерживается для кода:' ,  код }); - код языка в порядке, скрипт для этого кода отключенконецконецесли  is_set  ( регион ),  тоесли  is_set  ( args_region ),  то код возврата ,  nil ,  nil ,  nil ,  nil ,  'избыточный тег региона' ; - оба кода с регионом и | регион = не разрешеныконецещеregion  =  args_region  или  '' ; - используйте args.region, если он предоставленконец если  is_set  ( регион ),  торегион  =  регион : нижний (); - убедитесь, что мы используем и возвращаем строчные версии этогоесли  не  region_table [ регион ],  то код возврата ,  скрипт ,  ноль ,  ноль ,  ноль ,  table.concat  ({ 'нераспознанный регион:' ,  регион ,  'для кода:' ,  код });конецконецесли  is_set  ( вариант ),  тоесли  is_set  ( args_variant ),  то код возврата ,  nil ,  nil ,  nil ,  nil ,  'избыточный вариантный тег' ; - оба кода с вариантом и | вариант = не разрешеныконецещевариант  =  вариант_аргумента  или  '' ; - используйте args.variant, если он указанконец если  is_set  ( вариант ),  товариант  =  вариант : нижний (); - убедитесь, что мы используем и возвращаем строчные версии этогоесли  не  вариант_таблица [ вариант ],  тогда - убедитесь, что вариант действителен код возврата ,  сценарий ,  регион ,  ноль ,  ноль ,  table.concat  ({ 'нераспознанный вариант:' ,  вариант });конец - это дублирует / заменяет тесты в lang () и lang_xx ()?if  is_set  ( script )  then - если установлен сценарий, он должен быть частью префиксаесли  не  in_array  ( table.concat  ({ код ,  '-' ,  сценарий }),  variant_table [ вариант ] [ 'префиксы' ]) ,  то код возврата ,  скрипт ,  регион ,  ноль ,  ноль ,  table.concat  ({ 'нераспознанный вариант:' ,  вариант ,  'для пары код-скрипт:' ,  код ,  '-' ,  скрипт });конецelseif  is_set  ( region )  then - если задан регион, есть некоторые префиксы, требующие кода языка и региона (en-CA-newfound)если  не  in_array  ( код ,  вариант_таблицы [ вариант ] [ 'префиксы' ]),  то сначала проверьте, является ли код языка всем, что требуется (en-oxendict, хотя en-GB-oxendict предпочтительнее)если  не  in_array  ( table.concat  ({ code ,  '-' ,  region }),  variant_table [ variant ] [ ' prefixes ' ]),  то - теперь попробуйте ввести код языка и регион (en-CA-newfound) код возврата ,  скрипт ,  регион ,  ноль ,  ноль ,  table.concat  ({ 'нераспознанный вариант:' ,  вариант ,  'для пары код-регион:' ,  код ,  '-' ,  регион });конецконецещеесли  не  in_array  ( код ,  вариант_таблица [ вариант ] [ 'префиксы' ]),  то код возврата ,  сценарий ,  регион ,  ноль ,  ноль ,  table.concat  ({ 'нераспознанный вариант:' ,  вариант ,  'для кода:' ,  код });конецконецконецесли  is_set  ( частный ),  точастный  =  частный : нижний (); - убедитесь, что мы используем и возвращаем строчные версии этогоесли  не  override_table [ table.concat  ({ code ,  '-x-' ,  private })],  тогда - убедитесь, что закрытый тег действителен; обратите внимание, что индекс код возврата ,  скрипт ,  регион ,  ноль ,  ноль ,  table.concat  ({ 'нераспознанный частный тег:' ,  частный });конецконец код возврата ,  сценарий ,  регион ,  вариант ,  частный ,  ноль ; - вернуть хорошие биты; убедитесь, что msg равно нулюконец- [[-------------------------- <MAKE _ ERROR _ MSG> ------------- -------------------------------------собирает сообщение об ошибке из имени шаблона, текста сообщения, ссылки на справку и категории ошибки.]]локальная  функция  make_error_msg  ( msg ,  args ,  template )локальный  выход  =  {};местная  категория ;если  'Transl'  ==  шаблон,  тоcategory  =  'Перевод' ;ещеcategory  =  'Lang and lang-xx'конецtable.insert  ( out ,  table.concat  ({ '[' ,  args . text  или  'undefined' ,  ']' })); - для сообщений об ошибках выводить args.text, если естьtable.insert  ( out ,  table.concat  ({ '<span style = \ " font-size: 100%; font-style: normal; \" class = \ " error \" > Ошибка: {{' ,  template ,  ' }}: ' }));table.insert  ( выход ,  сообщение );table.insert  ( out ,  table.concat  ({ '([[: Категория:' ,  категория ,  'ошибки шаблона | справка]])' }));table.insert  ( вне ,  '</span>' );if  ( 0  ==  пространство имен  или  10  ==  пространство имен ),  а  не  args . nocat  then - категоризируйте в пространстве статьи (и пространстве шаблона, чтобы позаботиться о неправильном использовании)table.insert  ( out ,  table.concat  ({ '[[Категория:' ,  категория ,  'ошибки шаблона]]' }));конецreturn  table.concat  ( выход );конец- [= [------------------------- <СДЕЛАТЬ _ WIKILINK> --------------- -------------------------------------Создает вики-ссылку; если предоставлены и ссылка, и отображаемый текст, возвращает вики-ссылку в форме [[L | D]]; если толькоссылка предоставляется, возвращает вики-ссылку в форме [[L]]; если ни один из них не указан или ссылка не указана, возвращаетпустая строка.знак равнолокальная  функция  make_wikilink  ( ссылка ,  отображение )если  is_set  ( ссылка ),  тоесли  is_set  ( дисплей ),  тоreturn  table.concat  ({ '[[' ,  ссылка ,  '|' ,  отображение ,  ']]' });ещевернуть  table.concat  ({ '[[' ,  ссылка ,  ']]' });конецещевозврат  '' ;конецконец- [[-------------------------- <DIV _ MARKUP _ ADD> ------------- -------------------------------------добавляет теги <i> и </i> к тексту элемента списка или подразумеваемому тексту <p> .. </p>. смешанный не поддерживается]]локальная  функция  div_markup_add  ( текст ,  стиль )местный  implied_p  =  {};если  text : find  ( '^ \ n [% *:; #]' )  тогда - искать разметку списка; разметка списка должна начинаться с начала текстаесли  'курсив'  ==  стиль,  товернуть  мв . ustring . gsub  ( текст ,  '( \ n [% *:; #] +) ([^ \ n ] +)' ,  '% 1 <i>% 2 </i>' ); - вставлять курсивную разметку в каждый пункт спискаеще текст возврата ;конецконецif  text : find  ( ' \ n +' )  then - искать любое количество \ n символов в текстетекст  =  текст : gsub  ( '([^ \ n ]) \ n ([^ \ n ])' ,  '% 1% 2' ); - заменить отдельные символы новой строки на пробел, имитирующий mediawikiесли  'курсив'  ==  стиль,  тотекст  =  текст : gsub ( '[^ \ n ] +' ,  '<p> <i>% 1 </i> </p>' ); - вставить p и курсивные теги разметки на каждом реализованном p (две или более последовательных последовательностей '\ n \ n')ещетекст  =  текст : gsub  ( '[^ \ n ] +' ,  '<p>% 1 </p>' ); - вставить разметку p на каждом орудии pтекст  =  текст : gsub  ( ' \ n ' ,  '' ); - убрать символы новой строкиконецконец текст возврата ;конец- [[-------------------------- <СДЕЛАТЬ _ ТЕКСТ _ HTML> ------------- -------------------------------------Добавьте html-разметку к тексту в соответствии с типом содержимого: теги <span> или <i> для встроенного содержимого или<div> теги для содержимого блока]]локальная  функция  make_text_html  ( код ,  текст ,  тег ,  RTL ,  стиль ,  размер ,  язык )местный  html  =  {};местный  style_added  =  '' ;если  text : match  ( '^% *' ),  тоtable.insert  ( HTML ,  '& # 42;' ); - переместить текстовый префикс протоязыка за пределы курсивной разметки, если таковой имеется; используйте числовую сущность, потому что простой знак вводит в заблуждение MediaWikiтекст  =  текст : gsub  ( '^% *' ,  '' ); - убрать заставку с текстаконецif  'span'  ==  tag  then - тег html по умолчанию для встроенного содержимогоесли  'курсив'  ==  стиль,  то - но если курсивtag  =  'я' ; - заменить на теги <i>конециначе - должно быть div, так что впередтекст  =  div_markup_add  ( текст ,  стиль ); - подразумеваемый дескриптор <p>, подразумеваемый <p> с <i> и разметка списка (*;: #) с <i>конецtable.insert  ( HTML ,  table.concat  ({ '<' ,  tag })); - откройте тег html <i>, <span> или <div>table.insert  ( HTML ,  table.concat  ({ 'lang = "' ,  code ,  ' \" ' })); - добавить атрибут языкаесли  RTL  или  Unicode . is_rtl ( текст ),  затемtable.insert  ( html ,  'dir = "rtl"' ); - добавить атрибут направления для языков справа налевоконецесли  'нормальный'  ==  стиль,  то - когда | курсив = нетtable.insert  ( html ,  'style = \ " font-style: normal;' ); - переопределить внешнюю разметку, если естьstyle_added  =  ' \ " ' ; - помните, что атрибут стиля добавлен и еще не закрытконецесли  is_set  ( размер ),  то - когда | size = <что-то>если  is_set  ( style_added ),  тоtable.insert  ( html ,  table.concat  ({ 'размер шрифта:' ,  размер ,  ';' })); - добавить, когда атрибут стиля уже вставленещеtable.insert  ( html ,  table.concat  ({ 'style = \ " font-size:' ,  size ,  ';' })); - создать атрибут стиляstyle_added  =  ' \ " ' ; - помните, что атрибут стиля добавлен и еще не закрытконецконецесли  is_set  ( язык ),  тоtable.insert  ( html ,  table.concat  ({ style_added ,  'title = \ " ' ,  language })); - начать текст заголовкаесли  язык : найти  ( 'языки' ),  тогдаtable.insert  ( html ,  'собирательный текст' ); - для коллективных языковещеtable.insert  ( html ,  '-языковой текст' ); - для отдельных языковконецtable.insert  ( html ,  ' \ " >' ); - закрыть открывающий тег htmlещеtable.insert  ( HTML ,  table.concat  ({ style_added ,  '>' })); - закрыть атрибут стиля и закрыть открывающий тег htmlконецtable.insert  ( HTML ,  текст ); - вставить текстtable.insert  ( HTML ,  table.concat  ({ '</' ,  tag ,  '>' })); - закройте теги <i>, <span> или <div> htmlесли  rtl,  то - legacy; не обязательно, потому что весь текст rtl заключен в тег html с атрибутом dir = "rtl"table.insert  ( HTML ,  '& lrm;' ); - убедитесь, что браузер знает, что мы находимся в конце RTLконецвернуть  table.concat  ( html ); - Сложил все воедино и готовоконец- [= [------------------------- <СДЕЛАТЬ _ КАТЕГОРИЮ> --------------- -------------------------------------Для отдельного языка <language> возвращает:[[Категория: статьи, содержащие текст на <language> -языке]]для английского:[[Категория: статьи, содержащие явно цитируемый текст на английском языке]]для коллективных языков ISO 639-2 (и для 639-1 bh):[[Категория: статьи с текстом на <language> языках]]знак равнолокальная  функция  make_category  ( код ,  language_name ,  nocat ,  name_get )местный  кот  =  {};местный  ретвал ;if  (( 0  ~ =  namespace )  или  nocat ),  а  не  name_get  then - категоризировать только в пространстве статейвозврат  '' ; - вернуть пустую строку для конкатенацииконецесли  language_name : find  ( 'languages' ),  тоreturn  table.concat  ({ '[[Категория: статьи с текстом на' ,  language_name ,  ']]' });конецtable.insert  ( cat ,  '[[Категория: статьи, содержащие' );если  'ru'  ==  код,  тоtable.insert  ( cat ,  'явно процитировано'  ..  language_name ); - возвращается к английскому языку, если региональное название недоступноещеtable.insert  ( cat ,  language_name );конецtable.insert  ( cat ,  '-языковый текст]]' );вернуть  table.concat  ( cat );конец- [[-------------------------- <СДЕЛАТЬ _ ПЕРЕВОД> --------------- -------------------------------------return translit <i lang = xx-Latn> ... </i> где xx - код языка; иначе вернуть пустую строкуЗначение | script = не используется в {{transl}} для этой цели; вместо этого он использует код. Потому что языковые скриптыперечислены в переключателях {{transl}}, которые включены в таблицы данных. Введен параметр скриптав {{Язык с названием и транслитерацией}}. Если установлен | script =, эта функция использует его вместо кода.Во избежание путаницы в этом модуле и в шаблонах, которые его используют, параметр скрипта транслитерации переименованбыть | translit-script = (в этой функции tscript)Эта функция используется как lang_xx (), так и transl ().lang_xx () всегда предоставляет код, имя_языка и транслит; может предоставить сценарий; никогда не дает стиляtransl () всегда предоставляет language_name, translit и одно из кода или tscript, но не оба сразу; всегда обеспечивает стильДля {{transl}} стиль применяется только в том случае, если указан языковой код.]]локальная  функция  make_translit  ( код ,  language_name ,  транслит ,  станд ,  tscript ,  стиль )местное  название ;местные  tout  =  {};локальный  title_table  =  lang_data . translit_title_table ; - таблица стандартов транслитерации, а также языковые коды и сценарии, применимые к этим стандартамесли  is_set  ( code ),  то - когда предоставляется код языка (всегда с шаблонами {{lang-xx}}, не всегда с {{transl}})если  не  стиль,  то - ноль для начального курсива по умолчаниюtable.insert  ( tout ,  "<i lang = \" " ); - поэтому используйте тег <i>ещеtable.insert  ( tout ,  table.concat  ({ '<span style = \ " font-style:' ,  style ,  ' \" lang = \ " ' })); - нестандартный стиль, создайте тег span для Этоконецtable.insert  ( tout ,  код );table.insert  ( tout ,  "-Latn \" title = \ " " ); - транслитерация всегда выполняется латиницейещеtable.insert  ( tout ,  "<span title = \" " ); - при отсутствии кода языка: без атрибута lang =, без курсива (только {{transl}})конецstd  =  std  и  std : lower (); - нижний регистр для индексации таблицыесли  не  is_set  ( std )  и  не  is_set  ( tscript ),  то - когда ни стандарт, ни скрипт не указаныtable.insert  ( tout ,  language_name ); - написать общую подсказкуесли  не  language_name : find  ( 'languages' )  then - собирательные имена языков (множественное число 'languages' является частью имени)table.insert  ( tout ,  '-language' ) - пропустить этот текст (только для отдельных языков и языков макросов)конецtable.insert  ( tout ,  латинизация ); - доделать наконечник инструмента; используйте латинизацию, когда не поставляется ни скрипт, ни стандартelseif  is_set  ( std )  и  is_set  ( tscript )  тогда - когда оба указаныесли  title_table [ std ],  то - и если стандарт допустимесли  title_table [ std ] [ tscript ],  то - и если сценарий для этого стандарта является допустимымtable.insert  ( tout ,  table.concat  ({ title_table [ std ] [ tscript : lower ()],  '(' ,  script_table [ tscript ] [ 1 ],  'script) транслитерация' })); - добавить соответствующий текст во всплывающую подсказкуещеtable.insert  ( tout ,  title_table [ std ] [ 'по умолчанию' ]); - использовать значение по умолчанию, если скрипт отсутствует в таблице std; TODO: поддерживать кота? сообщение об ошибке, потому что сценарий не найден для этого стандарта?конецещевозврат  '' ; - неверный стандарт, настройка для сообщения об ошибкеконецelseif  is_set  ( std )  then - транслит-скрипт не установлен, используйте код языкаесли  не  title_table [ std ],  то  верните  '' ;  конец - недопустимый стандарт, настройка для сообщения об ошибкеif  title_table [ std ] [ code ]  then - если код языка находится в таблице (переводчик может не предоставлять код языка)- table.insert (tout, table.concat ({title_table [std] [code: lower ()], '(', lang_table [code] [1], 'language) транслитерация'})); - добавить соответствующий текст во всплывающую подсказкуtable.insert  ( tout ,  table.concat  ({ title_table [ std ] [ code : lower ()],  '(' ,  language_name ,  'language) транслитерация' })); - добавить соответствующий текст во всплывающую подсказкуelse - код не совпадаетtable.insert  ( tout ,  title_table [ std ] [ 'по умолчанию' ]); - поэтому используйте стандартное значение по умолчаниюконецelse - здесь, если транслит-скрипт установлен, а транслит-стандарт не заданесли  title_table [ 'no_std' ] [ tscript ],  тоtable.insert  ( tout ,  title_table [ 'no_std' ] [ tscript ]); - использовать транслит-скрипт, если установленelseif  title_table [ 'no_std' ] [ code ]  тогдаtable.insert  ( tout ,  title_table [ 'no_std' ] [ code ]); - использовать код языкаещеесли  is_set  ( tscript ),  тоtable.insert  ( Tout ,  table.concat  ({ language_name ,  '-script транслитерации' })); - написать подсказку скриптаelseif  is_set  ( код )  тогдаесли  не  language_name : find  ( 'languages' )  then - собирательные имена языков (множественное число 'languages' является частью имени)table.insert  ( tout ,  '-language' ) - пропустить этот текст (только для отдельных языков и языков макросов)конецtable.insert  ( tout ,  'транслитерация' ); - доделать наконечник инструментаещеtable.insert  ( tout ,  'транслитерация' ); - общая подсказка (сможем ли мы когда-нибудь сюда добраться?)конецконецконецtable.insert  ( tout ,  '">' );table.insert  ( tout ,  транслит );если  is_set  ( code ),  а  не  style,  то - когда предоставляется код языка (всегда с шаблонами {{lang-xx}}, не всегда с {{transl}})table.insert  ( tout ,  "</i>" ); - закрыть курсивный тегещеtable.insert  ( tout ,  "</span>" ); - код языка отсутствует, поэтому закройте тег spanконецвернуть  table.concat  ( tout );конец- [[-------------------------- <ПРОВЕРИТЬ _ ТЕКСТ> --------------- -------------------------------------Эта функция проверяет содержимое args.text и возвращает пустую строку, если все в порядке, иначе она возвращаетсообщение об ошибке. Тесты предназначены для пустого или отсутствующего текста, а также для неправильного или запрещенного использования разметки апострофа.Отрисовка курсивом контролируется параметром | italic = template, поэтому курсивная разметка никогда не должна отображаться в args.textлибо как '' себя '', либо как '' '' 'жирный курсив' '' '', если | курсив = не установлен или | курсив = инвертировать.]]локальная  функция  validate_text  ( шаблон ,  аргументы )если  не  is_set  ( арг . текст ) ,  тоreturn  make_error_msg  ( 'без текста' ,  аргументы ,  шаблон );конецесли  args . текст : find  ( "% f [ \ ' ] \' \ '\' \ ' % f [^ \' ]" )  или  аргументы . текст : find  ( " \ '\' \ '\' \ ' [ \' ] +" )  затем - потому что мы ищем, ищите 4 аппострофа или 6+ аппострофовreturn  make_error_msg  ( 'текст имеет неверную разметку' ,  аргументы ,  шаблон );конецместный  стиль  =  аргументы . курсив ;if  ( 'unset'  ~ =  style )  и  ( 'invert'  ~ = style ),  тоесли  args . текст : find  ( "% f [ \ ' ] \' \ ' % f [^ \' ]" )  или  аргументы . текст : find  ( "% f [ \ ' ] \' \ '\' \ '\' % f [^ \ ' ]" )  затем - курсив, но не полужирный, или полужирный курсивreturn  make_error_msg  ( 'текст имеет курсивную разметку' ,  аргументы ,  шаблон );конецконецконец- [[-------------------------- <ОТОБРАЖЕНИЕ _ ОБСЛУЖИВАНИЕ> --------------- ---------------------------------------отображать сообщения и категории обслуживания]]локальная  функция  render_maint ( nocat )локальный  maint  =  {};if  0  <  # maint_msgs  then - когда есть сообщения обслуживанияtable.insert  ( maint ,  table.concat  ({ '<span class = "lang-comment" style = "font-style: normal; display: none; color: # 33aa33; margin-left: 0.3em;">' } )); - открывающий тег <span>для  _ ,  сообщение  в  ipairs  ( maint_msgs )  сделатьtable.insert  ( maint ,  table.concat  ({ msg ,  '' })); - добавить строки сообщенияконецtable.insert  ( maint ,  '</span>' ); - закрыть пролётконецif  ( 0  <  # maint_cats )  и  ( 0  ==  namespace ),  а  не  nocat  then - когда есть категории обслуживания; только пространство имен статьидля  _ ,  кот  в  ipairs  ( maint_cats )  делатьtable.insert  ( maint ,  table.concat  ({ '[[Категория:' ,  кошка ,  ']]' })); - форматировать и добавлять категорииконецконецвернуть  table.concat  ( maint );конец- [[-------------------------- <PROTO _ PREFIX> --------------- ---------------------------------------для протоязыков перед текстом стоит знак знака. Мы делаем это здесь как флаг для make_text_html (), чтобы значок splatбудет отображаться вне курсивной разметки (если используется). Если первый символ в тексте здесь уже знак, мыничего не делатьproto_param имеет логическое значение или ноль; true добавляет префикс splat независимо от названия языка; false удаляет и / или запрещаетнезависимо от названия языка; nil ничего не делает; предполагает, что значение в тексте правильное, но убирает лишние всплески]]локальная  функция  proto_prefix  ( текст ,  language_name ,  proto_param )если  false  ==  proto_param,  то - когда принудительно | proto = no текст возврата : gsub  ( '^% **' ,  '' ); - возвращать текст без префикса splat независимо от названия языка или существующего префикса splat в текстеelseif  ( language_name : find  ( '^ Proto% -' )  or  ( true  ==  proto_param ))  then - язык является прототипом или принудительно | proto = yes текст возврата : gsub  ( '^% **' ,  '*' ); - префикс протоязычного текста знаком знака; также удаляет повторяющиеся знаки префиксаконец текст возврата : gsub  ( '^% * +' ,  '*' ); - вернуть текст без помех, за исключением нескольких знаков, уменьшенных до одного знакаконец- [[-------------------------- <ИМЕЕТ _ ПОЭМА _ ТЕГ> ------------- -----------------------------------------ищет в тексте маркер полосы стихотворения; при нахождении возвращает истину; ложь ещеавтоматическое выделение курсивом отключено, если в тексте есть стрип-маркер стихотворения, потому что этот код не может знатьконтент, который заменит полосовой маркер.]]локальная  функция  has_poem_tag  ( текст ) текст возврата : find  ( ' \ 127 [^ \ 127 ] * UNIQ% -% - poem% - [% a% d] +% - QINU [^ \ 127 ] * \ 127 ' )  и  true  или  false ;конец- [[-------------------------- <HTML _ TAG _ SELECT> ------------- -----------------------------------Проверяет содержимое и выборочно обрезает текст. Возвращает текст и имя соответствующего HTML-тега для текста.Если текст содержит:\ n \ n текст содержит теги <p> .. </p> - обрезать начальные и конечные пробелы и вернуть Если текст начинается с разметки списка:\ n * неупорядоченный\ п; определение\ n: определение\ n # заказанообрезать все ведущие пробелы, кроме \ n, и обрезать все конечные пробелыЕсли текст содержит полосу <poem> ... </poem>, вернуть текст без изменений и выбрать теги <div> .. </div>, потому что маркер полосы заменяется текстом, заключенным в теги <div> .. </div>.]]локальная  функция  html_tag_select  ( текст )локальный  тег ;if  has_poem_tag  ( text )  then - содержит стрип-маркер стихотворения (мы не можем знать его содержание)tag  =  'div' ; - замена стихотворения в тегах div, поэтому lang должен использовать теги divelseif  mw . текст . trim  ( text ): find  ( ' \ n \ n +' )  then - содержит подразумеваемые теги pтекст  =  mw . текст . обрезать  ( текст ); - обрезать начальные и конечные пробельные символыtag  =  'div' ; - должно быть div, потому что span не может содержать тегов p (добавлены позже MediaWiki); замена стихотворения в тегах divelseif  text : find  ( ' \ n [% *:;% #]' )  then - если текст имеет разметку спискатекст  =  текст : gsub  ( '^ [ \ t \ r \ f ] *' ,  '' ): gsub  ( '% s * $' ,  '' ); - обрезать все пробелы, кроме ведущего символа новой строки '\ n'tag  =  'div' ; - должно быть div, потому что span не может содержать теги ul, dd, dl, ol (добавленные позже MediaWiki)ещетекст  =  mw . текст . обрезать  ( текст ); -- простой текстtag  =  'диапазон' ; - так что промежуток в порядкеконец текст возврата ,  тег ;конец- [[-------------------------- <ПОДТВЕРДИТЬ _ ПРОТО> --------------- -----------------------------------проверяет значение, присвоенное | proto =; допустимые значения - да и нет; да возвращается как истина, нет возвращается как ложь,пустая строка (или параметр пропущен) возвращается как nil; любое другое значение возвращается как nil со вторым возвращаемым значениемистина, что указывает на то, что параметру | proto = присвоено другое значение.]]локальная  функция  validate_proto  ( proto_param )если  'yes'  ==  proto_param,  тогдавернуть  истину ;elseif  'no'  ==  proto_param  тогдавернуть  ложь ;elseif  is_set  ( proto_param )  тогдаreturn  nil ,  true ; - | proto = что-то кроме "да" или "нет"ещевернуть  ноль ; - отсутствует или пустоконецконец- [[-------------------------- <ЯЗЫК _ ИМЯ _ ПОЛУЧИТЬ> ------------- -------------------------------общая функция для возврата имени языка из набора данных в соответствии с тегом IETFвозвращает название языка, если оно найдено в таблицах данных; ноль еще]]локальная  функция  language_name_get  ( ietf ,  code ,  cat )ietf  =  ietf : нижний (); - ietf: lower (), потому что format_ietf_tag () возвращает смешанный регистрместное  имя ; - остается нулевым, если не найденif  override_table [ ietf ]  then - ищите весь тег IETF в таблице переопределенияname  =  override_table [ ietf ] [ 1 ];elseif  override_table [ code ]  тогда - не там, поэтому попробуйте базовый языковой кодname  =  override_table [ код ] [ 1 ];elseif  lang_table [ code ]  then - перейти к таблице кодов / имен iananame  =  lang_table [ код ] [ 1 ]; - записи в таблице иногда имеют несколько имен, всегда берите первоеelseif  lang_dep_table [ код ]  тогда- если кошка, то- table.insert (maint_cats, table.concat ({'Lang и lang-xx с использованием устаревших кодов ISO 639 |', code}));- table.insert (maint_msgs, table.concat ({'code:', code, 'не рекомендуется'}));-- конецname  =  lang_dep_table [ код ] [ 1 ]; - записи в таблице иногда имеют несколько имен, всегда берите первоеконецесли  lang_dep_table [ code ]  и  cat,  тогда - потому что устаревший код мог быть заменен предпочтительным именем en.wikitable.insert  ( maint_cats ,  table.concat  ({ 'Ланг и Ланг-ое использование устаревших ISO 639 кодов |' ,  код }));table.insert  ( maint_msgs ,  table.concat  ({ 'код:' ,  код ,  'является устаревшим' }));конецвозвращаемое  имя ; - имя из таблиц данных или нольконец- [[-------------------------- <_ LANG> ---------------- -------------------------------------------------- -точка входа для {{lang}}не должно быть причин для установки параметров в {{lang}} {{#invoke:}}<includeonly> {{#invoke: lang | lang}} </includeonly>параметры принимаются из фрейма шаблона (родительский фрейм)]]локальная  функция  _lang  ( аргументы )локальный  выход  =  {};местное  имя_языка ; - используется для создания названий категорийлокальное  имя_категории ; - то же, что и language_name, за исключением того, что он сохраняет любые символы устранения неоднозначности в скобках (если есть) из набора данныхлокальные  подтеги  =  {}; - Сценарий вложенных тегов IETF, регион, вариант и частныйместный  код ; - код языкаместное  сообщение ; - для сообщений об ошибкахлокальный  тег  =  'диапазон' ; - начальное значение для make_text_html ()локальный  шаблон  =  аргументы . шаблон  или  "Lang" ;validate_cat_args  ( аргументы ); - определить, следует ли подавить категоризациюесли  args [ 1 ]  и  args . код  тогдаreturn  make_error_msg  ( 'конфликтующие: {{{1}}} и | код =' ,  аргументы ,  шаблон );ещеаргументы . код  =  аргументы [ 1 ]  или  аргументы . код ; - предпочитаю args.codeконецесли  args [ 2 ]  и  args . текст  тогдаreturn  make_error_msg  ( 'конфликтующие: {{{2}}} и | текст =' ,  аргументы ,  шаблон );ещеаргументы . текст  =  аргументы [ 2 ]  или  аргументы . текст ; - предпочитаю args.textконецmsg  =  validate_text  ( шаблон ,  аргументы ); - убедитесь, что установлен | text =если  is_set  ( msg ),  то - msg - это уже отформатированное сообщение об ошибкеreturn  msg ;конецаргументы . текст ,  tag  =  html_tag_select  ( аргумент . текст ); - проверяет текст; возвращает соответствующий тег html с соответствующим обрезанным текстомаргументы . rtl  =  аргументы . rtl  ==  'да' ; - преобразовать в логическое: 'да' -> истина, другие значения -> ложьаргументы . proto ,  msg  =  validate_proto  ( аргументы . proto ); - вернуть логическое значение, или ноль, или ноль и флаг сообщения об ошибкеесли  сообщение,  тоВозвращение  make_error_msg  ( table.concat  ({ 'недействителен | прото =:' ,  арг . прото }),  арг ,  шаблон );конецкод ,  вложенные теги . скрипт ,  вложенные теги . регион ,  вложенные теги . вариант ,  вложенные теги . частный ,  сообщи  =  get_ietf_parts  ( арг . код ); - | script =, | region =, | variant = не поддерживаются, потому что они должны быть частью args.code ({{{1}}} в {{lang}})если  сообщение,  товернуть  make_error_msg  (  сообщение ,  аргументы ,  шаблон );конецаргументы . курсив ,  msg  =  validate_italic  ( args );если  сообщение,  товернуть  make_error_msg  ( сообщение ,  аргументы ,  шаблон );конецесли  nil  ==  args . курсив,  затем - ноль, если | курсив = отсутствует или не установлен или | курсив = по умолчанию; args.italic controlsif  ( 'latn'  ==  subtags . script )  или  - script - latn( This_wiki_lang  \ =  код  и  не  is_set  ( подтег . Сценарий )  и  не  has_poem_tag  ( арг . Текст )  и  юникод . Is_Latin  ( арг . Текст ))  затем  - текст не язык этой Вики, ни один скрипт не указан , а не в стихотворении разметки , но полностью латинское письмо (автоматический курсив)аргументы . курсив  =  'курсив' ; - ПО УМОЛЧАНИЮ для шаблонов {{lang}} вертикальное положение; но если скрипт latn установлен для font-style: italicещеаргументы . курсив  =  'наследовать' ; - курсив не установлен; сценарий не латн; наследовать текущий стильконецконецif  is_set  ( subtags . script )  then - если скрипт установлен, переопределить настройку rtlесли  in_array  ( subtags . script ,  lang_data . rtl_scripts ),  тоаргументы . rtl  =  true ; - скрипт - это скрипт RTLещеаргументы . rtl  =  ложь ; - сценарий не является сценарием RTLконецконецаргументы . код  =  format_ietf_tag  ( код ,  подтеги . сценарий ,  подтеги . область ,  подтеги . вариант ,  подтеги . частный ); - форматирование в рекомендуемые стили вложенных теговlanguage_name  =  language_name_get  ( аргумент . код ,  код ,  истина ); - получить название языка; сначала попробуйте тег ietf, затем код без варианта, затем код с вариантомесли  'invert'  ==  args . наклонные  и  «пяди»  ==  тег  затем - инвертный поддерживаются только для контента в режиме онлайнаргументы . Текст  =  invert_italics  ( арг . текст )конецаргументы . текст  =  proto_prefix  ( арг . Текст ,  language_name ,  арг . прото ); - префикс протоязычного текста знакамиtable.insert  ( out ,  make_text_html  ( args . code ,  args . text ,  tag ,  args . rtl ,  args . italic ,  args . size ,  language_name ));table.insert  ( вне ,  make_category  ( код ,  language_name ,  арг . nocat ));table.insert  ( out ,  render_maint ( аргументы . nocat )); - сообщения и категории обслуживанияreturn  table.concat  ( выход ); - Сложил все воедино и готовоконец- [[-------------------------- <ЯЗЫК> ----------------- -------------------------------------------------- ---точка входа для {{lang}}не должно быть причин для установки параметров в {{lang}} {{#invoke:}}<includeonly> {{#invoke: lang | lang}} </includeonly>параметры принимаются из фрейма шаблона (родительский фрейм)]]локальная  функция  Ланг  ( рама )local  args  =  getArgs  ( frame ,  { - этот код, чтобы мы могли обнаруживать и обрабатывать разметку списка вики в текстеvalueFunc  =  функция  ( ключ ,  значение )если  2  ==  ключ  или  «текст»  ==  ключ  затем - параметр «текст»; не обрезайте белое пространствовозвращаемое  значение ; - вернуть необрезанный текстelseif  value  then - все остальные значения: если значение не nilзначение  =  mw . текст . обрезать  ( значение ); - обрезать пробелыif  ''  ~ =  value  then - пустая строка, когда значение было только пробеломвозвращаемое  значение ;конецконецвернуть  ноль ; - значение было пустым или содержало только пробелыend - конец valueFunc});возврат  _lang  ( аргументы );конец- [[-------------------------- <ЯЗЫК _ XX> --------------- -------------------------------------------------Для шаблонов {{lang-xx}} единственный параметр, который необходимо установить в шаблоне, - это код языка. Вседругие параметры обычно должны быть записаны в вызове шаблона. Для {{lang-xx}} шаблонов для языковкоторые могут иметь несколько систем записи, также может быть уместным установить | script =.Для каждого шаблона {{lang-xx}} выберите соответствующую функцию точки входа, чтобы эта функция знала значение по умолчаниюстиль, который следует применить к тексту.Для нормального, вертикального стиля:<includeonly> {{#invoke: lang | lang_xx_inherit | code = xx}} </includeonly>Для курсива:<includeonly> {{#invoke: lang | lang_xx_italic | code = xx}} </includeonly>Все остальные параметры должны быть получены из фрейма шаблона (родительского фрейма).Поддерживаемые параметры:| code = (обязательно) код языка IANA| script = код сценария IANA; особенно для использования с языками, использующими несколько систем письма| region = код региона IANA| variant = код варианта IANA| text = (обязательно) отображаемый текст на языке, указанном в коде| link = boolean false ('no') не связывает имя языка, указанное в коде, со статьей на соответствующем языке| rtl = boolean true ('yes') определяет язык, указанный в коде, как язык с письмом справа налево| nocat = boolean true ('yes') запрещает нормальную категоризацию; категории ошибок не затрагиваются| cat = boolian false ('no') противоположная форма | nocat =| italic = boolean true ('yes') отображает отображаемый текст курсивным шрифтом; логическое значение false ('no') отображает отображаемый текст обычным шрифтом; не настроен рендеринг в соответствии с initial_style_state| lit = текст, который является дословным переводом текста| label = 'none' для подавления всех надписей (название языка, 'транслит.', 'букв.')любой другой текст заменяет метку с названием языка - автоматические вики-ссылки отключеныдля тех шаблонов {{lang-xx}}, которые поддерживают транслитерацию (те шаблоны, где | text = не является полностью латинским скриптом):| транслит = текст, являющийся транслитерацией текста| translit-std = стандарт, применяемый к транслитерации| translit-script = имя сценария ISO 15924; возвращается к кодуДля {{lang-xx}} позиционные параметры:{{{1}}} текст{{{2}}} транслитерированный текст{{{3}}} дословный перевод текстаникакие другие позиционные параметры не допускаются]]локальная  функция  _lang_xx  ( аргументы )локальный  выход  =  {};местное  имя_языка ; - используется для отображения текста, ссылок на статьилокальное  имя_категории ; - то же, что и language_name, за исключением того, что он сохраняет любые символы устранения неоднозначности в скобках (если есть) из набора данныхлокальные  подтеги  =  {}; - Скрипт, регион и вариант вложенных тегов IETFместный  код ; - код языкаместное  имя_транслита ; - имя, связанное с кодом сценария IANA (ISO 15924)местный  транслит ;местный  translit_title ;местное  сообщение ; - для сообщений об ошибкахлокальный  тег  =  'диапазон' ; - начальное значение для make_text_html ()локальный  шаблон  =  аргументы . шаблон  или  "Lang-xx" ;если  args [ 1 ]  и  args . текст  тогдаreturn  make_error_msg  ( 'конфликтующие: {{{1}}} и | текст =' ,  аргументы ,  шаблон );ещеаргументы . текст  =  аргументы [ 1 ]  или  аргументы . текст ; - предпочитаю args.textконецmsg  =  validate_text  ( шаблон ,  аргументы ); - убедитесь, что | text = установлен, не содержит курсивной разметки и защищен от неправильного выделения жирным шрифтом.если  is_set  ( msg ),  тоreturn  msg ;конецаргументы . текст ,  tag  =  html_tag_select  ( аргумент . текст ); - проверяет текст; возвращает соответствующий тег html с соответствующим обрезанным текстомесли  args [ 2 ]  и  args . транслит  тогдаreturn  make_error_msg  ( 'конфликтующие: {{{2}}} и | translit =' ,  аргументы ,  шаблон );ещеаргументы . translit  =  args [ 2 ]  или  args . транслит - предпочитаю args.translitконецесли  аргументы [ 3 ]  и  ( аргументы . перевод  или  аргументы . освещены ),  тоreturn  make_error_msg  ( 'конфликтующие: {{{3}}} и | lit = или | translation =' ,  args ,  template );elseif  args . перевод  и  аргументы . горит  тогдаreturn  make_error_msg  ( 'конфликтующие: | lit = и | translation =' ,  args ,  template );ещеаргументы . translation  =  args [ 3 ]  или  args . перевод  или  аргументы . горит ; - предпочитаю args.translationконецесли  args . ссылки  и  аргументы . тогда ссылка return  make_error_msg  ( 'конфликтующие: | ссылки = и | ссылка =' ,  аргументы ,  шаблон );ещеаргументы . ссылка  =  аргументы . ссылка  или  аргументы . ссылки ; - предпочитаю args.linkконецvalidate_cat_args  ( аргументы ); - определить, следует ли подавить категоризациюаргументы . rtl  =  аргументы . rtl  ==  'да' ; - преобразовать в логическое: 'да' -> истина, другие значения -> ложькод ,  вложенные теги . скрипт ,  вложенные теги . регион ,  вложенные теги . вариант ,  вложенные теги . частный ,  msg  =  get_ietf_parts  ( аргумент . код ,  аргумент . сценарий ,  аргумент . регион ,  аргумент . вариант ); - частный опущен, потому что частныйif  msg  then - если обнаружена ошибка, появляется сообщение об ошибкевернуть  make_error_msg  ( сообщение ,  аргументы ,  шаблон );конецаргументы . курсив ,  msg  =  validate_italic  ( args );если  сообщение,  товернуть  make_error_msg  ( сообщение ,  аргументы ,  шаблон );конецесли  nil  ==  args . затем курсивом  - args.italic controlsесли  is_set  ( subtags . script ),  тоесли  'Latn'  ==  подтеги . сценарий  тогдааргументы . курсив  =  'курсив' ; - | script = Latn; установлен для font-style: курсивещеаргументы . курсив  =  начальный_стайл_состояние ; - курсив не установлен; сценарий не латинский; установлен для стиля шрифта: <initial_style_state>конецещеаргументы . курсив  =  начальный_стайл_состояние ; - здесь, когда | italic = и | script = не установлено; установлен для стиля шрифта: <initial_style_state>конецконецif  is_set  ( subtags . script )  then - если скрипт установлен, переопределяет настройку rtlесли  in_array  ( subtags . script ,  lang_data . rtl_scripts ),  тоаргументы . rtl  =  true ; - скрипт - это скрипт RTLещеаргументы . rtl  =  ложь ; - сценарий не является сценарием RTLконецконецаргументы . proto ,  msg  =  validate_proto  ( аргументы . proto ); - вернуть логическое значение, или ноль, или ноль и флаг сообщения об ошибкеесли  сообщение,  тоВозвращение  make_error_msg  ( table.concat  ({ 'недействителен | прото =:' ,  арг . прото }),  арг ,  шаблон );конецаргументы . код  =  format_ietf_tag  ( код ,  подтеги . сценарий ,  подтеги . область ,  подтеги . вариант ,  подтеги . частный ); - форматирование в рекомендуемые стили вложенных теговlanguage_name  =  language_name_get  ( аргумент . код ,  код ,  истина ); - получить название языка; сначала попробуйте тег ietf, затем код без варианта, затем код с вариантомcategory_name  =  language_name ; - в названиях категорий сохраняются диэмбигуляторы IANA в скобках (если есть)language_name  =  language_name : GSUB  ( '% S +% B ()' ,  '' ); - удалите разделители неоднозначности или квалификаторы в скобках IANA из имен, в которых они естьесли  args . тогда лейбл если  'none'  ~ =  args . тогда лейбл table.insert  ( вне ,  table.concat  ({ args . label ,  ':' })); - персонализированный ярлыкконецещеесли  'no'  ==  args . тогда ссылка table.insert  ( из ,  language_name ); - название языка без викилинкаещеесли  language_name : find  ( 'languages' ),  тоtable.insert  ( из ,  make_wikilink  ( language_name )); - собирательное название языка использует простую вики-ссылкуelseif  lang_data . article_name [ code ]  тогдаtable.insert  ( out ,  make_wikilink  ( lang_data . article_name [ code ] [ 1 ],  language_name )); - название языка с вики-ссылкой из переопределенных данныхещеtable.insert  ( вне ,  make_wikilink  ( language_name  ..  'язык' ,  language_name )); - название языка с вики-ссылкойконецконецtable.insert  ( вне ,  ':' ); -- разделительконецесли  'invert'  ==  args . курсив  тогдааргументы . Текст  =  invert_italics  ( арг . текст )конецаргументы . текст  =  proto_prefix  ( арг . Текст ,  language_name ,  арг . прото ); - префикс протоязычного текста знакамиtable.insert  ( out ,  make_text_html  ( args . code ,  args . text ,  tag ,  args . rtl ,  args . italic ,  args . size ,  ( 'none'  ==  args . label )  и  language_name  или  nil ))если  is_set  ( аргументы . транслит ),  а  не  юникод . is_Latin  ( аргумент . текст ),  затем - транслитерация (не поддерживается в {{lang}}); не поддерживается, если args.text полностью состоит из текста latn (это несовершенный тест)table.insert  ( вне ,  ',' ); - запятая для отделения текста от транслитаесли  'none'  ~ =  args . тогда лейбл table.insert  ( out ,  '<маленький>' );if  script_table [ args [ 'translit-script' ]]  тогда - когда | translit-script = установлен, попробуйте использовать имя сценарияtranslit_script_name  =  script_table [ args [ 'translit-script' ] [ 1 ]];ещеtranslit_script_name  =  language_name ; - вернуться к названию языкаконецtranslit_title  =  mw . название . makeTitle  ( 0 ,  table.concat  ({ 'романизация' ,  translit_script_name })); - сделать титровальный объектесли  translit_title . существует  и  ( 'no'  ~ =  аргумент . ссылка ),  тоtable.insert  ( out ,  make_wikilink  ( 'Романизация'  ..  translit_script_name  или  language_name ,  'romanized' )  ..  ':' ); - сделайте вики-ссылку, если есть статья, на которую можно ссылатьсяещеtable.insert  ( out ,  'романизированный:' ); - иначе обычный текстконецtable.insert  ( вне ,  '& nbsp; </small>' ); - закрыть маленький тегконецtranslit  =  make_translit  ( args . code ,  language_name ,  args . translit ,  args [ 'translit-std' ],  args [ 'translit-script' ])если  is_set  ( транслит ),  тоtable.insert  ( выход ,  транслит );ещевернуться  make_error_msg  ( table.concat  ({ 'недопустимого транслита-Std: \' ' ,  арг [ 'транслит-Std' ]  или  ' [отсутствует] }),  арг ,  шаблон );конецконецесли  is_set  ( аргумент . перевод ),  то - перевод (не поддерживается в {{lang}})table.insert  ( вне ,  ',' );если  'none'  ~ =  args . тогда лейбл table.insert  ( out ,  '<маленький>' );если  'no'  ==  args . тогда ссылка table.insert  ( out ,  '<abbr title = "literal translation"> lit. </abbr>' );ещеtable.insert  ( out ,  make_wikilink  ( ' Дословный перевод' ,  'букв.' ));конецtable.insert  ( out ,  "& thinsp; </small>" );конецtable.insert  ( out ,  table.concat  ({ '& # 39;' ,  args . translation ,  '& # 39;' })); - используйте html-сущности, чтобы избежать путаницы с разметкой викиконецtable.insert  ( вне ,  make_category  ( код ,  category_name ,  арг . nocat ));table.insert  ( out ,  render_maint ( аргументы . nocat )); - сообщения и категории обслуживанияreturn  table.concat  ( выход ); - Сложил все воедино и готовоконец- [[-------------------------- <LANG _ XX _ ARGS _ GET> ----------- -----------------------------------общая функция для получения таблицы аргументов из {{lang- ??}} шаблоноввозвращает таблицу аргументов]]локальная  функция  lang_xx_args_get  ( кадр )local  args  =  getArgs ( кадр ,{parentFirst =  true , - параметры в шаблоне переопределяют параметры, установленные в {{#invoke:}}valueFunc  =  функция  ( ключ ,  значение )если  1  ==  ключ,  то - параметр «текст»; не обрезайте белое пространствовозвращаемое  значение ; - вернуть необрезанный текстelseif  value  then - все остальные значения: если значение не nilзначение  =  mw . текст . обрезать  ( значение ); - обрезать пробелыif  ''  ~ =  value  then - пустая строка, когда значение было только пробеломвозвращаемое  значение ;конецконецвернуть  ноль ; - значение было пустым или содержало только пробелыend - конец valueFunc});вернуть  аргументы ;конец- [[-------------------------- <ЯЗЫК _ XX _ ИТАЛИЯ> ------------- -------------------------------------Точка входа для тех шаблонов {{lang-xx}}, которые вызывают lang_xx_italic (). Устанавливает начальное состояние стиля курсивом.]]локальная  функция  lang_xx_italic  ( кадр )локальные  аргументы  =  lang_xx_args_get  ( кадр );initial_style_state  =  'курсив' ;return  _lang_xx  ( аргументы );конец- [[-------------------------- <_ ЯЗЫК _ XX _ ИТАЛИЯ> ------------ ------------------------------------Точка входа f из другого модуля. Устанавливает начальное состояние стиля курсивом.]]локальная  функция  _lang_xx_italic  ( args )initial_style_state  =  'курсив' ;return  _lang_xx  ( аргументы );конец- [[-------------------------- <LANG _ XX _ INHERIT> ------------- -----------------------------------Точка входа для тех шаблонов {{lang-xx}}, которые вызывают lang_xx_inherit (). Устанавливает начальное состояние стиля для наследования.]]локальная  функция  lang_xx_inherit  ( фрейм )локальные  аргументы  =  lang_xx_args_get  ( кадр );initial_style_state  =  «наследовать» ;return  _lang_xx  ( аргументы );конец- [[-------------------------- <_ LANG _ XX _ INHERIT> ------------ ----------------------------------Точка входа из другого модуля. Устанавливает начальное состояние стиля для наследования.]]локальная  функция  _lang_xx_inherit  ( args )initial_style_state  =  «наследовать» ;return  _lang_xx  ( аргументы );конец- [[-------------------------- <_ IS _ IETF _ TAG> ------------ ------------------------------------------Возвращает истину, если существует имя языка, связанное с языковым тегом IETF; ноль остальное. Тег языка IETF должен быть действительным.Все комбинации кода, поддерживаемые шаблонами {{lang}} и {{lang-xx}}, поддерживаются этой функцией.Точка входа в модуль из другого модуля]]локальная  функция  _is_ietf_tag  ( tag ) - точка входа, когда этот модуль требует () d в другойместный  c ,  s ,  r ,  v ,  p ,  err ; - код, скрипт, регион, вариант, приват, сообщение об ошибкеc ,  s ,  r ,  v ,  p ,  err  =  get_ietf_parts  ( тег ); - разобрать тег на составные части и проверитьreturn  (( c  and  not  err )  и  true )  или  nil ; - возвращать истину, если часть кода имеет значение без сообщения об ошибке; ноль ещеконец- [[-------------------------- <IS _ IETF _ TAG> ------------- -------------------------------------------Точка входа модуля из {{#invoke:}}]]локальная  функция  is_ietf_tag  ( кадр )return  _is_ietf_tag  ( getArgs  ( frame ) [ 1 ]); - args [1] - тестируемый языковой тег ietf; также получить родительский фреймконец- [[-------------------------- <IS _ IETF _ TAG _ FRAME> ----------- ---------------------------------Точка входа модуля из {{#invoke:}}; то же, что и is_ietf_tag (), за исключением того, что не получает параметры от родителя(шаблон) рамка. Эта функция бесполезна при вызове {{lang | fn = is_ietf_tag_frame | <tag>}}, потому что <tag>находится в родительском фрейме.]]локальная  функция  is_ietf_tag_frame  ( кадр )return  _is_ietf_tag  ( getArgs  ( frame ,  { frameOnly  =  true ,}) [ 1 ]); - args [1] - тестируемый языковой тег ietf; не получить родительский фреймконец- [[-------------------------- <_ ИМЯ _ ОТ _ ТЕГА> ------------ --------------------------------------Возвращает имя языка, связанное с языковым тегом IETF, если оно допустимо; сообщение об ошибке еще.Все комбинации кода, поддерживаемые шаблонами {{lang}} и {{lang-xx}}, поддерживаются этой функцией.Установите для параметра invoke | link = значение yes, чтобы получить версию названия языка с вики-ссылками.Точка входа в модуль из другого модуля]]локальная  функция  _name_from_tag  ( args )локальные  подтеги  =  {}; - Сценарий вложенных тегов IETF, регион, вариант и частныйлокальный  raw_code  =  args [ 1 ]; - сохранить копию входного вложенного тега IETFлокальная  ссылка  =  'да'  ==  аргументы [ 'ссылка' ]; - сделать логическоелокальная  метка  =  args . этикетка ;местный  код ; - код языкаместное  сообщение ; - получает сообщение об ошибке, если языковой тег IETF неверен или недействителенместное  имя_языка  =  '' ;код ,  вложенные теги . скрипт ,  вложенные теги . регион ,  вложенные теги . вариант ,  вложенные теги . частный ,  msg  =  get_ietf_parts  ( raw_code );если  сообщение,  толокальный  шаблон  =  ( args [ 'шаблон' ]  и  table.concat  ({ '{{' ,  args [ 'template' ],  '}}:' }))  или  '' ; - задайте имя шаблона (если оно предусмотрено шаблоном)return  table.concat  ({ '<span style = \ " font-size: 100%; font-style: normal; \" class = \ " error \" > Ошибка:' ,  template ,  msg ,  '</span>' });конецraw_code  =  format_ietf_tag  ( код ,  подтеги . сценарий ,  подтеги . область ,  подтеги . вариант ,  подтеги . частный ); - форматирование в рекомендуемые стили вложенных тегов; частный опущен, потому что частныйlanguage_name  =  language_name_get  ( raw_code ,  код ); - получить название языка; сначала попробуйте тег ietf, затем код без варианта, затем код с вариантомlanguage_name  =  language_name : GSUB  ( '% S +% B ()' ,  '' ); - удалите разделители неоднозначности или квалификаторы в скобках IANA из имен, в которых они естьесли  ссылка,  то - когда | ссылка = да, wikilink название языкаесли  language_name : find  ( 'languages' ),  тоlanguage_name  =  make_wikilink  ( language_name ,  этикетки ); - собирательное название языка использует простую вики-ссылкуelseif  lang_data . article_name [ code ]  тогдаlanguage_name  =  make_wikilink  ( lang_data . article_name [ code ] [ 1 ],  метка  или  language_name ); - название языка с вики-ссылкой из переопределенных данныхещеlanguage_name  =  make_wikilink  ( language_name  ..  'язык' ,  этикетка  или  language_name ); - название языка с вики-ссылкойконецконецвернуть  имя_языка ;конец- [[-------------------------- <ИМЯ _ ИЗ _ ТЕГА> ------------- ---------------------------------------Точка входа модуля из {{#invoke:}}]]локальная  функция  name_from_tag  ( frame ) - точка входа из {{#invoke: Lang | name_from_tag | <ietf tag> | link = <yes> | template = <имя шаблона>}}return  _name_from_tag  ( getArgs ( frame )) - передать таблицу аргументов, ничего больше; getArgs (), поэтому мы также получаем родительский фреймконец- [[-------------------------- <_ ТЕГ _ ОТ _ ИМЯ> ------------ --------------------------------------Возвращает тег языка ietf, связанный с названием языка. Название языка должно быть написано правильносогласно написанию в исходных таблицах. Когда в названии стандартного языка есть устранитель неоднозначности в скобках,этот устранитель неоднозначности должен быть опущен (их нет в таблицах преобразования имен данных в теги).Точка входа в модуль из другого модуля]]локальная  функция  _tag_from_name  ( args ) - точка входа из другого модуляместное  сообщение ;если  args [ 1 ]  и  ''  ~ =  args [ 1 ],  толокальные  данные  =  mw . loadData  ( 'Модуль: язык / тег из имени' ); - получить перевернутые таблицы данных TODO: изменить при запускеместный  Ланг  =  арг [ 1 ]: нижний (); - разрешить любой регистр для названия языка (правописание должно быть правильным)локальный  тег  =  данные . rev_override_table [ lang ]  или  данные . rev_lang_table [ lang ]  или  данные . rev_lang_dep_table [ языки ]; - получить код; сначала посмотрите на переопределение, затем на стандартесли  тег,  то тег возврата ,  истина ; - имя языка найдено, верните тег и готово; второй возврат, используемый is_lang_name ()ещеmsg  =  'language:'  ..  args [ 1 ]  ..  'not found' - имя языка не найдено, сообщение об ошибкеконецещеmsg  =  'missing language name' - имя языка не указано, сообщение об ошибкеконецлокальный  шаблон  =  '' ;если  args . template  и  ''  ~ =  args . шаблон  тогдаtemplate  =  table.concat  ({ '{{' ,  args [ 'шаблон' ],  '}}:' }); - задайте имя шаблона (если оно предусмотрено шаблоном)конецreturn  table.concat  ({ '<span style = \ " font-size: 100%; font-style: normal; \" class = \ " error \" > Ошибка:' ,  template ,  msg ,  '</span>' });конец- [[-------------------------- <ТЕГ _ ОТ _ ИМЯ> ------------- ---------------------------------------Точка входа модуля из {{#invoke:}}]]локальная  функция  tag_from_name  ( frame ) - точка входа из {{#invoke: Lang | tag_from_name | <название языка> | link = <yes> | template = <имя шаблона>}}локальный  результат ,  _  =  _tag_from_name  ( getArgs ( frame )) - передача таблицы аргументов, больше ничего; getArgs (), поэтому мы также получаем родительский фрейм; подавить второй возврат, используемый is_lang_name ()вернуть  результат ;конец- [[-------------------------- <IS _ LANG _ NAME> ------------- -----------------------------------------Точка входа модуля из {{#invoke:}}]]локальная  функция  is_lang_name  ( фрейм )local  _ ,  result  =  _tag_from_name  ( getArgs ( frame )) - передача таблицы аргументов, больше ничего; getArgs (), поэтому мы также получаем родительский фрейм; подавить второй возврат, используемый tag_from_name ()вернуть  результат  и  истину  или  ноль ;конец- [[-------------------------- <_ TRANSL> ---------------- ------------------------------------------------Точка входа в модуль из другого модуля]]локальная  функция  _transl  ( аргументы )локальный  title_table  =  lang_data . translit_title_table ; - таблица стандартов транслитерации, а также языковые коды и сценарии, применимые к этим стандартамместное  имя_языка ; - название языка, соответствующее коду языка; используется для подсказкиместный  транслит ; - транслитерированный текст для отображениялокальный  сценарий ; - сценарий IANAместное  сообщение ; - поскольку при вызове функции возвращают сообщение об ошибкеif  is_set  ( args [ 3 ]),  то - [3] устанавливается, когда {{transl | code | standard | text}}аргументы . текст  =  аргументы [ 3 ]; - получить транслитерированный текстаргументы . translit_std  =  args [ 2 ]  и  args [ 2 ]: lower (); - получить эталон; нижний регистр для индексации таблицыесли  не  title_table [ args . translit_std ]  тогдавернуть  make_error_msg  ( table.concat  ({ 'непризнанная стандарт транслитерации:' ,  арг . translit_std }),  арг ,  'Пер' );конецещеif  is_set  ( args [ 2 ]),  то - [2] устанавливается, когда {{transl | code | text}}аргументы . текст  =  аргументы [ 2 ]; - получить транслитерированный текстещеесли  args [ 1 ]  и  args [ 1 ]: match  ( '^% a% a% a?% a? $' ),  то - args [2] отсутствует; это args [1] код или это транслитерированный текст?return  make_error_msg  ( 'без текста' ,  аргументы ,  'Перевод' ); - args [1] - это код, поэтому нам не хватает текстаещеаргументы . текст  =  аргументы [ 1 ]; - args [1] не является кодом, поэтому мы его упускаем; назначить args.text для сообщения об ошибкеreturn  make_error_msg  ( 'отсутствует код языка / скрипта' ,  args ,  'Transl' );конецконецконецif  is_set  ( args [ 1 ])  then - код языка IANA, используемый для атрибута html lang =; или код сценария ISO 15924если  args [ 1 ]: match  ( '^% a% a% a?% a? $' )  тогда - args [1] имеет правильную форму?аргументы . код  =  аргументы [ 1 ]: нижний (); - используйте код языка / скрипта; только (2, 3 или 4 буквенных символа); нижний регистр, потому что индексы таблиц строчныеещеВозвращение  make_error_msg  ( table.concat  ({ 'распознан код языка / сценария:' ,  арг [ 1 ]}),  арг ,  'Пер' ); - неверный код языка / скриптаконецещеreturn  make_error_msg  ( 'отсутствует код языка / скрипта' ,  args ,  'Transl' ); - отсутствует код языка / скрипта, поэтому выйдитеконецаргументы . курсив ,  msg  =  validate_italic  ( args );если  сообщение,  тоreturn  make_error_msg  ( msg ,  args ,  'Перевод' );конецесли  'italic'  ==  args . затем курсив  - «курсив», когда | курсив = да; потому что это то же самое, что отсутствует или не установлено и | курсив = по умолчаниюаргументы . курсив  =  ноль ; - установить в ноль;конецесли  override_table [ args . code ],  тогда - это код языка, определенный в таблице переопределения?language_name  =  override_table [ args . код ] [ 1 ];elseif  lang_table [ args . code ]  тогда - это код языка, определенный в таблицах стандартных языковых кодов?language_name  =  lang_table [ аргументы . код ] [ 1 ];elseif  lang_dep_table [ args . code ]  тогда - это код языка, определенный в таблицах устаревших языковых кодов?language_name  =  lang_dep_table [ args . код ] [ 1 ];elseif  script_table [ args . code ]  then - если здесь код не является кодом языка; это код сценария?language_name  =  script_table [ арг . код ] [ 1 ];скрипт  =  аргументы . код ; - код был скриптом ISO 15924, поэтому используйте его вместоаргументы . код  =  '' ; - не установлено, потому что это не код языкаещеВозвращение  make_error_msg  ( table.concat  ({ 'распознан код языка / сценария:' ,  арг . код }),  арг ,  'Пер' ); - неверный код языка / скриптаконец- здесь только тогда, когда все параметры, переданные в make_translit (), действительныВозвращение  make_translit  ( арг . код ,  language_name ,  арг . текст ,  арг . translit_std ,  сценарий ,  арг . курсивный );конец- [[-------------------------- <ПЕРЕВОД> ----------------- -------------------------------------------------Точка входа модуля из {{#invoke:}}]]локальная  функция  transl  ( фрейм )return  _transl  ( getArgs ( кадр ));конец- [[-------------------------- <КАТЕГОРИЯ _ ИЗ _ ТЕГА> ------------- -------------------------------Возвращает имя категории, связанное с языковым тегом IETF, если оно допустимо; сообщение об ошибке ещеВсе комбинации кода, поддерживаемые шаблонами {{lang}} и {{lang-xx}}, поддерживаются этой функцией.Точка входа в модуль из другого модуля]]локальная  функция  _category_from_tag  ( аргументы )локальные  подтеги  =  {}; - Сценарий вложенных тегов IETF, регион, вариант и частныйлокальный  raw_code  =  args [ 1 ]; - сохранить копию входного вложенного тега IETFлокальная  ссылка  =  'да'  ==  аргументы [ 'ссылка' ]; - сделать логическоелокальная  метка  =  args . этикетка ;местный  код ; - код языкаместное  сообщение ; - получает сообщение об ошибке, если языковой тег IETF неверен или недействителенместное  имя_категории  =  '' ;код ,  вложенные теги . скрипт ,  вложенные теги . регион ,  вложенные теги . вариант ,  вложенные теги . частный ,  msg  =  get_ietf_parts  ( raw_code );если  сообщение,  толокальный  шаблон  =  ( args [ 'шаблон' ]  и  table.concat  ({ '{{' ,  args [ 'template' ],  '}}:' }))  или  '' ; - задайте имя шаблона (если оно предусмотрено шаблоном)return  table.concat  ({ '<span style = \ " font-size: 100%; font-style: normal; \" class = \ " error \" > Ошибка:' ,  template ,  msg ,  '</span>' });конецraw_code  =  format_ietf_tag  ( код ,  подтеги . сценарий ,  подтеги . область ,  подтеги . вариант ,  подтеги . частный ); - форматирование в рекомендуемые стили вложенных тегов; частный опущен, потому что частныйcategory_name  =  language_name_get  ( raw_code ,  код ); - получить название языка; сначала попробуйте тег ietf, затем код без варианта, затем код с вариантомимя_категории  =  make_category  ( код ,  имя_категория ,  ноль ,  правда ): GSUB  ( '[% [%]]' ,  '' );вернуть  имя_категории ;конец- [[-------------------------- <КАТЕГОРИЯ _ ИЗ _ ТЕГА> ------------- -------------------------------Точка входа модуля из {{#invoke:}}]]локальная  функция  category_from_tag  ( frame ) - точка входа из {{#invoke: Lang | category_from_tag | <ietf tag> | template = <имя шаблона>}}return  _category_from_tag  ( getArgs  ( frame )); - передать таблицу аргументов, ничего больше; getArgs (), поэтому мы также получаем родительский фреймконец- [[-------------------------- <ЭКСПОРТИРУЕМЫЕ ФУНКЦИИ> ----------------- -------------------------]]return  {category_from_tag  =  category_from_tag ,lang  =  lang , - точка входа для {{lang}}lang_xx_inherit  =  lang_xx_inherit , - точки входа для {{lang- ??}}lang_xx_italic  =  lang_xx_italic ,is_ietf_tag  =  is_ietf_tag ,is_ietf_tag_frame  =  is_ietf_tag_frame ,is_lang_name  =  is_lang_name ,tag_from_name  =  tag_from_name , - возвращает тег ietf, связанный с названием языкаname_from_tag  =  name_from_tag , - используется для документации шаблона; возможное использование в названии ISO 639 из кодовых шаблоновtransl  =  transl , - точка входа для {{transl}}_category_from_tag  =  _category_from_tag , - точки входа, когда этот модуль требует () d в другие модули_lang  =  _lang ,_lang_xx_inherit  =  _lang_xx_inherit ,_lang_xx_italic  =  _lang_xx_italic ,_is_ietf_tag  =  _is_ietf_tag ,get_ietf_parts  =  get_ietf_parts ,_tag_from_name  =  _tag_from_name , _name_from_tag  =  _name_from_tag ,_transl  =  _transl ,};