@@ -15,7 +15,7 @@ public class TranslationMapping
15
15
16
16
private List < int > originalIndexs = new List < int > ( ) ;
17
17
private List < int > translatedIndexs = new List < int > ( ) ;
18
- private int translaedLength = 0 ;
18
+ private int translatedLength = 0 ;
19
19
20
20
public string key { get ; private set ; }
21
21
@@ -32,13 +32,13 @@ public void AddNewIndex(int originalIndex, int translatedIndex, int length)
32
32
originalIndexs . Add ( originalIndex ) ;
33
33
translatedIndexs . Add ( translatedIndex ) ;
34
34
translatedIndexs . Add ( translatedIndex + length ) ;
35
- translaedLength += length - 1 ;
35
+ translatedLength += length - 1 ;
36
36
}
37
37
38
38
public int MapToOriginalIndex ( int translatedIndex )
39
39
{
40
40
if ( translatedIndex > translatedIndexs . Last ( ) )
41
- return translatedIndex - translaedLength - 1 ;
41
+ return translatedIndex - translatedLength - 1 ;
42
42
43
43
int lowerBound = 0 ;
44
44
int upperBound = originalIndexs . Count - 1 ;
@@ -83,7 +83,7 @@ public int MapToOriginalIndex(int translatedIndex)
83
83
translatedIndex < translatedIndexs [ upperBound * 2 ] )
84
84
{
85
85
int indexDef = 0 ;
86
-
86
+
87
87
for ( int j = 0 ; j < upperBound ; j ++ )
88
88
{
89
89
indexDef += translatedIndexs [ j * 2 + 1 ] - translatedIndexs [ j * 2 ] ;
@@ -102,9 +102,24 @@ public void endConstruct()
102
102
}
103
103
}
104
104
105
+ /// <summary>
106
+ /// Translate a language to English letters using a given rule.
107
+ /// </summary>
105
108
public interface IAlphabet
106
109
{
110
+ /// <summary>
111
+ /// Translate a string to English letters, using a given rule.
112
+ /// </summary>
113
+ /// <param name="stringToTranslate">String to translate.</param>
114
+ /// <returns></returns>
107
115
public ( string translation , TranslationMapping map ) Translate ( string stringToTranslate ) ;
116
+
117
+ /// <summary>
118
+ /// Determine if a string can be translated to English letter with this Alphabet.
119
+ /// </summary>
120
+ /// <param name="stringToTranslate">String to translate.</param>
121
+ /// <returns></returns>
122
+ public bool CanBeTranslated ( string stringToTranslate ) ;
108
123
}
109
124
110
125
public class PinyinAlphabet : IAlphabet
@@ -119,63 +134,70 @@ public void Initialize([NotNull] Settings settings)
119
134
_settings = settings ?? throw new ArgumentNullException ( nameof ( settings ) ) ;
120
135
}
121
136
137
+ public bool CanBeTranslated ( string stringToTranslate )
138
+ {
139
+ return WordsHelper . HasChinese ( stringToTranslate ) ;
140
+ }
141
+
122
142
public ( string translation , TranslationMapping map ) Translate ( string content )
123
143
{
124
144
if ( _settings . ShouldUsePinyin )
125
145
{
126
146
if ( ! _pinyinCache . ContainsKey ( content ) )
127
147
{
128
- if ( WordsHelper . HasChinese ( content ) )
129
- {
130
- var resultList = WordsHelper . GetPinyinList ( content ) ;
131
-
132
- StringBuilder resultBuilder = new StringBuilder ( ) ;
133
- TranslationMapping map = new TranslationMapping ( ) ;
134
-
135
- bool pre = false ;
148
+ return BuildCacheFromContent ( content ) ;
149
+ }
150
+ else
151
+ {
152
+ return _pinyinCache [ content ] ;
153
+ }
154
+ }
155
+ return ( content , null ) ;
156
+ }
136
157
137
- for ( int i = 0 ; i < resultList . Length ; i ++ )
138
- {
139
- if ( content [ i ] >= 0x3400 && content [ i ] <= 0x9FD5 )
140
- {
141
- map . AddNewIndex ( i , resultBuilder . Length , resultList [ i ] . Length + 1 ) ;
142
- resultBuilder . Append ( ' ' ) ;
143
- resultBuilder . Append ( resultList [ i ] ) ;
144
- pre = true ;
145
- }
146
- else
147
- {
148
- if ( pre )
149
- {
150
- pre = false ;
151
- resultBuilder . Append ( ' ' ) ;
152
- }
153
-
154
- resultBuilder . Append ( resultList [ i ] ) ;
155
- }
156
- }
158
+ private ( string translation , TranslationMapping map ) BuildCacheFromContent ( string content )
159
+ {
160
+ if ( WordsHelper . HasChinese ( content ) )
161
+ {
162
+ var resultList = WordsHelper . GetPinyinList ( content ) ;
157
163
158
- map . endConstruct ( ) ;
164
+ StringBuilder resultBuilder = new StringBuilder ( ) ;
165
+ TranslationMapping map = new TranslationMapping ( ) ;
159
166
160
- var key = resultBuilder . ToString ( ) ;
161
- map . setKey ( key ) ;
167
+ bool pre = false ;
162
168
163
- return _pinyinCache [ content ] = ( key , map ) ;
169
+ for ( int i = 0 ; i < resultList . Length ; i ++ )
170
+ {
171
+ if ( content [ i ] >= 0x3400 && content [ i ] <= 0x9FD5 )
172
+ {
173
+ map . AddNewIndex ( i , resultBuilder . Length , resultList [ i ] . Length + 1 ) ;
174
+ resultBuilder . Append ( ' ' ) ;
175
+ resultBuilder . Append ( resultList [ i ] ) ;
176
+ pre = true ;
164
177
}
165
178
else
166
179
{
167
- return ( content , null ) ;
180
+ if ( pre )
181
+ {
182
+ pre = false ;
183
+ resultBuilder . Append ( ' ' ) ;
184
+ }
185
+
186
+ resultBuilder . Append ( resultList [ i ] ) ;
168
187
}
169
188
}
170
- else
171
- {
172
- return _pinyinCache [ content ] ;
173
- }
189
+
190
+ map . endConstruct ( ) ;
191
+
192
+ var key = resultBuilder . ToString ( ) ;
193
+ map . setKey ( key ) ;
194
+
195
+ return _pinyinCache [ content ] = ( key , map ) ;
174
196
}
175
197
else
176
198
{
177
199
return ( content , null ) ;
178
200
}
179
201
}
180
202
}
181
- }
203
+ }
0 commit comments