Главная страница

Макрос Word для перевода пиньиня в систему Палладия

Макрос Word для перевода пиньиня в систему Палладия с сохранением тонов

Данный макрос Word преобразует выделенный текст (например, выделенное предложение) из пиньиня в систему Палладия. В отличие от других доступных инструментов преобразования макрос сохраняет обозначения тонов. Например, "Nǐ hǎo" преобразуется в "Ни̌ ха̌о". Макрос может преобразовывать только текст, состоящий из раздельных слогов пиньиня.

Исходный код макроса приведен ниже. Его также можно скачать из файла pin2pal.txt. Исходным кодом можно пользоваться свободно, в частности, можно использовать его в своих программах.

Исходный код макроса на VBA

Sub Pin2Pal()
'
' Pin2Pal - Макрос преобразования пиньиня в систему Палладия в выделенном тексте Word
' Виталий Загребельный, 2025
'
Dim Pin2PalTab As String
Dim arr1() As String
Dim token() As String
Dim Pin(500) As String
Dim Pal(500) As String
Dim PinToneI(500) As Integer
Dim PalToneI(500) As Integer

Dim Result As String
Dim Wp As String
Dim Char1 As String
Dim WpLen As Integer
Dim WpLen0 As Integer
Dim Blanks As String


Call PrepareTables(Pin2PalTab) ' Подготовка таблиц перекодировки

arr1 = Split(Pin2PalTab, ",")

For i = 0 To UBound(arr1) ' Подготовка данных - разворачивание таблиц перекодировки
token = Split(Trim(arr1(i)), "-")
Pin(i) = token(0)
Pal(i) = token(1)
PinToneI(i) = token(2)
PalToneI(i) = token(3)
Next i

' Цикл обработки слов в выделенном фрагменте текста Word

For iWord = 1 To Selection.Words.Count

Wp = Selection.Words(iWord) ' Очередное слово пиньинь

WpLen0 = Len(Wp)

WpL = Trim(Wp)
WpLen = Len(WpL)

Blanks = "" ' Слово включает хвостовые пробелы - их сохраняем отдельно
If WpLen <> WpLen0 Then
Blanks = Right(Wp, WpLen0 - WpLen)
End If

WpL = LCase(Wp) ' К маленьким буквам
UpperFirst = 0
If Left(Wp, 1) <> Left(WpL, 1) Then
UpperFirst = 1 ' Первая буква была заглавная
End If

WpS = "" ' Удаление диакритики
For i = 1 To WpLen
Char1 = Mid(WpL, i, 1)
Char1 = Decompose(Char1)
WpS = WpS & Char1
Next i

For i = 0 To UBound(arr1) ' Поиск пиньиня в таблице
If WpS = Pin(i) Then
Pinindex = i
GoTo Found1
End If
Next i

Result = Result & Wp ' Пиньинь не найден в таблице
GoTo NextWord

Found1:
Wr = Pal(Pinindex) ' Палладица
ToneIP = PinToneI(Pinindex) ' Номер буквы с тоном в пиньине
ToneIr = PalToneI(Pinindex) ' Номер буквы с тоном в палладице
Char1 = Mid(WpL, ToneIP, 1) ' Буква с тоном в тексте пиньиня (из маленьких букв)
ToneN = Tone(Char1) ' Ее тон в пиньине

If UpperFirst = 1 Then ' Заглавная если надо
Palleft = Left(Wr, 1)
PalRight = Right(Wr, Len(Wr) - 1)
Palleft = UCase(Palleft)
Wr = Palleft & PalRight
End If
' Вставка тона в палладицу за буквой ToneIr
Palleft = Left(Wr, ToneIr)
PalRight = Right(Wr, Len(Wr) - ToneIr)
If ToneN = 1 Then
Palleft = Palleft & ChrW(769) ' 1
ElseIf ToneN = 2 Then
Palleft = Palleft & ChrW(772) ' 2
ElseIf ToneN = 3 Then
Palleft = Palleft & ChrW(780) ' 3
ElseIf ToneN = 4 Then
Palleft = Palleft & ChrW(768) ' 4
End If
W1 = Palleft & PalRight

' Добавление замененного слова
Result = Result & W1 & Blanks

NextWord:
Next iWord

' Замена пиньиня на палладицу в выделенном тексте Word
Selection = Result

End Sub

' Функция удаления обозначения тона от буквы -------------------------------
Function Decompose(CharX As String)
Dim CharY As String
'fff = Hex(AscW(Mid(CharX, 1, 1)))
CharY = CharX

