Bi-directional translator
JavaScript (ES6),  118 113  109 bytes

s=&gt;s.toUpperCase(A=[':)',...'NF1G]H5S9T[X=Z','{N}','M','--*']).replace(/[{-]..|:?./g,c=&gt;A[A.indexOf(c)^1]||c)

Try it online!
How?
Because the input is guaranteed to contain exclusively [a-zA-Z] and/or the special patterns, we can use the following minimal regular expression to match them all:
/[{-]..|:?./g
 [{-]..        // either &quot;{&quot; or &quot;-&quot; followed by 2 other characters
               // -&gt; to match &quot;{N}&quot; or &quot;--*&quot;
        :?.    // or any character, preceded by an optional &quot;:&quot;
               // -&gt; to match &quot;:)&quot; or any single character

Working on the uppercase version of the input, we look for the position of each matched pattern in the lookup array A[] and replace it with its counterpart, or leave it unchanged if it is not found (which may only happen for ABCDEIJKLOPQRUVWY).