This would be quite a work. You need to build virtual fonts mapping each Latin Character to their T2A counterpart using the OT2 correspondence with the ligatures pointing to the right character.
It's possible to automate this creation, which should be made for every font you plan to use, because the scheme is fixed. I can easily predict many hours of tedious labour.
A TeX solution could consist in examining characters in pairs. If they form a ligature, print the corresponding character and go on with the next two; otherwise, print the first and restart with the next two.
Here's a proof of concept; there are problems with spaces, so this simple macros won't work in the argument of other commands. A slower routine should be used, for that case, or a different approach with LaTeX3 functions.
\documentclass{article}
\usepackage[T2A,T1]{fontenc}
\makeatletter
\newcommand{\cyrtext}{%
\begingroup\fontencoding{T2A}\selectfont
\catcode`\ =12 \@cyrtext}
\def\@cyrtext#1{%
\@@cyrtext#1\@empty\@empty
\endgroup
}
\def\@@cyrtext#1#2{%
\ifx#2\@empty
\csname @cyr@#1\endcsname
\expandafter\@gobble
\else
\expandafter\@firstofone
\fi
{\@@cyr#1#2}%
}
\def\@@cyr#1#2{%
\ifcsname @cyr@#1#2\endcsname
\csname @cyr@#1#2\endcsname
\expandafter\@firstoftwo
\else
\csname @cyr@#1\endcsname
\expandafter\@secondoftwo
\fi
{\@@cyrtext}%
{\@@cyrtext#2}%
}
\def\@cyr@R{\CYRR}
\def\@cyr@u{\cyru}
\def\@cyr@s{\cyrs}
\def\@cyr@k{\cyrk}
\def\@cyr@i{\cyri}
\@namedef{@cyr@i0}{\cyrishrt}
\@namedef{@cyr@ }{ }
\def\@cyr@ya{\cyrya}
\def\@cyr@z{\cyrz}
\def\@cyr@y{\cyrery}
%%% supplement all other needed macros
\makeatother
\begin{document}
\cyrtext{Russkii0 yazyk}
\end{document}

Here's a possible implementation with LaTeX3, which allows for including \cyrtext
as argument to another command. The character |
shouldn't appear in the argument. Nor, with the current definitions, any macro.
\documentclass{article}
\usepackage[T2A,T1]{fontenc}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\cyrtext}{m}
{
\group_begin:
\fontencoding{T2A}\selectfont
\djk_cyrtext:n { #1 }
\group_end:
}
\tl_new:N \l_djk_cyrtext_tl
\prop_new:N \g_djk_cyrletters_prop
\cs_generate_variant:Nn \prop_get:Nn { Nx }
\cs_new_protected:Npn \djk_cyrtext:n #1
{
\tl_set:Nn \l_djk_cyrtext_tl { #1 \prg_do_nothing: \prg_do_nothing: }
\tl_replace_all:Nnn \l_djk_cyrtext_tl { ~ } { | }
\exp_after:wN \__djk_cyrtext:NN \l_djk_cyrtext_tl
}
\cs_new_protected:Npn \__djk_cyrtext:NN #1 #2
{
\token_if_eq_meaning:NNTF \prg_do_nothing: #2
{ \prop_get:Nx \g_djk_cyrletters_prop { #1 } }
{ \__djk_cyrtext_aux:NN #1 #2 }
}
\cs_new_protected:Npn \__djk_cyrtext_aux:NN #1 #2
{
\prop_if_in:NnTF \g_djk_cyrletters_prop { #1 #2 }
{ \prop_get:Nn \g_djk_cyrletters_prop { #1 #2 } \__djk_cyrtext:NN }
{ \prop_get:Nn \g_djk_cyrletters_prop { #1 } \__djk_cyrtext:NN #2 }
}
\prop_gput:Nnn \g_djk_cyrletters_prop { } { } % empty property
\prop_gput:Nnn \g_djk_cyrletters_prop { | } { ~ } % | is a space
\prop_gput:Nnn \g_djk_cyrletters_prop { R } { \CYRR }
\prop_gput:Nnn \g_djk_cyrletters_prop { u } { \cyru }
\prop_gput:Nnn \g_djk_cyrletters_prop { s } { \cyrs }
\prop_gput:Nnn \g_djk_cyrletters_prop { k } { \cyrk }
\prop_gput:Nnn \g_djk_cyrletters_prop { i } { \cyri }
\prop_gput:Nnn \g_djk_cyrletters_prop { i0 }{ \cyrishrt }
\prop_gput:Nnn \g_djk_cyrletters_prop { ya }{ \cyrya }
\prop_gput:Nnn \g_djk_cyrletters_prop { z } { \cyrz }
\prop_gput:Nnn \g_djk_cyrletters_prop { y } { \cyrery }
%%% add all the other combinations
\ExplSyntaxOff
\begin{document}
\cyrtext{Russkii0 yazyk}
\textbf{\cyrtext{Russkii0}}
\end{document}