Select Case CharX
Case ChrW(225)
CharY = "a"
Case ChrW(257) ' a2
CharY = "a"
Case ChrW(462) ' a3
CharY = "a"
Case ChrW(224) ' a4
CharY = "a"

Case ChrW(233) ' e1
CharY = "e"
Case ChrW(275) ' e2
CharY = "e"
Case ChrW(283) ' e3
CharY = "e"
Case ChrW(232) ' e4
CharY = "e"

Case ChrW(237) ' i1
CharY = "i"
Case ChrW(299) ' i2
CharY = "i"
Case ChrW(464) ' i3
CharY = "i"
Case ChrW(236) ' i4
CharY = "i"

Case ChrW(243) ' o1
CharY = "o"
Case ChrW(333) ' o2
CharY = "o"
Case ChrW(466) ' o3
CharY = "o"
Case ChrW(242) ' o4
CharY = "o"

Case ChrW(250) ' u1
CharY = "u"
Case ChrW(363) ' u2
CharY = "u"
Case ChrW(468) ' u3
CharY = "u"
Case ChrW(249) ' u4
CharY = "u"

Case ChrW(472) ' u1
CharY = ChrW(252)
Case ChrW(470) ' u2
CharY = ChrW(252)
Case ChrW(474) ' u3
CharY = ChrW(252)
Case ChrW(476) ' u4
CharY = ChrW(252)

End Select

Decompose = CharY

End Function

' Функция определения номера тона буквы ---------------------------
Function Tone(CharX As String)
Tone = 0

Select Case CharX
Case ChrW(225)
Tone = 1
Case ChrW(257) ' a2
Tone = 2
Case ChrW(462) ' a3
Tone = 3
Case ChrW(224) ' a4
Tone = 4

Case ChrW(233) ' e1
Tone = 1
Case ChrW(275) ' e2
Tone = 2
Case ChrW(283) ' e3
Tone = 3
Case ChrW(232) ' e4
Tone = 4

Case ChrW(237) ' i1
Tone = 1
Case ChrW(299) ' i2
Tone = 2
Case ChrW(464) ' i3
Tone = 3
Case ChrW(236) ' i4
Tone = 4

Case ChrW(243) ' o1
Tone = 1
Case ChrW(333) ' o2
Tone = 2
Case ChrW(466) ' o3
Tone = 3
Case ChrW(242) ' o4
Tone = 4

Case ChrW(250) ' u1
Tone = 1
Case ChrW(363) ' u2
Tone = 2
Case ChrW(468) ' u3
Tone = 3
Case ChrW(249) ' u4
Tone = 4

Case ChrW(472) ' u1
Tone = 1
Case ChrW(470) ' u2
Tone = 2
Case ChrW(474) ' u3
Tone = 3
Case ChrW(476) ' u4
Tone = 4
End Select

End Function

' Функция подготовки таблицы преобразования ---------------------------
Sub PrepareTables(Pin2PalTab As String)

Pin2PalTab = "a-а-1-1, ai-ай-1-1, an-ань-1-1, ang-ан-1-1, ao-ао-1-1, "
Pin2PalTab = Pin2PalTab & "ba-ба-2-2, bai-бай-2-2, ban-бань-2-2, bang-бан-2-2, bao-бао-2-2, bei-бэй-2-2, ben-бэнь-2-2, beng-бэн-2-2, "
Pin2PalTab = Pin2PalTab & "bi-би-2-2, bian-бянь-3-2, biao-бяо-3-2, bie-бе-3-2, bin-бинь-2-2, bing-бин-2-2, bo-бо-2-2, bu-бу-2-2, "
Pin2PalTab = Pin2PalTab & "ca-ца-2-2, cai-цай-2-2, can-цань-2-2, cang-цан-2-2, cao-цао-2-2, ce-цэ-2-2, cei-цэй-2-2, cen-цэнь-2-2, "
Pin2PalTab = Pin2PalTab & "ceng-цэн-2-2, ci-цы-2-2, cong-цун-2-2, cou-цоу-2-2, cu-цу-2-2, cuan-цуань-3-3, cui-цуй-2-2, cun-цунь-2-2, cuo-цо-3-2, "
Pin2PalTab = Pin2PalTab & "cha-ча-3-2, chai-чай-3-2, chan-чань-3-2, chang-чан-3-2, chao-чао-3-2, che-чэ-3-2, chen-чэнь-3-2, cheng-чэн-3-2, "
Pin2PalTab = Pin2PalTab & "chi-чи-3-2, chong-чун-3-2, chou-чоу-3-2, chu-чу-3-2, chua-чуа-4-3, chuai-чуай-4-4, chuan-чуань-4-3, chuang-чуан-4-3, "
Pin2PalTab = Pin2PalTab & "chui-чуй-4-2, chun-чунь-3-2, chuo-чо-4-2, "
Pin2PalTab = Pin2PalTab & "da-да-2-2, dai-дай-2-2, dan-дань-2-2, dang-дан-2-2, dao-дао-2-2, de-дэ-2-2, dei-дэй-2-2, den-дэнь-2-2, "
Pin2PalTab = Pin2PalTab & "deng-дэн-2-2, di-ди-2-2, dia-дя-3-2, dian-дянь-3-2, diang-дян-3-2, diao-дяо-3-2, die-де-3-2, ding-дин-2-2, "
Pin2PalTab = Pin2PalTab & "diu-дю-3-2, dong-дун-2-2, dou-доу-2-2, du-ду-2-2, duan-дуань-3-2, dui-дуй-3-2, dun-дунь-2-2, duo-до-3-2, "
Pin2PalTab = Pin2PalTab & "e-э-1-1, ei-эй-1-1, en-энь-1-1, eng-эн-1-1, er-эр-1-1, "
Pin2PalTab = Pin2PalTab & "fa-фа-2-2, fan-фань-2-2, fang-фан-2-2, fei-фэй-2-2, fen-фэнь-2-2, feng-фэн-2-2, fiao-фяо-3-2, fo-фо-2-2, "
Pin2PalTab = Pin2PalTab & "fou-фоу-2-2, fu-фу-2-2, "
Pin2PalTab = Pin2PalTab & "ga-га-2-2, gai-гай-2-2, gan-гань-2-2, gang-ган-2-2, gao-гао-2-2, ge-гэ-2-2, gei-гэй-2-2, gen-гэнь-2-2, "
Pin2PalTab = Pin2PalTab & "geng-гэн-2-2, go-го-2-2, gong-гун-2-2, gou-гоу-2-2, gu-гу-2-2, gua-гуа-3-3, guai-гуай-3-3, guan-гуань-3-3, "
Pin2PalTab = Pin2PalTab & "guang-гуан-3-3, gui-гуй-3-2, gun-гунь-2-2, guo-го-3-2, "
Pin2PalTab = Pin2PalTab & "ha-ха-2-2, hai-хай-2-2, han-хань-2-2, hang-хан-2-2, hao-хао-2-2, he-хэ-2-2, hei-хэй-2-2, hen-хэнь-2-2, "
Pin2PalTab = Pin2PalTab & "heng-хэн-2-2, hm-хм-2-2, hng-хн-2-2, hong-хун-2-2, hou-хоу-2-2, hu-ху-2-2, hua-хуа-3-3, huai-хуай-3-3, "
Pin2PalTab = Pin2PalTab & "huan-хуань-3-3, huang-хуан-3-3, hui-хуэй-3-3, hun-хунь-2-2, huo-хо-3-2, "
Pin2PalTab = Pin2PalTab & "ji-цзи-2-3, jia-цзя-3-3, jian-цзянь-3-3, jiang-цзян-3-3, jiao-цзяо-3-3, jie-цзе-3-3, jin-цзинь-2-3, jing-цзин-2-3, "
Pin2PalTab = Pin2PalTab & "jiong-цзюн-3-3, jiu-цзю-3-3, ju-цзюй-2-3, juan-цзюань-3-4, jue-цзюэ-3-4, jun-цзюнь-2-3, "
Pin2PalTab = Pin2PalTab & "ka-ка-2-2, kai-кай-2-2, kan-кань-2-2, kang-кан-2-2, kao-као-2-2, ke-кэ-2-2, kei-кэй-2-2, ken-кэнь-2-2, "
Pin2PalTab = Pin2PalTab & "keng-кэн-2-2, kong-кун-2-2, kou-коу-2-2, ku-ку-2-2, kua-куа-3-3, kuai-куай-3-3, kuan-куань-3-3, kuang-куан-3-3, "
Pin2PalTab = Pin2PalTab & "kui-куй-3-2, kun-кунь-2-2, kuo-ко-3-2, "
Pin2PalTab = Pin2PalTab & "la-ла-2-2, lai-лай-2-2, lan-лань-2-2, lang-лан-2-2, lao-лао-2-2, le-лэ-2-2, lei-лэй-2-2, leng-лэн-2-2, "
Pin2PalTab = Pin2PalTab & "li-ли-2-2, lia-ля-3-2, lian-лянь-3-2, liang-лян-3-2, liao-ляо-3-2, lie-ле-3-2, lin-линь-2-2, ling-лин-2-2, "
Pin2PalTab = Pin2PalTab & "liu-лю-3-2, lo-ло-2-2, long-лун-2-2, lou-лоу-2-2, lu-лу-2-2, l" & ChrW(252) & "-люй-2-2, luan-луань-3-3, l" & ChrW(252) & "an-люань-3-3, "
Pin2PalTab = Pin2PalTab & "l" & ChrW(252) & "e-люэ-3-3, lun-лунь-2-2, l" & ChrW(252) & "n-люнь-2-2, luo-ло-3-2, "
Pin2PalTab = Pin2PalTab & "m-м-1-1, ma-ма-2-2, mai-май-2-2, man-мань-2-2, mang-ман-2-2, mao-мао-2-2, me-мэ-2-2, mei-мэй-2-2, "
Pin2PalTab = Pin2PalTab & "men-мэнь-2-2, meng-мэн-2-2, mi-ми-2-2, mian-мянь-3-2, miao-мяо-3-2, mie-ме-3-2, min-минь-2-2, ming-мин-2-2, "
Pin2PalTab = Pin2PalTab & "miu-мю-3-2, mm-мм-2-2, mo-мо-2-2, mou-моу-2-2, mu-му-2-2, "
Pin2PalTab = Pin2PalTab & "n-нь-1-1, na-на-2-2, nai-най-2-2, nan-нань-2-2, nang-нан-2-2, nao-нао-2-2, ne-нэ-2-2, nei-нэй-2-2, "
Pin2PalTab = Pin2PalTab & "nen-нэнь-2-2, neng-нэн-2-2, ng-н-1-1, ni-ни-2-2, nia-ня-3-2, nian-нянь-3-2, niang-нян-3-2, niao-няо-3-2, "
Pin2PalTab = Pin2PalTab & "nie-не-3-2, nin-нинь-2-2, ning-нин-2-2, niu-ню-3-2, nong-нун-2-2, nou-ноу-2-2, nu-ну-2-2, nun-нунь-2-2, "
Pin2PalTab = Pin2PalTab & "n" & ChrW(252) & "-нюй-2-2, nuan-нуань-3-3, n" & ChrW(252) & "e-нюэ-3-3, nuo-но-3-2, "
Pin2PalTab = Pin2PalTab & "o-о-1-1, ou-оу-1-1, "
Pin2PalTab = Pin2PalTab & "pa-па-2-2, pai-пай-2-2, pan-пань-2-2, pang-пан-2-2, pao-пао-2-2, pei-пэй-2-2, pen-пэнь-2-2, peng-пэн-2-2, "
Pin2PalTab = Pin2PalTab & "pi-пи-2-2, pian-пянь-3-2, piang-пян-3-2, piao-пяо-3-2, pie-пе-3-2, pin-пинь-2-2, ping-пин-2-2, po-по-2-2, "
Pin2PalTab = Pin2PalTab & "pou-поу-2-2, pu-пу-2-2, "
Pin2PalTab = Pin2PalTab & "qi-ци-2-2, qia-ця-3-2, qian-цянь-3-2, qiang-цян-3-2, qiao-цяо-3-2, qie-це-3-2, qin-цинь-2-2, qing-цин-2-2, "
Pin2PalTab = Pin2PalTab & "qiong-цюн-3-2, qiu-цю-3-2, qu-цюй-2-2, quan-цюань-3-3, que-цюэ-3-3, qun-цюнь-2-2, "
Pin2PalTab = Pin2PalTab & "ran-жань-2-2, rang-жан-2-2, rao-жао-2-2, re-жэ-2-2, rem-жэм-2-2, ren-жэнь-2-2, reng-жэн-2-2, ri-жи-2-2, "
Pin2PalTab = Pin2PalTab & "rong-жун-2-2, rou-жоу-2-2, ru-жу-2-2, rua-жуа-3-3, ruan-жуань-3-3, rui-жуй-3-2, run-жунь-2-2, ruo-жо-3-2, "
Pin2PalTab = Pin2PalTab & "sa-са-2-2, sai-сай-2-2, san-сань-2-2, sang-сан-2-2, sao-сао-2-2, se-сэ-2-2, sei-сэй-2-2, sen-сэнь-2-2, "
Pin2PalTab = Pin2PalTab & "seng-сэн-2-2, si-сы-2-2, song-сун-2-2, sou-соу-2-2, su-су-2-2, suan-суань-3-2, sui-суй-3-2, sun-сунь-2-2, suo-со-3-2, "
Pin2PalTab = Pin2PalTab & "sha-ша-3-2, shai-шай-3-2, shan-шань-3-2, shang-шан-3-2, shao-шао-3-2, she-шэ-3-2, shei-шэй-3-2, shen-шэнь-3-2, "
Pin2PalTab = Pin2PalTab & "sheng-шэн-3-2, shi-ши-3-2, shou-шоу-3-2, shu-шу-3-2, shua-шуа-4-4, shuai-шуай-4-3, shuan-шуань-4-3, shuang-шуан-4-3, "
Pin2PalTab = Pin2PalTab & "shui-шуй-4-2, shun-шунь-3-2, shuo-шо-4-2, "
Pin2PalTab = Pin2PalTab & "ta-та-2-2, tai-тай-2-2, tan-тань-2-2, tang-тан-2-2, tao-тао-2-2, te-тэ-2-2, tei-тэй-2-2, ten-тэнь-2-2, "
Pin2PalTab = Pin2PalTab & "teng-тэн-2-2, ti-ти-2-2, tian-тянь-3-2, tiang-тян-3-2, tiao-тяо-3-2, tie-те-3-2, ting-тин-2-2, tong-тун-2-2, "
Pin2PalTab = Pin2PalTab & "tou-тоу-2-2, tu-ту-2-2, tuan-туань-3-3, tui-туй-3-2, tun-тунь-2-2, tuo-то-3-2, "
Pin2PalTab = Pin2PalTab & "wa-ва-2-2, wai-вай-2-2, wan-вань-2-2, wang-ван-2-2, wao-вао-3-3, wei-вэй-2-2, wen-вэнь-2-2, weng-вэн-2-2, wo-во-2-2, wu-у-2-1, "
Pin2PalTab = Pin2PalTab & "xi-си-2-2, xia-ся-3-2, xian-сянь-3-2, xiang-сян-3-2, xiao-сяо-3-2, xie-се-3-2, xin-синь-2-2, xing-син-2-2, "
Pin2PalTab = Pin2PalTab & "xiong-сюн-3-2, xiu-сю-3-2, xu-сюй-2-2, xuan-сюань-3-3, xue-сюэ-3-3, xun-сюнь-2-2, "
Pin2PalTab = Pin2PalTab & "ya-я-2-1, yai-яй-2-1, yan-янь-2-1, yang-ян-2-1, yao-яо-2-1, ye-е-2-1, yi-и-2-1, yin-инь-2-1, "
Pin2PalTab = Pin2PalTab & "ying-ин-2-1, yo-ё-2-1, yong-юн-2-1, you-ю-2-1, yu-юй-2-1, yuan-юань-3-2, yue-юэ-3-2, yun-юнь-2-1, "
Pin2PalTab = Pin2PalTab & "za-цза-2-3, zai-цзай-2-3, zan-цзань-2-3, zang-цзан-2-3, zao-цзао-2-3, ze-цзэ-2-3, zei-цзэй-2-3, zem-цзэм-2-3, "
Pin2PalTab = Pin2PalTab & "zen-цзэнь-2-3, zeng-цзэн-2-3, zi-цзы-2-3, zong-цзун-2-3, zou-цзоу-2-3, zu-цзу-2-3, zuan-цзуань-3-4, zui-цзуй-3-3, zun-цзунь-2-3, zuo-цзо-3-3, "
Pin2PalTab = Pin2PalTab & "zha-чжа-3-3, zhai-чжай-3-3, zhan-чжань-3-3, zhang-чжан-3-3, zhao-чжао-3-3, zhe-чжэ-3-3, zhei-чжэй-3-3, zhen-чжэнь-3-3, "
Pin2PalTab = Pin2PalTab & "zheng-чжэн-3-3, zhi-чжи-3-3, zhong-чжун-3-3, zhou-чжоу-3-3, zhu-чжу-3-3, zhua-чжуа-4-4, zhuai-чжуай-4-4, zhuan-чжуань-4-4, "
Pin2PalTab = Pin2PalTab & "zhuang-чжуан-4-4, zhui-чжуй-4-3, zhun-чжунь-3-3, zhuo-чжо-4-3 "

End Sub
© Загребельный В.А., 2025