cg@2015: "{ Package: 'stx:libtool2' }" cg@2015: cg@2015: "{ NameSpace: Tools }" cg@2015: cg@2015: ApplicationModel subclass:#InternationalLanguageTranslationEditor cg@2015: instanceVariableNames:'languagesList keyStringsToLanguageMappings languageTextHolder cg@2015: originalTextHolder modified shownLanguages selectedKeyRow cg@2015: showMissingTranslationsOnly cg@2015: keyStringAndLanguageSelectionTableColumnDescriptionHolder cg@2015: languageShownHolders dataSetView lastExtractedClass cg@2015: lastExtractedApplicationClass stopApplicationIconVisibleHolder cg@2015: monitoredApplication originalTextModifiedHolder cg@2048: languageTextModifiedHolder languageTextAcceptHolder cg@2048: inSingleFileMode lastExtractedProject lastLanguage fm@2050: lastSelectedKey autoAcceptHolder languageEditor fm@2050: selectedColIndexHolder exampleLanguageSelectionHolder fm@2051: exampleLanguageTextHolder pastePreviousTranslationEnableHolder fm@2163: searchForSimilarTranslationEnableHolder alwaysWriteUTF8Holder fm@2327: lastNameSpace pasteOriginalEnableHolder ignoreCaseHolder fm@2327: closeSearchBar searchTextModifiedHolder searchNextText fm@2327: searchBarImageInfoLabelHolder searchPreviousText searchBoxVisible fm@2327: searchBarInfoLabelHolder searchTextHolder searchTextView fm@2327: searchBoxView translationsPanel lastPackage' cg@2032: classVariableNames:'LastExtractedClass LastExtractedApplicationClass cg@2410: LastExtractedProject LastProject' cg@2015: poolDictionaries:'' cg@2015: category:'Interface-UIPainter' cg@2015: ! cg@2015: cg@2015: Object subclass:#AccessCollectingPseudoResourcePack cg@2015: instanceVariableNames:'collectedKeys realResourcePack' cg@2015: classVariableNames:'' cg@2015: poolDictionaries:'' cg@2015: privateIn:InternationalLanguageTranslationEditor cg@2015: ! cg@2015: cg@2015: Collection subclass:#KeyStringsToLanguageMappings cg@2032: instanceVariableNames:'keys keyInfo perLanguageInfo perLanguageMappings languageMappings fm@2049: languages rowPerKey' cg@2015: classVariableNames:'' cg@2015: poolDictionaries:'' cg@2015: privateIn:InternationalLanguageTranslationEditor cg@2015: ! cg@2015: cg@2015: Object subclass:#LanguageMappingRow cg@2015: instanceVariableNames:'key mappings' cg@2015: classVariableNames:'' cg@2015: poolDictionaries:'' cg@2015: privateIn:InternationalLanguageTranslationEditor cg@2015: ! cg@2015: cg@2015: Visitor subclass:#UISpecVisitor cg@2015: instanceVariableNames:'translatedLabels' cg@2015: classVariableNames:'' cg@2015: poolDictionaries:'' cg@2015: privateIn:InternationalLanguageTranslationEditor cg@2015: ! cg@2015: cg@2015: !InternationalLanguageTranslationEditor class methodsFor:'documentation'! cg@2015: cg@2015: documentation cg@2015: " cg@2015: documentation to be added. cg@2015: cg@2015: [author:] cg@2015: cg (cg@FUSI) cg@2015: cg@2015: [instance variables:] cg@2015: cg@2015: [class variables:] cg@2015: cg@2015: [see also:] cg@2015: cg@2015: " cg@2015: ! cg@2015: cg@2015: examples cg@2015: " cg@2015: Starting the application: cg@2015: [exBegin] cg@2015: InternationalLanguageTranslationEditor open cg@2015: cg@2015: [exEnd] cg@2015: cg@2015: more examples to be added: cg@2015: [exBegin] cg@2015: ... add code fragment for cg@2015: ... executable example here ... cg@2015: [exEnd] cg@2015: " cg@2015: ! cg@2015: cg@2015: history cg@2015: "Created: / 04-03-2006 / 09:07:19 / cg" cg@2015: ! ! cg@2015: fm@2327: !InternationalLanguageTranslationEditor class methodsFor:'image specs'! fm@2327: fm@2327: closeSearchBarIcon fm@2327: "This resource specification was automatically generated fm@2327: by the ImageEditor of ST/X." fm@2327: fm@2327: "Do not manually edit this!! If it is corrupted, fm@2327: the ImageEditor may not be able to read the specification." fm@2327: fm@2327: " fm@2327: self closeSearchBar inspect fm@2327: ImageEditor openOnClass:self andSelector:#closeSearchBar fm@2327: Icon flushCachedIcons fm@2327: " fm@2327: fm@2327: fm@2327: fm@2327: ^Icon fm@2327: constantNamed:#'Psiware::SystemManagement class closeSearchBar' fm@2327: ifAbsentPut:[(Depth8Image new) width: 22; height: 22; photometric:(#palette); bitsPerSample:(#[8]); samplesPerPixel:(1); bits:(ByteArray fromPackedString:' fm@2327: @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@GQ\SD1LSD1LSD1LSD1LWGP@@@@@@ fm@2327: @ATGA@HA@PDA@PDA@PHDA1T@@@@@@@@TAENG!!(VB XA?_''57QPPT@@@@@@@@E NJ^V)&X%)UTT5IV7 KE @@@@@@@A A"7Q,#&9VS%^MQ$ER$9JR$9ION''(PF0@@@@@@@A fm@2327: fm@2327: ^Icon fm@2327: constantNamed:#'Psiware::SystemManagement class restartSearchBarIcon' fm@2327: ifAbsentPut:[(Depth24Image new) width: 20; height: 20; photometric:(#rgb); bitsPerSample:(#[8 8 8]); samplesPerPixel:(3); bits:(ByteArray fromPackedString:' fm@2327: @@@@@@@@@@@@@@@@@@@@@@@@?>SX?>''V?>;)?>O!!?>G]?>WY@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@?=3\:[>''5;JF/Y-.+XY),(U. fm@2327: 6JZK?=J1?>V<>.+I@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@?>?'':+:!!19]U6*-Q?]Y/?>RC?>*!!?>F_>+=939UL2Y!!L>MJT??W[@@@@@@@@@@@@@@@@@@@@ fm@2327: @@@@??[-=\^&1IEP=1/?=5$?=52?>NT?=^Q?>BP?>FG>;1]6JEO8;^H?]3I@@@@@@@@@@@@@@@@@@@@?\*95Y-)<+!!$??.F?>)17+-U8,E40Y-.09I) fm@2327: :Z1-?=I??=)8?<1.>K597;NL??K,@@@@@@@@@@@@?=#M6I>B>+:@?>2U=,]]5[IN7,^C5LB[;Y[??FP?=>O1YEW8,"%8Z:A?>N#?>._5KA$9-JW7=+FX6M+V%U3"''*T0Y>V4ZA7595T=;1"?=&D?=&L,W(93IU\:KE9=LBG9[Q9;K17?=?/? fm@2327: >^_''3*.M0YAUZO?=>G?+U(69YI3:IG?=Z@?>NU5:=19,6%@@@@@@@@OU5*2.+7;O??5-KF2;JS?=*&?>&"?=.E?>2R?=&F?>"X8I-N5)ED fm@2327: 29$&?>M:?=*F3:E&>]/A@@@@@@@@O5=.7O??5^/(?O++0I-/;LNE??2)?=&B?>^%,W)A8:14?=FX3)TR?>U/?=Q:3IAZ?=?T@@@@@@@@P5Y68_#?7.70 fm@2327: ??[1??C_:,F%6;A=>MJA?>6":,6+&G91?>+^?>+]79<$?<1\?=:C5IM[?<;F@@@@@@@@Q$1>6N_?3*??S(=,.(2Z!!#=-:^+9>P4,[P<>''46=O^ fm@2327: =+MX;Z)O?>^Q:Z]*;+Z''@@@@@@@@TD:O9^/?;/C??>???>/:?>71?>7Z;]^%0+JA7=CI8]O"0+[D8=#&?<&V79="?=2L?\E88[BG@@@@@@@@VU&M=_3?9N''? fm@2327: >/C???K??NK/??[1???#9M?B??3;(IV#/[WD;^_5@@@@;KR]<[10?=Q68[9,8,>W@@@@TU9&;/??9__9:.;/?_#?[==?79>_?=<_S9T5M[0,WN7^G* fm@2327: @@@@@@@@1Y= >=!!>9,]-3[],6]B''TEH=;O_''=O?6>O77>O''=>//?=_+?:O_?:_''?>O??SEM[/<[P6.O,@@@@@@@@8-F%1*%/9[>@?>R(7+VG_%,;\E]CW$=H fm@2327: U5AWV5%.U5);R5M:Q5M;S%-=TE]*[GI>):696M;*@@@@@@@@@@@@6\F[2Y914)9.;[VF?L"!!8[^_3J>''0KB:0;?V0,_''-3))5/II9+9FF+9> 0;7I5-#-7NO?7^#?8^/?:/G?7NK07>W3@@@@@@@@@@@@@@@@@@@@@@@@?>N;?>N;?=:9?>7T?>#X fm@2327: >^_%=N?6O???O?????_??>_??>_??>_??>_??>_??>_??__??O???O???G???A??/A? O') ; yourself); yourself] fm@2327: ! fm@2327: fm@2327: searchNextIcon fm@2327: "This resource specification was automatically generated fm@2327: by the ImageEditor of ST/X." fm@2327: fm@2327: "Do not manually edit this!! If it is corrupted, fm@2327: the ImageEditor may not be able to read the specification." fm@2327: fm@2327: " fm@2327: self searchNextIcon inspect fm@2327: ImageEditor openOnClass:self andSelector:#searchNextIcon fm@2327: Icon flushCachedIcons fm@2327: " fm@2327: fm@2327: fm@2327: fm@2327: ^Icon fm@2327: constantNamed:#'Psiware::SystemManagement class searchNextIcon' fm@2327: ifAbsentPut:[(Depth8Image new) width: 22; height: 22; photometric:(#palette); bitsPerSample:(#[8]); samplesPerPixel:(1); bits:(ByteArray fromPackedString:' fm@2327: @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ZE)ZZ@@@@@@@@@@@@@@@ fm@2327: @@@@@@AFF XA@PXUQ @@@@@@@@@@@@@@@@@*@Q5G^WX6E0D*@@@@@@@@@@@@@@@,AVQ?\&1#W&X8@20@@@@@@@@@@@A[@U==\F-"VUQOUSLAV0@@@@@@@@@@ fm@2327: G19-D N2 H# @@@@@@@@@''GG)*Y2$9NRIDO4DQHP@@@@@@@@@@!!@EP[6U]I"UIQTL.@XP@@@@@@@@@@@ALAD-.XE]VS$(/@$0@@@@@@@@@@@@@@EDA fm@2327: FSQ!!VC@T@UD@@@@@@@@@@@@@@@@@#R,I@PDIJ84@@@@@@@@@@@@@@@@@@@@@%)^W% @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ fm@2327: @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@a') ; colorMapFromArray:#[0 0 0 48 54 77 55 63 87 56 64 89 57 67 90 59 67 90 64 69 89 71 74 92 72 76 96 76 81 100 80 89 118 82 90 119 83 91 120 84 92 122 86 94 123 87 96 124 89 97 126 92 104 132 97 106 136 97 110 138 97 112 138 100 102 112 101 107 130 104 118 144 105 113 135 105 124 146 107 109 118 107 116 144 110 127 148 112 126 148 113 129 148 117 119 129 118 130 156 119 123 133 125 140 174 127 131 146 127 132 148 127 146 178 130 151 181 131 132 143 133 149 185 133 152 182 134 134 138 137 140 150 138 138 142 139 156 191 141 160 195 143 164 199 143 169 198 144 157 197 144 158 197 152 173 208 153 184 209 155 167 210 156 180 208 157 179 215 157 180 211 160 162 171 160 173 216 160 174 216 160 182 214 161 173 217 161 174 217 161 176 219 161 179 220 161 180 220 163 182 222 163 184 222 164 182 222 164 184 223 166 164 161 166 189 212 166 194 211 167 190 228 167 194 229 167 200 221 169 170 174 169 195 212 169 196 232 170 181 228 170 203 221 171 171 176 171 173 182 171 193 220 173 182 232 173 192 232 173 200 234 175 206 239 175 210 240 176 188 237 178 175 168 178 175 173 178 202 234 178 206 240 179 195 238 180 205 223 180 214 243 180 216 244 181 193 242 181 195 239 181 204 223 181 212 243 182 206 242 182 209 243 184 180 173 184 211 244 184 215 245 185 198 246 185 200 244 188 215 233 188 225 249 189 226 249 190 206 250 190 219 248 191 209 249 191 217 248 191 222 248 192 188 181 192 221 249 194 190 184 195 191 184 196 226 251 196 232 251 199 196 189 202 198 191 202 226 253 203 199 193 203 229 253 203 237 252 203 237 253 204 202 196 206 202 195 206 205 204 207 203 196 208 204 197 208 205 201 212 208 200 212 208 201 212 208 202 212 209 205 213 210 202 213 212 213 214 211 206 215 212 207 216 213 206 218 215 210 220 221 223 221 219 214 222 219 215 222 220 215 230 228 225 236 235 232 243 243 244 255 255 255]; mask:((Depth1Image new) width: 22; height: 22; photometric:(#blackIs0); bitsPerSample:(#[1]); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'@@@C@@@C@@@C@G C@_8C@?CC??CC??CG??#G??#G??#G??#C??CC??CA?>C@? fm@2327: fm@2327: ^Icon fm@2327: constantNamed:#'Psiware::SystemManagement class searchPreviousIcon' fm@2327: ifAbsentPut:[(Depth8Image new) width: 22; height: 22; photometric:(#palette); bitsPerSample:(#[8]); samplesPerPixel:(1); bits:(ByteArray fromPackedString:' fm@2327: @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%)^W% @@@@@@@@@@@@@@ fm@2327: @@@@@@BMJ0$A@P$+#P@@@@@@@@@@@@@@@@AQ@Q$4XU 0E@EQ@@@@@@@@@@@@@@ALAD-.XE]VS$(/@$0@@@@@@@@@@@BD@UA/YU4&IT%EP28A!!@@@@@@@@@@@ fm@2327: I11:Z&\)NS$"QC=ADRD@@@@@@@@@# !!H]F$N2 H# @@@@@@@H,A GE\FI"Y&Y VMS)@@X,@@@@@@@BG@XE3HIJY&Y&Y$!!,=P FG@@@@@@@@ ]M fm@2327: T5JY&Y&Y&Y%RLR4G @@@@@@@@@_G&4RC08MC@,JDC\SG0@@@@@@@@@@V0E__WA+X%%TS5T3@U,@@@@@@@@@@@@,AVQ?\&1#W&X8@20@@@@@@@@@@@@@@B(A fm@2327: GT]9]#XW@R(@@@@@@@@@@@@@@@@@Q!!(F@PDFETX@@@@@@@@@@@@@@@@@@@@@ZE)ZZ@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ fm@2327: @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@a') ; colorMapFromArray:#[0 0 0 48 54 77 55 63 87 56 64 89 57 67 90 59 67 90 64 69 89 71 74 92 72 76 96 76 81 100 80 89 118 82 90 119 83 91 120 84 92 122 86 94 123 87 96 124 89 97 126 92 104 132 97 106 136 97 110 138 97 112 138 100 102 112 101 107 130 104 118 144 105 113 135 105 124 146 107 109 118 107 116 144 110 127 148 112 126 148 113 129 148 117 119 129 118 130 156 119 123 133 125 140 174 127 131 146 127 132 148 127 146 178 130 151 181 131 132 143 133 149 185 133 152 182 134 134 138 137 140 150 138 138 142 139 156 191 141 160 195 143 164 199 143 169 198 144 157 197 144 158 197 152 173 208 153 184 209 155 167 210 156 180 208 157 179 215 157 180 211 160 162 171 160 173 216 160 174 216 160 182 214 161 173 217 161 174 217 161 176 219 161 179 220 161 180 220 163 182 222 163 184 222 164 182 222 164 184 223 166 164 161 166 189 212 166 194 211 167 190 228 167 194 229 167 200 221 169 170 174 169 195 212 169 196 232 170 181 228 170 203 221 171 171 176 171 173 182 171 193 220 173 182 232 173 192 232 173 200 234 175 206 239 175 210 240 176 188 237 178 175 168 178 175 173 178 202 234 178 206 240 179 195 238 180 205 223 180 214 243 180 216 244 181 193 242 181 195 239 181 204 223 181 212 243 182 206 242 182 209 243 184 180 173 184 211 244 184 215 245 185 198 246 185 200 244 188 215 233 188 225 249 189 226 249 190 206 250 190 219 248 191 209 249 191 217 248 191 222 248 192 188 181 192 221 249 194 190 184 195 191 184 196 226 251 196 232 251 199 196 189 202 198 191 202 226 253 203 199 193 203 229 253 203 237 252 203 237 253 204 202 196 206 202 195 206 205 204 207 203 196 208 204 197 208 205 201 212 208 200 212 208 201 212 208 202 212 209 205 213 210 202 213 212 213 214 211 206 215 212 207 216 213 206 218 215 210 220 221 223 221 219 214 222 219 215 222 220 215 230 228 225 236 235 232 243 243 244 255 255 255]; mask:((Depth1Image new) width: 22; height: 22; photometric:(#blackIs0); bitsPerSample:(#[1]); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'@@@C@@@C@@@C@G C@_8C@?CC??CC??CG??#G??#G??#G??#C??CC??CA?>C@? fm@2327: fm@2327: ^Icon fm@2327: constantNamed:#'Psiware::SystemManagement class searchToolBarIcon' fm@2327: ifAbsentPut:[(Depth24Image new) width: 22; height: 22; photometric:(#rgb); bitsPerSample:(#[8 8 8]); samplesPerPixel:(3); bits:(ByteArray fromPackedString:' fm@2327: @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ fm@2327: @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ fm@2327: @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@4][>4][>@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ fm@2327: @@@@@@@@@@@@@@@@@@@@@@@@@@@@;>#8/L#+!!:KS!!:KS/,'',;>''9@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@2];>^)WH fm@2327: NE:+KU*:J5&9NE6*_I#K4^S>@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@4][>RV3DLER"SWR6$K#0#;[.SGJ4L5"''UG_N4][>@@@@ fm@2327: @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*K''\JT*,U6Z7:^S?>/C*;.3,6>C>RFF(KEZ"3-_-@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ fm@2327: @@@@@@@@@@@@&Z''HFTF &Z7">N#:7NK?7NK?6=W>!!Y''YH4N -+3T@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%I>;FDV)#ZWU??''57NK? fm@2327: 7NK?:>_?\8WKFCN".K#T@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@1L;.A#V[O5")3=W;=/[4@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@7NK?-;#%ND&KC">BYV.*4=;>7.+>-==O;8@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ fm@2327: @@@@@@@@@@@@7NK? (J9GB1SZV>W:M3?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@5MS&++3H6M/#@@@@ fm@2327: @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@7NK?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ fm@2327: @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ fm@2327: @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ fm@2327: @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ fm@2327: @@@@@@@@@@@@@@@@') ; mask:((Depth1Image new) width: 22; height: 22; photometric:(#blackIs0); bitsPerSample:(#[1]); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'@@@C@@@C@@@C@A C@G8C@OC@_>C@_>C@_>C@_>C@?>CA? fm@2327: fm@2327: ^Icon fm@2327: constantNamed:#'Psiware::SystemManagement class warningSearchBarIcon' fm@2327: ifAbsentPut:[(Depth24Image new) width: 22; height: 19; photometric:(#rgb); bitsPerSample:(#[8 8 8]); samplesPerPixel:(3); bits:(ByteArray fromPackedString:' fm@2327: @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@?:.+_;?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ fm@2327: @@@@?]SZ)5]X.6!! -HM2??''*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@?>39-7*B4H&G>[N+%%MJ>\#A@@@@@@@@ fm@2327: @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@<+R?*U1&?=CN?>W^4HJ@+FY$?>+"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ fm@2327: @@@@@@@@@@@@@@@@@@@@?>G_)U!!^>Z^->,B><+"4?*^-%C8?;;Z+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@??#1-(E;.65+?<#H fm@2327: ?=_T?=GP?::65W-=(EQF?>WQ@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@?\#D*VAY?;61<;"0;,C@6J^+;*"0>ZN$&CX)6(-:@@@@@@@@ fm@2327: @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@?>#+/7Q148E6?<"4K^>(M=1S8;)$ID8Y6^@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@;HNR4U%%<)&S?<^9??_(??;3REEN@P,J2<[C??K/?:R!!/C8?&R(0(T-N?>GZ@@@@ fm@2327: @@@@@@@@@@@@@@@@@@@@?<;H,31B3T9U2'')1?L3@?>3&=^7*XWE0@@=WL??_:<>33[G:@D2T%;^/,??#8??K19Y6^&R(0!!QPX#S8:;K22@@@@@@@@@@@@@@@@<*RZ+5I@*$D+*T48<[N&?>C_7,+U??3?7N''/(J.-?/+;??W5 fm@2327: ;.O!!?>G_3&]+ 0(O#B8.(U9X@@@@@@@@@@@@?W"?:*+*3@3$R\)^R ''2)^T@@@@ fm@2327: ?>K2;(ZO2DQ@-SP!!,5H/?7:)72EUBT+<,GD?>?,]GO?<#J8VM& P4P_A0^ C(:?>+''?:"+34%H13L/02("13T(13\,5$H>3S<= fm@2327: 1TMC0DQD/$IB/D@>.S4;-S,8,C(:,C 9-3X:(A4""@4R_1DT RH&/6%*?82D/S8503873C<85C<923H,23@+/RP\-"HX,"HW+"DX*"@V)10U)1(S)!!XU)AXU fm@2327: (Q0_$1XZ#1X["A(]^QPX&34>?;&).&-Z/6]Y06MU1&AR/5UG15-N0EYF1&EO0&EN/&EP.6AN.%5N.5-M.5%P/UYQ.$)I.4)L0UQW/U-\+5YX5XFA') ; mask:((Depth1Image new) width: 22; height: 19; photometric:(#blackIs0); bitsPerSample:(#[1]); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'@C G@G0C@O0C@O8C@_8C@?CC??CC??CC??#G??#O??3O??3_??;????????????????') ; yourself); yourself] fm@2327: ! ! fm@2327: cg@2015: !InternationalLanguageTranslationEditor class methodsFor:'interface specs'! cg@2015: cg@2015: windowSpec cg@2015: "This resource specification was automatically generated cg@2015: by the UIPainter of ST/X." cg@2015: cg@2015: "Do not manually edit this!! If it is corrupted, cg@2015: the UIPainter may not be able to read the specification." cg@2015: cg@2015: " cg@2048: UIPainter new openOnClass:Tools::InternationalLanguageTranslationEditor andSelector:#windowSpec cg@2048: Tools::InternationalLanguageTranslationEditor new openInterface:#windowSpec cg@2048: Tools::InternationalLanguageTranslationEditor open cg@2015: " cg@2015: cg@2015: cg@2015: cg@2015: ^ cg@2015: #(FullSpec cg@2015: name: windowSpec cg@2015: window: cg@2015: (WindowSpec cg@2015: label: 'InternationalLanguageTranslationEditor' cg@2015: name: 'InternationalLanguageTranslationEditor' cg@2015: min: (Point 10 10) fm@2327: bounds: (Rectangle 0 0 774 610) cg@2015: menu: mainMenu cg@2015: ) cg@2015: component: cg@2015: (SpecCollection cg@2015: collection: ( cg@2015: (MenuPanelSpec cg@2015: name: 'ToolBar' cg@2015: layout: (LayoutFrame 0 0 0 0 0 1 30 0) cg@2015: menu: menuToolBar cg@2015: textDefault: true cg@2015: ) cg@2015: (VariableVerticalPanelSpec fm@2327: name: 'TranslationsVariableVerticalPanel' fm@2327: layout: (LayoutFrame 0 0 30 0 0 1 -32 1) cg@2015: component: cg@2015: (SpecCollection cg@2015: collection: ( cg@2015: (DataSetSpec cg@2015: name: 'KeyStringAndLanguageSelectionTable' cg@2015: model: selectedKeyRow fm@2163: menu: keyStringAndLanguageSelectionTableMenu cg@2015: hasHorizontalScrollBar: true cg@2015: hasVerticalScrollBar: true cg@2015: dataList: keyStringAndLanguageSelectionTable cg@2015: columnHolder: keyStringAndLanguageSelectionTableColumnDescriptionHolder fm@2049: beDependentOfRows: true cg@2015: columnAdaptor: yourself cg@2015: postBuildCallback: postBuildDataSet: cg@2015: ) fm@2050: (VariableVerticalPanelSpec fm@2050: name: 'VariableVerticalPanel1' cg@2015: component: cg@2015: (SpecCollection cg@2015: collection: ( fm@2050: (ViewSpec fm@2050: name: 'Box1' fm@2050: component: fm@2050: (SpecCollection fm@2050: collection: ( fm@2050: (LabelSpec fm@2050: label: 'Original String (Key):' fm@2050: name: 'Label2' fm@2050: layout: (LayoutFrame 0 0 -2 0 0 1 28 0) fm@2050: translateLabel: true fm@2050: adjust: left fm@2050: ) fm@2050: (TextEditorSpec fm@2050: name: 'OriginalText' fm@2050: layout: (LayoutFrame 0 0 27 0 0 1 -2 1) fm@2050: model: originalTextHolder fm@2050: hasHorizontalScrollBar: true fm@2050: hasVerticalScrollBar: true fm@2050: modifiedChannel: originalTextModifiedHolder fm@2050: acceptCallBack: languageTextAccepted fm@2050: ) fm@2050: ) fm@2050: fm@2050: ) cg@2015: ) fm@2050: (ViewSpec fm@2050: name: 'Box3' fm@2050: component: fm@2050: (SpecCollection fm@2050: collection: ( fm@2050: (LabelSpec fm@2051: label: 'Select Another Language as example:' fm@2050: name: 'Label3' fm@2050: layout: (LayoutFrame 0 0 -6 0 0 1 24 0) fm@2050: translateLabel: true fm@2050: adjust: left fm@2050: ) fm@2050: (ComboBoxSpec fm@2050: name: 'ComboBox1' fm@2050: layout: (LayoutFrame 197 0 -2 0 322 0 18 0) fm@2050: model: exampleLanguageSelectionHolder fm@2050: immediateAccept: false fm@2050: acceptOnLeave: true fm@2050: acceptOnLostFocus: true fm@2050: acceptOnPointerLeave: false fm@2050: comboList: shownLanguages fm@2050: useIndex: false fm@2050: ) fm@2050: (TextEditorSpec fm@2050: name: 'ExampleLanguageText' fm@2051: layout: (LayoutFrame 0 0 30 0 0 1 0 1) fm@2050: model: exampleLanguageTextHolder fm@2050: hasHorizontalScrollBar: true fm@2050: hasVerticalScrollBar: true fm@2050: isReadOnly: true fm@2050: ) fm@2050: ) fm@2050: fm@2050: ) fm@2050: ) fm@2050: (ViewSpec fm@2050: name: 'Box2' fm@2050: component: fm@2050: (SpecCollection fm@2050: collection: ( fm@2050: (LabelSpec fm@2050: label: 'Translated String:' fm@2050: name: 'Label1' fm@2050: layout: (LayoutFrame 0 0 0 0 0 1 30 0) fm@2050: translateLabel: true fm@2050: adjust: left fm@2050: ) fm@2050: (TextEditorSpec fm@2050: name: 'LanguageText' fm@2050: layout: (LayoutFrame 0 0 30 0 0 1 0 1) fm@2050: model: languageTextHolder fm@2050: hasHorizontalScrollBar: true fm@2050: hasVerticalScrollBar: true fm@2050: acceptChannel: languageTextAcceptHolder fm@2050: modifiedChannel: languageTextModifiedHolder fm@2050: acceptCallBack: languageTextAccepted fm@2050: postBuildCallback: languageEditorBuilt: fm@2050: ) fm@2051: (ActionButtonSpec fm@2051: label: 'Paste Previous' fm@2051: name: 'pastePreviousTranslation' fm@2051: layout: (LayoutOrigin 0 0.83085250338295 0 0.03448275862069) fm@2051: translateLabel: true fm@2051: model: pastePreviousTranslationInLanguageText fm@2051: enableChannel: pastePreviousTranslationEnableHolder fm@2051: disabledLogo: 'Paste Previous' fm@2051: ) fm@2323: (ActionButtonSpec fm@2323: label: 'Paste Original' fm@2323: name: 'Button1' fm@2323: layout: (LayoutOrigin -95 0.83085250338295 0 0.03448275862069) fm@2323: translateLabel: true fm@2323: model: pasteOriginalInLanguageText fm@2323: enableChannel: pasteOriginalEnableHolder fm@2323: disabledLogo: 'Paste Original' fm@2323: ) fm@2050: ) fm@2050: fm@2050: ) cg@2015: ) cg@2015: ) cg@2015: cg@2015: ) fm@2050: handles: (Any 0.33333333333333 0.66666666666667 1.0) cg@2015: ) cg@2015: ) cg@2015: cg@2015: ) fm@2050: handles: (Any 0.5 1.0) fm@2327: postBuildCallback: postBuildTranslationsPanel: fm@2327: ) fm@2327: (ViewSpec fm@2327: name: 'SearchBox' fm@2327: layout: (LayoutFrame 0 0 -32 1 0 1 0 1) fm@2327: level: -1 fm@2327: visibilityChannel: searchBoxVisible fm@2327: component: fm@2327: (SpecCollection fm@2327: collection: ( fm@2327: (ActionButtonSpec fm@2327: label: 'closeSearchBarIcon' fm@2327: name: 'closeSearchBarButton' fm@2327: layout: (LayoutFrame 4 0 5 0 25 0 26 0) fm@2327: hasCharacterOrientedLabel: false fm@2327: translateLabel: true fm@2327: model: closeSearchBar fm@2327: ) fm@2327: (LabelSpec fm@2327: label: 'Search:' fm@2327: name: 'SearchLabel' fm@2327: layout: (LayoutFrame 30 0 5 0 81 0 27 0) fm@2327: translateLabel: true fm@2327: adjust: right fm@2327: ) fm@2327: (InputFieldSpec fm@2327: name: 'SearchEntryField' fm@2327: layout: (LayoutFrame 87 0 5 0 244 0 27 0) fm@2327: model: searchTextHolder fm@2327: immediateAccept: true fm@2327: acceptOnReturn: true fm@2327: acceptOnTab: true fm@2327: acceptOnLostFocus: true fm@2327: modifiedChannel: searchTextModifiedHolder fm@2327: acceptOnPointerLeave: false fm@2327: postBuildCallback: postBuildSearchTextView: fm@2327: ) fm@2327: (ActionButtonSpec fm@2327: label: 'searchNextIcon' fm@2327: name: 'SearchNextButton' fm@2327: layout: (LayoutFrame 251 0 5 0 272 0 26 0) fm@2327: hasCharacterOrientedLabel: false fm@2327: translateLabel: true fm@2327: model: searchNextText fm@2327: ) fm@2327: (ActionButtonSpec fm@2327: label: 'searchPreviousIcon' fm@2327: name: 'searchPreviousButton' fm@2327: layout: (LayoutFrame 279 0 5 0 300 0 26 0) fm@2327: hasCharacterOrientedLabel: false fm@2327: translateLabel: true fm@2327: model: searchPreviousText fm@2327: ) fm@2327: (CheckBoxSpec fm@2327: label: 'Ignore case' fm@2327: name: 'IgnoreCaseCheckBox' fm@2329: layout: (LayoutFrame 309 0 5 0 505 0 27 0) fm@2327: model: ignoreCaseHolder fm@2327: translateLabel: true fm@2327: ) fm@2327: (LabelSpec fm@2327: label: 'SearchBarImageInfoLabel' fm@2327: name: 'SearchBarImageInfoLabel' fm@2329: layout: (LayoutFrame 511 0 5 0 535 0 27 0) fm@2327: hasCharacterOrientedLabel: false fm@2327: translateLabel: true fm@2327: labelChannel: searchBarImageInfoLabelHolder fm@2327: ) fm@2327: (LabelSpec fm@2327: label: 'SearchBarInfoLabel' fm@2327: name: 'SearchBarInfoLabel' fm@2329: layout: (LayoutFrame 538 0 5 0 816 0 27 0) fm@2327: translateLabel: true fm@2327: labelChannel: searchBarInfoLabelHolder fm@2327: adjust: left fm@2327: ) fm@2327: ) fm@2327: fm@2327: ) fm@2327: postBuildCallback: postBuildSearchBoxView: cg@2015: ) cg@2015: ) cg@2015: cg@2015: ) cg@2015: ) cg@2015: ! ! cg@2015: cg@2015: !InternationalLanguageTranslationEditor class methodsFor:'menu specs'! cg@2015: fm@2163: keyStringAndLanguageSelectionTableMenu fm@2163: "This resource specification was automatically generated fm@2163: by the MenuEditor of ST/X." fm@2163: fm@2163: "Do not manually edit this!! If it is corrupted, fm@2163: the MenuEditor may not be able to read the specification." fm@2163: fm@2163: " fm@2163: MenuEditor new openOnClass:Tools::InternationalLanguageTranslationEditor andSelector:#keyStringAndLanguageSelectionTableMenu fm@2163: (Menu new fromLiteralArrayEncoding:(Tools::InternationalLanguageTranslationEditor keyStringAndLanguageSelectionTableMenu)) startUp fm@2163: " fm@2163: fm@2163: fm@2163: fm@2163: ^ fm@2163: #(Menu fm@2163: ( fm@2163: (MenuItem fm@2327: label: 'Set Current NameSpace' fm@2163: itemValue: changeLastNameSpace fm@2163: translateLabel: true fm@2163: ) fm@2163: (MenuItem fm@2327: label: 'Search String in Current NameSpace' fm@2163: itemValue: searchStringInLastNameSpace fm@2163: translateLabel: true fm@2163: ) fm@2327: (MenuItem fm@2327: label: '-' fm@2327: isVisible: #false fm@2327: ) fm@2327: (MenuItem fm@2327: label: 'Set Current Package' fm@2327: itemValue: changeLastPackage fm@2327: translateLabel: true fm@2327: isVisible: #false fm@2327: ) fm@2327: (MenuItem fm@2327: label: 'Search String in Current Package' fm@2327: itemValue: searchStringInLastPackage fm@2327: translateLabel: true fm@2327: isVisible: #false fm@2327: ) fm@2163: ) fm@2163: nil fm@2163: nil fm@2163: ) fm@2163: ! fm@2163: cg@2015: mainMenu cg@2015: "This resource specification was automatically generated cg@2015: by the MenuEditor of ST/X." cg@2015: cg@2015: "Do not manually edit this!! If it is corrupted, cg@2015: the MenuEditor may not be able to read the specification." cg@2015: cg@2015: " fm@2050: MenuEditor new openOnClass:Tools::InternationalLanguageTranslationEditor andSelector:#mainMenu fm@2050: (Menu new fromLiteralArrayEncoding:(Tools::InternationalLanguageTranslationEditor mainMenu)) startUp cg@2015: " cg@2015: cg@2015: cg@2015: cg@2015: ^ cg@2015: #(Menu cg@2015: ( cg@2015: (MenuItem cg@2015: label: 'File' cg@2015: translateLabel: true cg@2015: submenu: cg@2015: (Menu cg@2015: ( cg@2015: (MenuItem cg@2015: label: 'New' cg@2015: itemValue: menuNew cg@2015: translateLabel: true cg@2015: ) cg@2015: (MenuItem cg@2015: label: '-' cg@2015: ) cg@2015: (MenuItem cg@2410: label: 'Open Resources for Package or Project...' cg@2410: itemValue: menuOpenByPackage cg@2410: translateLabel: true cg@2410: ) cg@2410: (MenuItem cg@2015: label: 'Open Resource File...' cg@2015: itemValue: menuOpen cg@2015: translateLabel: true cg@2015: ) cg@2015: (MenuItem cg@2015: label: '-' cg@2015: ) cg@2015: (MenuItem fm@2053: label: 'Save All Resource Files' fm@2053: itemValue: menuSaveAll fm@2053: translateLabel: true fm@2053: ) fm@2053: (MenuItem cg@2015: label: 'Save Resource File' cg@2015: itemValue: menuSave cg@2015: translateLabel: true cg@2015: ) cg@2015: (MenuItem cg@2015: label: 'Save Resource File As...' cg@2015: itemValue: menuSaveAs cg@2015: translateLabel: true cg@2015: ) cg@2015: (MenuItem cg@2015: label: '-' cg@2015: ) cg@2015: (MenuItem cg@2410: label: 'Import existing translations from file...' fm@2327: itemValue: importExistingTranslationsFromFile fm@2327: translateLabel: true fm@2327: ) fm@2327: (MenuItem fm@2327: label: '-' fm@2327: ) fm@2327: (MenuItem fm@2327: label: 'Set Current NameSpace' fm@2163: itemValue: changeLastNameSpace fm@2163: translateLabel: true fm@2163: ) fm@2163: (MenuItem fm@2327: label: 'Set Current Package' fm@2327: itemValue: changeLastPackage fm@2327: translateLabel: true fm@2327: isVisible: #false fm@2327: ) fm@2327: (MenuItem fm@2163: label: '-' fm@2163: ) fm@2163: (MenuItem cg@2015: label: 'Exit' cg@2015: itemValue: closeRequest cg@2015: translateLabel: true cg@2015: ) cg@2015: ) cg@2015: nil cg@2015: nil cg@2015: ) cg@2015: ) cg@2015: (MenuItem cg@2015: label: 'View' cg@2015: translateLabel: true cg@2015: submenu: cg@2015: (Menu cg@2015: ( cg@2015: (MenuItem cg@2015: label: 'Show Missing Translations Only' cg@2015: translateLabel: true cg@2015: indication: showMissingTranslationsOnly cg@2015: ) cg@2015: (MenuItem cg@2015: label: '-' cg@2015: ) cg@2015: (MenuItem cg@2015: label: 'Shown Languages' cg@2015: translateLabel: true cg@2015: submenuChannel: shownLanguagesMenu cg@2015: ) cg@2015: ) cg@2015: nil cg@2015: nil cg@2015: ) cg@2015: ) cg@2015: (MenuItem cg@2015: label: 'Languages' cg@2015: translateLabel: true cg@2015: submenu: cg@2015: (Menu cg@2015: ( cg@2015: (MenuItem cg@2015: label: 'Add Language...' cg@2015: itemValue: addLanguage cg@2015: translateLabel: true cg@2015: ) cg@2015: (MenuItem cg@2015: label: 'Remove Language...' cg@2015: itemValue: removeLanguage cg@2015: translateLabel: true cg@2015: ) cg@2015: ) cg@2015: nil cg@2015: nil cg@2015: ) cg@2015: ) cg@2015: (MenuItem cg@2015: label: 'Translations' cg@2015: translateLabel: true cg@2015: submenu: cg@2015: (Menu cg@2015: ( cg@2015: (MenuItem cg@2015: label: 'Add Translation...' cg@2015: itemValue: addTranslation cg@2015: translateLabel: true cg@2015: ) cg@2015: (MenuItem cg@2015: label: 'Remove Translation...' cg@2015: itemValue: removeTranslation cg@2015: translateLabel: true cg@2015: ) cg@2015: (MenuItem cg@2015: label: '-' cg@2015: ) cg@2015: (MenuItem cg@2015: label: 'Extract from Class...' cg@2015: itemValue: extractTranslationsFromClass cg@2015: translateLabel: true cg@2015: ) cg@2015: (MenuItem cg@2032: label: 'Extract from Project...' cg@2032: itemValue: extractTranslationsFromProject cg@2032: translateLabel: true cg@2032: ) cg@2032: (MenuItem fm@2163: label: 'Extract from NameSpace...' fm@2163: itemValue: extractTranslationsFromNameSpace fm@2163: translateLabel: true fm@2163: ) fm@2163: (MenuItem cg@2032: label: '-' cg@2032: ) cg@2032: (MenuItem cg@2015: label: 'Run Application and Collect Translations...' cg@2015: itemValue: runApplicationAndCollectTranslations cg@2015: translateLabel: true cg@2015: ) cg@2015: ) cg@2015: nil cg@2015: nil cg@2015: ) cg@2015: ) cg@2015: (MenuItem fm@2050: label: 'Preferences' fm@2050: translateLabel: true fm@2050: submenu: fm@2050: (Menu fm@2050: ( fm@2050: (MenuItem fm@2050: label: 'Auto Accept Changes' fm@2050: translateLabel: true fm@2050: indication: autoAcceptHolder fm@2050: ) fm@2051: (MenuItem fm@2051: label: 'Search For Similar Translations' fm@2051: translateLabel: true fm@2051: indication: searchForSimilarTranslationEnableHolder fm@2051: ) fm@2053: (MenuItem fm@2053: label: 'Always Write UTF8' fm@2053: translateLabel: true fm@2053: indication: alwaysWriteUTF8Holder fm@2053: ) fm@2050: ) fm@2050: nil fm@2050: nil fm@2050: ) fm@2050: ) fm@2050: (MenuItem cg@2015: label: 'Help' cg@2015: translateLabel: true cg@2015: startGroup: right cg@2015: submenu: cg@2015: (Menu cg@2015: ( cg@2015: (MenuItem cg@2015: label: 'Documentation' cg@2015: itemValue: openDocumentation cg@2015: translateLabel: true cg@2015: ) cg@2015: (MenuItem cg@2015: label: '-' cg@2015: ) cg@2015: (MenuItem cg@2015: label: 'About this Application...' cg@2015: itemValue: openAboutThisApplication cg@2015: translateLabel: true cg@2015: ) cg@2015: ) cg@2015: nil cg@2015: nil cg@2015: ) cg@2015: ) cg@2015: ) cg@2015: nil cg@2015: nil cg@2015: ) cg@2015: ! cg@2015: fm@2051: menuItemsEditLanguage fm@2051: "This resource specification was automatically generated fm@2051: by the MenuEditor of ST/X." fm@2051: fm@2051: "Do not manually edit this!! If it is corrupted, fm@2051: the MenuEditor may not be able to read the specification." fm@2051: fm@2051: " fm@2051: MenuEditor new openOnClass:Tools::InternationalLanguageTranslationEditor andSelector:#menu fm@2051: (Menu new fromLiteralArrayEncoding:(Tools::InternationalLanguageTranslationEditor menu)) startUp fm@2051: " fm@2051: fm@2051: fm@2051: fm@2051: ^ fm@2051: #(Menu fm@2051: ( fm@2051: (MenuItem fm@2051: enabled: pastePreviousTranslationEnableHolder fm@2051: label: 'Paste Previous Translation' fm@2051: itemValue: pastePreviousTranslationInLanguageText fm@2051: nameKey: pastePreviousTranslationInLanguageText fm@2051: translateLabel: true fm@2051: ) fm@2051: ) fm@2051: nil fm@2051: nil fm@2051: ) fm@2051: ! fm@2051: cg@2015: menuToolBar cg@2015: "This resource specification was automatically generated cg@2015: by the MenuEditor of ST/X." cg@2015: cg@2015: "Do not manually edit this!! If it is corrupted, cg@2015: the MenuEditor may not be able to read the specification." cg@2015: cg@2015: " fm@2051: MenuEditor new openOnClass:Tools::InternationalLanguageTranslationEditor andSelector:#menuToolBar fm@2051: (Menu new fromLiteralArrayEncoding:(Tools::InternationalLanguageTranslationEditor menuToolBar)) startUp cg@2015: " cg@2015: cg@2015: cg@2015: cg@2015: ^ cg@2015: #(Menu cg@2015: ( cg@2015: (MenuItem cg@2015: label: 'Save' fm@2051: itemValue: menuSave cg@2015: translateLabel: true cg@2015: labelImage: (ResourceRetriever XPToolbarIconLibrary saveImageIcon) cg@2015: ) cg@2015: (MenuItem cg@2015: label: '-' cg@2015: ) cg@2015: (MenuItem cg@2015: label: 'Add Translation' cg@2015: itemValue: addTranslation cg@2015: translateLabel: true cg@2015: labelImage: (ResourceRetriever XPToolbarIconLibrary newRowIcon) cg@2015: ) cg@2015: (MenuItem cg@2015: label: 'Remove Translation' cg@2015: itemValue: removeTranslation cg@2015: translateLabel: true cg@2015: labelImage: (ResourceRetriever XPToolbarIconLibrary removeRowIcon) cg@2015: ) cg@2015: (MenuItem fm@2327: label: '-' fm@2327: ) fm@2327: (MenuItem fm@2327: label: 'Search' fm@2327: itemValue: search fm@2327: translateLabel: true fm@2327: shortcutKey: Ctrlf fm@2327: labelImage: (ResourceRetriever #'Tools::InternationalLanguageTranslationEditor' searchToolBarIcon) fm@2327: ) fm@2327: (MenuItem cg@2015: label: '' cg@2015: ) cg@2015: (MenuItem cg@2015: label: 'Stop Application' cg@2015: itemValue: stopApplication cg@2015: translateLabel: true cg@2015: isVisible: stopApplicationIconVisibleHolder cg@2015: labelImage: (ResourceRetriever XPToolbarIconLibrary stop16x16Icon) cg@2015: ) cg@2015: ) cg@2015: nil cg@2015: nil cg@2015: ) cg@2015: ! ! cg@2015: cg@2433: !InternationalLanguageTranslationEditor class methodsFor:'startup'! cg@2433: cg@2433: openOnFile:aFilename cg@2433: |fn| cg@2433: cg@2433: fn := aFilename asFilename. cg@2433: cg@2433: self new cg@2433: allButOpen; cg@2433: readResourceFile:fn asLanguage:fn withoutSuffix baseName; cg@2433: openWindow. cg@2433: ! ! cg@2433: cg@2047: !InternationalLanguageTranslationEditor class methodsFor:'tableColumns specs'! cg@2047: cg@2047: keyTableColumn cg@2047: "This resource specification was automatically generated cg@2047: by the DataSetBuilder of ST/X." cg@2047: cg@2047: "Do not manually edit this!! If it is corrupted, cg@2047: the DataSetBuilder may not be able to read the specification." cg@2047: cg@2047: " cg@2047: DataSetBuilder new openOnClass:Tools::InternationalLanguageTranslationEditor andSelector:#keyTableColumn cg@2047: " cg@2047: cg@2047: cg@2047: cg@2047: ^#( cg@2047: (DataSetColumnSpec cg@2047: label: 'Key' cg@2047: labelButtonType: Button cg@2047: minWidth: 50 cg@2047: model: keyStringInRow: cg@2047: ) cg@2047: ) cg@2047: ! cg@2047: cg@2047: languageTableColumn cg@2047: "This resource specification was automatically generated cg@2047: by the DataSetBuilder of ST/X." cg@2047: cg@2047: "Do not manually edit this!! If it is corrupted, cg@2047: the DataSetBuilder may not be able to read the specification." cg@2047: cg@2047: " fm@2049: DataSetBuilder new openOnClass:Tools::InternationalLanguageTranslationEditor andSelector:#languageTableColumn cg@2047: " cg@2047: cg@2047: cg@2047: cg@2047: ^#( fm@2049: (DataSetColumnSpec fm@2049: label: lang fm@2049: labelButtonType: Button fm@2049: minWidth: 50 fm@2049: editorType: None fm@2049: model: columnInRow:at: fm@2049: backgroundSelector: getBackgroundForRow:rowNr:col: fm@2049: ) fm@2049: ) fm@2049: ! ! fm@2049: fm@2049: !InternationalLanguageTranslationEditor methodsFor:'accessing'! cg@2047: fm@2327: currentSelectionIndex fm@2327: fm@2327: ^ self selectedKeyRow value fm@2327: fm@2327: "Created: / 16-06-2007 / 09:04:11 / Administrador" fm@2327: "Modified: / 19-06-2007 / 17:28:38 / Administrador" fm@2327: ! fm@2327: fm@2327: exists: anObject fm@2327: fm@2327: ^self objectsList includes: anObject fm@2327: fm@2327: "Created: / 19-06-2007 / 16:42:22 / Administrador" fm@2327: ! fm@2327: fm@2327: indexOf: anObject fm@2327: fm@2327: ^self objectsList indexOf: anObject fm@2327: fm@2327: "Created: / 19-06-2007 / 16:39:44 / Administrador" fm@2327: ! fm@2327: fm@2049: newLanguageText fm@2049: "/ languageEditor accept fm@2163: ^self languageTextHolder value isNil fm@2163: ifTrue:[''] fm@2163: ifFalse:[self languageTextHolder value asCollectionOfLines first.] fm@2050: ! fm@2050: fm@2327: objectsList fm@2327: fm@2327: ^ keyStringsToLanguageMappings fm@2327: ! fm@2327: fm@2327: selectListIndex: rowIndex fm@2327: "/ |selection list| fm@2327: "/ list := self objectsList. fm@2327: "/ list isEmpty ifTrue:[^self]. fm@2327: "/ selection := list at:rowIndex ifAbsent:nil. fm@2327: self selectedKeyRow value: rowIndex. fm@2327: fm@2327: "Created: / 16-06-2007 / 09:06:46 / Administrador" fm@2327: "Modified: / 22-06-2007 / 13:45:54 / Administrador" fm@2327: ! fm@2327: fm@2050: selectedKey fm@2050: "Returns the current selected key if there is one row seleted. Otherwise, returns nil" fm@2050: |rowSelectionIndex | fm@2050: fm@2163: keyStringsToLanguageMappings isNil ifTrue:[^nil]. fm@2163: self selectedKeyRow value isNil ifTrue:[^nil]. fm@2050: rowSelectionIndex := self selectedKeyRow value. fm@2050: rowSelectionIndex == 0 ifTrue:[^nil]. fm@2050: ^ keyStringsToLanguageMappings keyAt:rowSelectionIndex. fm@2327: ! fm@2327: fm@2327: tableView fm@2327: fm@2327: ^dataSetView scrolledView fm@2327: fm@2327: "Created: / 15-06-2007 / 18:59:51 / Administrador" cg@2047: ! ! cg@2047: fm@2051: !InternationalLanguageTranslationEditor methodsFor:'additionalFuncionalities'! fm@2051: fm@2051: searchForSimilarTranslation fm@2163: "Looks for a quite similar translation for the key and display a dialog with available options" fm@2327: |similarTranslationsAssociations selectedTranslation key| fm@2051: fm@2163: self shouldSearchForSimilarTranslation ifFalse:[^self]. fm@2051: fm@2327: key := self selectedKey. fm@2327: key isNil ifTrue:[^ self.]. fm@2327: similarTranslationsAssociations := keyStringsToLanguageMappings searchForSimilarTranslation: key in: self currentLanguage. fm@2163: similarTranslationsAssociations isEmpty ifTrue:[^self]. fm@2051: fm@2163: similarTranslationsAssociations := similarTranslationsAssociations associations inject: OrderedCollection new into:[:collection :association | fm@2163: collection detect:[:selectedAssociation | fm@2163: selectedAssociation value sameAs: association value] ifNone:[collection add: association]. fm@2163: collection]. fm@2163: selectedTranslation := Dialog fm@2163: choose:'Choose one if you consider it´s usefull to translate: fm@2163: ', fm@2327: '<', key, '> ', (self currentExampleLanguageText ifNil:['']) fm@2163: fromList: (similarTranslationsAssociations collect:[:each | '<', each key, '> ', each value]) fm@2163: values: (similarTranslationsAssociations collect:[:each | each value]) fm@2163: lines:10 fm@2163: cancel: nil. fm@2051: fm@2163: selectedTranslation notNil ifTrue:[self languageTextHolderValue: selectedTranslation]. fm@2051: ! ! fm@2051: cg@2015: !InternationalLanguageTranslationEditor methodsFor:'aspects'! cg@2015: fm@2053: alwaysWriteUTF8Holder fm@2053: alwaysWriteUTF8Holder isNil ifTrue:[alwaysWriteUTF8Holder := true asValue]. fm@2053: ^ alwaysWriteUTF8Holder fm@2053: ! fm@2053: fm@2050: autoAcceptHolder fm@2050: autoAcceptHolder isNil ifTrue:[autoAcceptHolder := true asValue]. fm@2050: ^ autoAcceptHolder fm@2050: ! fm@2050: fm@2050: exampleLanguageSelectionHolder fm@2050: exampleLanguageSelectionHolder isNil ifTrue:[ fm@2050: exampleLanguageSelectionHolder := self exampleLanguageByDefault asValue. fm@2050: exampleLanguageSelectionHolder addDependent:self. fm@2050: ]. fm@2050: ^ exampleLanguageSelectionHolder fm@2050: ! fm@2050: fm@2050: exampleLanguageTextHolder fm@2050: exampleLanguageTextHolder isNil ifTrue:[ fm@2050: exampleLanguageTextHolder := '' asValue. fm@2050: ]. fm@2050: ^ exampleLanguageTextHolder. fm@2050: ! fm@2050: fm@2327: ignoreCaseHolder fm@2327: fm@2327: ignoreCaseHolder isNil ifTrue:[ fm@2327: ignoreCaseHolder := false asValue. fm@2327: "/ if your app needs to be notified of changes, uncomment one of the lines below: fm@2327: "/ ignoreCaseHolder addDependent:self. fm@2327: ignoreCaseHolder onChangeSend:#ignoreCaseHolderChanged to:self. fm@2327: fm@2327: ]. fm@2327: ^ ignoreCaseHolder. fm@2327: fm@2327: "Created: / 16-06-2007 / 06:45:04 / Administrador" fm@2327: "Modified: / 16-06-2007 / 19:32:15 / Administrador" fm@2327: ! fm@2327: cg@2015: keyStringAndLanguageSelectionTable cg@2015: keyStringsToLanguageMappings isNil ifTrue:[ cg@2015: keyStringsToLanguageMappings := KeyStringsToLanguageMappings new. cg@2015: ]. cg@2015: ^ keyStringsToLanguageMappings. cg@2015: ! cg@2015: cg@2015: keyStringAndLanguageSelectionTableColumnDescriptionHolder cg@2015: keyStringAndLanguageSelectionTableColumnDescriptionHolder isNil ifTrue:[ cg@2015: keyStringAndLanguageSelectionTableColumnDescriptionHolder := ValueHolder new. cg@2015: keyStringAndLanguageSelectionTableColumnDescriptionHolder value:(self keyStringAndLanguageSelectionTableColumnDescription). cg@2015: ]. cg@2015: ^ keyStringAndLanguageSelectionTableColumnDescriptionHolder. cg@2015: ! cg@2015: cg@2015: languageAtCol:colNr cg@2015: ^ shownLanguages at:colNr-1. cg@2015: ! cg@2015: cg@2015: languageShownHolderFor:lang cg@2015: |holder| cg@2015: cg@2015: languageShownHolders isNil ifTrue:[ cg@2015: languageShownHolders := Dictionary new cg@2015: ]. cg@2015: holder := languageShownHolders cg@2015: at:lang cg@2015: ifAbsentPut:[ cg@2015: |h| cg@2015: cg@2015: h := true asValue. cg@2015: h onChangeEvaluate:[ cg@2015: h value ifTrue:[ cg@2015: self enableLanguageDisplayFor:lang cg@2015: ] ifFalse:[ cg@2015: self disableLanguageDisplayFor:lang cg@2015: ]. cg@2015: ]. cg@2015: h cg@2015: ]. cg@2015: ^ holder. cg@2015: ! cg@2015: cg@2048: languageTextAcceptHolder cg@2048: languageTextAcceptHolder isNil ifTrue:[ fm@2050: languageTextAcceptHolder := false asValue. cg@2048: ]. cg@2048: ^ languageTextAcceptHolder. cg@2048: ! cg@2048: cg@2015: languageTextHolder cg@2015: languageTextHolder isNil ifTrue:[ cg@2015: languageTextHolder := '' asValue. cg@2015: ]. cg@2015: ^ languageTextHolder. cg@2015: ! cg@2015: cg@2015: languageTextModifiedHolder cg@2015: languageTextModifiedHolder isNil ifTrue:[ cg@2015: languageTextModifiedHolder := false asValue. cg@2015: ]. cg@2015: ^ languageTextModifiedHolder. cg@2015: ! cg@2015: cg@2015: languagesList cg@2015: languagesList isNil ifTrue:[ cg@2015: languagesList := List withAll:(self keyStringAndLanguageSelectionTable languages). cg@2015: ]. cg@2015: ^ languagesList. cg@2015: ! cg@2015: cg@2015: originalTextHolder cg@2015: originalTextHolder isNil ifTrue:[ cg@2015: originalTextHolder := '' asValue. cg@2015: ]. cg@2015: ^ originalTextHolder. cg@2015: ! cg@2015: cg@2015: originalTextModifiedHolder cg@2015: originalTextModifiedHolder isNil ifTrue:[ cg@2015: originalTextModifiedHolder := false asValue. cg@2015: ]. cg@2015: ^ originalTextModifiedHolder. cg@2015: ! cg@2015: fm@2323: pasteOriginalEnableHolder fm@2323: pasteOriginalEnableHolder isNil ifTrue:[pasteOriginalEnableHolder := false asValue]. fm@2323: ^ pasteOriginalEnableHolder fm@2323: ! fm@2323: fm@2051: pastePreviousTranslationEnableHolder fm@2051: pastePreviousTranslationEnableHolder isNil ifTrue:[pastePreviousTranslationEnableHolder := false asValue]. fm@2051: ^ pastePreviousTranslationEnableHolder fm@2051: ! fm@2051: fm@2327: searchBarImageInfoLabelHolder fm@2327: fm@2327: searchBarImageInfoLabelHolder isNil ifTrue:[ fm@2327: searchBarImageInfoLabelHolder := nil asValue . fm@2327: ]. fm@2327: ^ searchBarImageInfoLabelHolder. fm@2327: fm@2327: "Created: / 16-06-2007 / 10:06:28 / Administrador" fm@2327: ! fm@2327: fm@2327: searchBarInfoLabelHolder fm@2327: fm@2327: searchBarInfoLabelHolder isNil ifTrue:[ fm@2327: searchBarInfoLabelHolder := '' asValue . fm@2327: ]. fm@2327: ^ searchBarInfoLabelHolder. fm@2327: fm@2327: "Created: / 16-06-2007 / 06:20:49 / Administrador" fm@2327: ! fm@2327: fm@2327: searchBoxVisible fm@2327: fm@2327: searchBoxVisible isNil ifTrue:[ fm@2327: searchBoxVisible := false asValue. fm@2327: ]. fm@2327: ^ searchBoxVisible. fm@2327: fm@2327: "Created: / 15-06-2007 / 18:15:52 / Administrador" fm@2327: ! fm@2327: fm@2051: searchForSimilarTranslationEnableHolder fm@2051: searchForSimilarTranslationEnableHolder isNil fm@2051: ifTrue:[searchForSimilarTranslationEnableHolder := true asValue]. fm@2051: ^ searchForSimilarTranslationEnableHolder fm@2051: ! fm@2051: fm@2327: searchTextHolder fm@2327: fm@2327: searchTextHolder isNil ifTrue:[ fm@2327: searchTextHolder := ValueHolder new. fm@2327: "/ if your app needs to be notified of changes, uncomment one of the lines below: fm@2327: "/ userSelectedHolder addDependent:self. fm@2327: "/ userSelectedHolder onChangeSend:#searchTextHolderChanged to:self. fm@2327: ]. fm@2327: ^ searchTextHolder. fm@2327: fm@2327: "Created: / 15-06-2007 / 18:06:08 / Administrador" fm@2327: ! fm@2327: fm@2327: searchTextModifiedHolder fm@2327: fm@2327: searchTextModifiedHolder isNil ifTrue:[ fm@2327: searchTextModifiedHolder := false asValue . fm@2327: "/ if your app needs to be notified of changes, uncomment one of the lines below: fm@2327: "/ searchTextModifiedHolder addDependent:self. fm@2327: searchTextModifiedHolder onChangeSend:#searchTextModifiedHolderChanged to:self. fm@2327: ]. fm@2327: ^ searchTextModifiedHolder. fm@2327: fm@2327: "Created: / 15-06-2007 / 18:07:19 / Administrador" fm@2327: ! fm@2327: cg@2015: selectedKeyRow cg@2015: selectedKeyRow isNil ifTrue:[ cg@2015: selectedKeyRow := ValueHolder new. cg@2015: selectedKeyRow onChangeSend:#selectionChanged to:self. cg@2015: ]. cg@2015: ^ selectedKeyRow. cg@2015: ! cg@2015: cg@2015: showMissingTranslationsOnly cg@2015: showMissingTranslationsOnly isNil ifTrue:[ cg@2015: showMissingTranslationsOnly := false asValue. fm@2051: showMissingTranslationsOnly onChangeSend:#showMissingTranslationsOnlyChanged to:self. cg@2015: ]. cg@2015: ^ showMissingTranslationsOnly. cg@2015: ! cg@2015: cg@2015: shownLanguages cg@2015: shownLanguages isNil ifTrue:[ cg@2015: shownLanguages := List new. cg@2015: shownLanguages addAll:(self languagesList). cg@2015: shownLanguages onChangeSend:#shownLanguagesChanged to:self. cg@2015: ]. cg@2015: ^ shownLanguages. cg@2015: ! cg@2015: cg@2015: stopApplicationIconVisibleHolder cg@2015: stopApplicationIconVisibleHolder isNil ifTrue:[ cg@2015: stopApplicationIconVisibleHolder := false asValue. cg@2015: ]. cg@2015: ^ stopApplicationIconVisibleHolder. cg@2015: ! ! cg@2015: cg@2048: !InternationalLanguageTranslationEditor methodsFor:'change & update'! cg@2048: fm@2051: languageTextHolderValue: aString fm@2051: fm@2163: self languageTextHolder value: aString. fm@2163: self languageTextModifiedHolder value:true. fm@2051: ! fm@2051: cg@2048: update:something with:aParameter from:changedObject cg@2048: changedObject == shownLanguages ifTrue:[ cg@2048: self shownLanguagesChanged. cg@2048: ^ self. cg@2048: ]. fm@2049: changedObject == languageTextAcceptHolder ifTrue:[ fm@2049: self updateLanguageTextModification. fm@2049: ^ self. fm@2049: ]. fm@2050: changedObject == exampleLanguageSelectionHolder ifTrue:[ fm@2050: self updateExampleLanguageText. fm@2050: ^ self. fm@2051: ]. fm@2051: changedObject == showMissingTranslationsOnly ifTrue:[ fm@2051: self showMissingTranslationsOnlyChanged. fm@2051: ^ self. fm@2051: ]. fm@2051: ! fm@2051: fm@2051: updateCopyPreviousTranslationButtonEnabled fm@2051: fm@2163: self pastePreviousTranslationEnableHolder value: self shouldCopyPreviousTranslationButtonBeEnabled fm@2050: ! fm@2050: fm@2050: updateExampleLanguageText fm@2050: fm@2050: self selectedKeyRow value isNil ifTrue:[^ self]. fm@2050: self exampleLanguageTextHolder value:self currentExampleLanguageText fm@2049: ! fm@2049: fm@2049: updateKeyStringsToLanguageMappings fm@2049: fm@2049: keyStringsToLanguageMappings fm@2049: at:lastSelectedKey fm@2049: language:lastLanguage fm@2049: put: self newLanguageText. fm@2049: ! fm@2049: fm@2050: updateLanguageAndKeySelection fm@2050: fm@2050: self originalTextHolder value: self selectedKey. fm@2051: self languageTextHolder value: (self languageTextFromSelectedKeyFor: self currentLanguage). fm@2051: lastLanguage := self currentLanguage. fm@2050: lastSelectedKey := self selectedKey. fm@2050: ! fm@2050: fm@2049: updateLanguageTextModification fm@2049: self languageTextModifiedHolder value ifTrue:[ fm@2049: (self autoAccept or:[Dialog confirm:'Accept changed translation ?']) ifTrue:[ fm@2049: self languageTextModifiedHolder value:false. fm@2049: self languageTextHolder value:languageEditor contents. fm@2049: lastLanguage notNil ifTrue:[self updateKeyStringsToLanguageMappings.] fm@2049: ] fm@2049: ]. fm@2049: ! fm@2049: fm@2049: updateOriginalTextModification fm@2049: fm@2163: |answer| fm@2049: fm@2163: self originalTextModifiedHolder value ifTrue:[ fm@2163: answer := OptionBox fm@2163: request:'Accept changed original text (key) ?' fm@2163: label:'Original text (key) changed' fm@2163: image:(WarningBox iconBitmap) fm@2163: buttonLabels:#('Cancel' 'Accept' 'Accept As New') fm@2163: values:#(nil #accept #acceptAsNew) fm@2163: default:#acceptAsNew. fm@2049: fm@2163: answer isNil ifTrue:[^ self originalTextModifiedHolder value:false. ]. fm@2163: answer == #accept ifTrue:[ fm@2163: self halt. ]. fm@2163: answer == #acceptAsNew ifTrue:[ fm@2163: self halt. ]. fm@2163: ]. fm@2323: ! fm@2323: fm@2323: updatePasteOriginalButtonEnabled fm@2323: fm@2323: self pasteOriginalEnableHolder value: self shouldPasteOriginalButtonBeEnabled cg@2048: ! ! cg@2048: fm@2050: !InternationalLanguageTranslationEditor methodsFor:'dialogs'! fm@2050: fm@2051: requestEncoderDialog fm@2051: fm@2051: |box val characterCollection| fm@2050: fm@2051: val := '' asValue. fm@2051: box := Dialog new. fm@2051: (box addTextLabel:'Select or write the encoder') adjust:#left. fm@2051: box addVerticalSpace. fm@2051: characterCollection := CharacterEncoder supportedExternalEncodings fm@2051: inject: OrderedCollection new fm@2051: into:[:collection :each | fm@2051: collection add: each first; fm@2051: yourself]. fm@2051: (box addComboBoxOn:val) list: characterCollection. fm@2051: box addOkButton. fm@2051: box open. fm@2051: ^val value fm@2051: ! fm@2051: fm@2051: requestEncoderStringFor: lang fm@2051: "Returns an encoder string and updates the language's info" fm@2051: |encoderString encoder| fm@2051: encoderString := self requestEncoderDialog. fm@2051: encoderString notEmpty ifTrue:[ fm@2051: encoder := CharacterEncoder encoderFor: encoderString ifAbsent:nil. fm@2051: encoder notNil ifTrue:[keyStringsToLanguageMappings atLanguage: lang putEncoder: encoder.]. fm@2051: ]. fm@2051: ^encoderString fm@2050: ! fm@2050: fm@2050: requestFilename fm@2050: fm@2050: |aFilename| fm@2050: fm@2050: aFilename := Dialog cg@2410: requestFileName:(resources string:'Name of resource file:') fm@2050: default:nil fm@2050: pattern:'*.rs'. fm@2050: fm@2050: aFilename isEmptyOrNil ifTrue:[^ nil ]. fm@2050: ^aFilename asFilename fm@2050: ! fm@2050: fm@2051: requestFilenameFor: lang fm@2051: "Returns a filename to save the language resource and updates the language's info" fm@2051: |aFilename| fm@2051: fm@2051: aFilename := Dialog cg@2410: requestFileName:(resources string:'Name of resource file to save %1:' with:lang asString) fm@2051: default:nil fm@2051: pattern:'*.rs'. fm@2051: fm@2051: aFilename isEmptyOrNil ifTrue:[^ nil ]. fm@2051: keyStringsToLanguageMappings atLanguage: lang putFilename: aFilename. fm@2051: ^aFilename asFilename fm@2051: ! fm@2051: fm@2050: requestLanguage cg@2410: ^ Dialog cg@2410: choose:(resources string:'For which language ?') cg@2410: fromList:languagesList cg@2410: lines:10. fm@2327: ! fm@2327: fm@2327: requestLanguageToSave fm@2050: ^ Dialog fm@2050: choose:'Which language do you want to save?' fm@2050: fromList:languagesList fm@2050: lines:10 cg@2410: ! cg@2410: cg@2410: requestPackage cg@2419: |package allProjects projectsWithResources| cg@2419: cg@2419: allProjects := Smalltalk allProjectIDs. cg@2419: projectsWithResources := allProjects cg@2419: select:[:pID | cg@2419: |dir| cg@2419: dir := Smalltalk projectDirectoryForPackage:pID. cg@2419: (dir asFilename construct:'resources') exists cg@2419: ]. cg@2410: cg@2410: package := Dialog cg@2410: requestProject:(resources string:'Name of Package:') cg@2419: from:projectsWithResources cg@2410: initialAnswer:LastProject cg@2410: suggestions:nil. cg@2410: cg@2410: package isEmptyOrNil ifTrue:[^ nil ]. cg@2410: LastProject := package. cg@2410: ^ package fm@2050: ! ! fm@2050: fm@2327: !InternationalLanguageTranslationEditor methodsFor:'images'! fm@2327: fm@2327: restartSearchBarIcon fm@2327: fm@2327: ^ self class restartSearchBarIcon fm@2327: ! fm@2327: fm@2327: warningSearchBarIcon fm@2327: fm@2327: ^ self class warningSearchBarIcon fm@2327: ! ! fm@2327: cg@2015: !InternationalLanguageTranslationEditor methodsFor:'initialization & release'! cg@2015: cg@2015: closeRequest cg@2015: "asks for permission before closing" cg@2015: cg@2015: self hasUnsavedChanges ifTrue:[ cg@2015: (Dialog cg@2015: confirm:(resources string:'Close without saving ?') cg@2015: default:false) ifFalse:[ cg@2015: ^ self cg@2015: ] cg@2015: ]. cg@2015: cg@2015: super closeRequest cg@2015: ! cg@2015: cg@2015: initialize cg@2015: modified := false. cg@2031: inSingleFileMode := false. cg@2015: super initialize cg@2015: ! cg@2015: fm@2049: languageEditorBuilt:aView fm@2049: languageEditor := aView. fm@2049: ! fm@2049: cg@2015: postBuildDataSet:aView fm@2049: dataSetView := aView. fm@2049: aView selectedColIndexHolder onChangeSend:#selectionChanged to:self. cg@2015: ! ! cg@2015: fm@2327: !InternationalLanguageTranslationEditor methodsFor:'initialize'! fm@2327: fm@2327: postBuildSearchBoxView: aBoxView fm@2327: fm@2327: searchBoxView := aBoxView fm@2327: fm@2327: "Created: / 15-06-2007 / 18:02:38 / Administrador" fm@2327: ! fm@2327: fm@2327: postBuildSearchTextView: anEditFieldView fm@2327: fm@2327: searchTextView := anEditFieldView fm@2327: fm@2327: "Created: / 15-06-2007 / 18:17:15 / Administrador" fm@2327: ! fm@2327: fm@2327: postBuildTranslationsPanel: aPanel fm@2327: fm@2327: translationsPanel := aPanel fm@2327: ! fm@2327: fm@2327: postBuildWith:aBuilder fm@2327: fm@2327: super postBuildWith:aBuilder. fm@2327: self updateToolVisibility. fm@2327: ! ! fm@2327: cg@2015: !InternationalLanguageTranslationEditor methodsFor:'menu actions'! cg@2015: cg@2015: addLanguage cg@2015: |lang| cg@2015: cg@2410: lang := Dialog request:(resources string:'New language (ISO symbol):'). cg@2015: lang isEmptyOrNil ifTrue:[^ self]. cg@2410: self addLanguage:lang cg@2410: ! cg@2410: cg@2410: addLanguage:langArg cg@2410: |lang| cg@2410: cg@2410: lang := langArg asSymbol. cg@2015: (keyStringsToLanguageMappings includesLanguage:lang) ifTrue:[^ self ]. cg@2015: cg@2015: keyStringsToLanguageMappings addLanguage:lang. cg@2015: self languagesList add:lang. cg@2015: self shownLanguages add:lang. cg@2015: modified := true. cg@2015: ! cg@2015: cg@2015: addTranslation cg@2015: |key index| cg@2015: cg@2015: key := Dialog request:'New Key:'. fm@2051: key isEmpty ifTrue:[^self]. fm@2163: (self includesKey:key) ifFalse:[ cg@2015: keyStringsToLanguageMappings addKey:key. cg@2015: modified := true. cg@2015: ]. fm@2051: index := keyStringsToLanguageMappings indexOfKey:key. fm@2051: self selectedKeyRow value:index cg@2015: ! cg@2015: fm@2163: changeLastNameSpace fm@2163: fm@2163: |nameSpace defaultNameSpace| fm@2163: fm@2163: lastNameSpace notNil ifTrue:[defaultNameSpace := lastNameSpace name]. fm@2163: nameSpace := Dialog requestNameSpace:'NameSpace:' title:'Search String in Name Space:' initialAnswer:defaultNameSpace. fm@2163: nameSpace isNil ifTrue:[^self]. fm@2163: nameSpace := Smalltalk at:nameSpace asSymbol. fm@2163: nameSpace isNil ifTrue:[ fm@2327: ^Dialog information:(resources string:'No such nameSpace exists.') fm@2163: ]. fm@2163: lastNameSpace := nameSpace. fm@2163: ! fm@2163: fm@2327: changeLastPackage fm@2327: fm@2327: |package defaultPackage| fm@2327: fm@2327: lastPackage notNil ifTrue:[defaultPackage := lastPackage]. fm@2327: package := Dialog fm@2327: requestProject:'Package:' fm@2327: initialAnswer:defaultPackage fm@2327: suggestions:#('foo' 'bar' 'baz'). fm@2327: package isNil ifTrue:[ cg@2410: ^ self "/ Dialog information:(resources string:'No such package exists.') fm@2327: ]. fm@2327: lastPackage := package. fm@2327: ! fm@2327: cg@2015: extractTranslationsFromClass cg@2015: |aClass newTranslations| cg@2015: cg@2015: aClass := Dialog cg@2015: requestClass:'Class to extract translations from:' cg@2015: okLabel:'OK' cg@2015: initialAnswer:(lastExtractedClass ? LastExtractedClass). cg@2015: aClass isNil ifTrue:[^ self ]. cg@2015: cg@2015: lastExtractedClass := LastExtractedClass := aClass. cg@2015: cg@2032: newTranslations := self extractTranslationsFromClass:aClass. cg@2032: self addAllTranslations:newTranslations. cg@2032: ! cg@2032: fm@2163: extractTranslationsFromNameSpace fm@2163: fm@2163: |newTranslations| fm@2163: fm@2163: self changeLastNameSpace. fm@2163: lastNameSpace isNil ifTrue:[^self.]. fm@2163: newTranslations := OrderedCollection new. fm@2163: lastNameSpace allClassesDo:[:eachClass | fm@2163: newTranslations addAll:( self extractTranslationsFromClass:eachClass theNonMetaclass). fm@2163: ]. fm@2163: self addAllTranslations:newTranslations. fm@2163: ! fm@2163: cg@2032: extractTranslationsFromProject cg@2032: |box projectID newTranslations| cg@2032: cg@2032: box := ListSelectionBox new. cg@2032: "/ box useComboBoxWithList:(Smalltalk allProjectIDs). cg@2032: box title:(resources string:'Project to extract translations from:'). cg@2032: box list:Smalltalk allProjectIDs. cg@2032: box okAction:[:sel | projectID := sel]. cg@2032: box initialText:(lastExtractedProject ? LastExtractedProject). cg@2032: box label:'Find Translations in Project'. cg@2032: cg@2032: box showAtPointer. cg@2032: cg@2032: projectID notNil ifTrue:[ cg@2032: projectID := projectID withoutSeparators asSymbol. cg@2032: ]. cg@2032: projectID isEmptyOrNil ifTrue:[^ self ]. cg@2032: cg@2032: lastExtractedProject := LastExtractedProject := projectID. cg@2032: cg@2015: newTranslations := Set new. cg@2015: cg@2032: Smalltalk allClassesDo:[:eachClass | cg@2032: eachClass theNonMetaclass package == projectID ifTrue:[ cg@2032: "/ eachClass isLoaded ifTrue:[ self halt. ]. cg@2032: newTranslations addAll:( self extractTranslationsFromClass:eachClass theNonMetaclass). cg@2032: ] cg@2015: ]. cg@2015: cg@2032: self addAllTranslations:newTranslations. cg@2015: ! cg@2015: fm@2327: importExistingTranslationsFromFile cg@2410: self information:'The import function is not available in this release'. fm@2327: ! fm@2327: fm@2163: inspectCanvasMissingStrings fm@2163: fm@2163: |spec nameSpace missingStrings| fm@2163: fm@2163: missingStrings := OrderedCollection new. fm@2163: nameSpace := Dialog requestNameSpace:'NameSpace:' title:'Specify NameSpace to look for missing strings' initialAnswer:nil. fm@2163: nameSpace := Smalltalk at:nameSpace asSymbol. fm@2163: nameSpace isNil ifTrue:[ fm@2163: ^Dialog information:(resources string:'No such nameSpace exists.?') fm@2163: ]. fm@2163: fm@2163: nameSpace allClassesDo:[:cls | fm@2163: cls theMetaclass methodsDo:[:m | fm@2163: m hasResource ifTrue:[ fm@2163: (m resources includesKey:#canvas) ifTrue:[ fm@2163: spec := (cls perform:m selector) decodeAsLiteralArray. fm@2163: spec do:[:eachComponent | fm@2163: eachComponent translationKeysDo:[:k | fm@2163: (self includesKey: k) ifFalse:[ fm@2163: missingStrings add: k. fm@2163: Transcript showCR: k storeString, ' ', m printString]] fm@2163: ] fm@2163: ] fm@2163: ] fm@2163: ] fm@2163: ]. fm@2163: missingStrings asSet inspect fm@2163: ! fm@2163: cg@2015: menuNew cg@2015: modified ifTrue:[ cg@2015: (Dialog cg@2015: confirm:(resources stringWithCRs:'Modified translations have not been changed.\\Create new translations set anyway ?') cg@2015: default:false) ifFalse:[^ self]. cg@2015: ]. cg@2015: cg@2015: keyStringsToLanguageMappings initialize. cg@2015: keyStringsToLanguageMappings changed. cg@2015: cg@2015: self languagesList contents:self keyStringAndLanguageSelectionTable languages. cg@2015: self shownLanguages contents:self keyStringAndLanguageSelectionTable languages. cg@2015: modified := false. cg@2015: ! cg@2015: cg@2015: menuOpen fm@2050: |aFilename| cg@2015: fm@2163: self withWaitCursorDo:[ fm@2163: aFilename := self requestFilename. fm@2163: aFilename isNil ifTrue:[^ self ]. fm@2163: self readResourceFile:aFilename. fm@2163: ] cg@2015: ! cg@2015: cg@2410: menuOpenByPackage cg@2410: |package| cg@2410: cg@2410: self withWaitCursorDo:[ cg@2410: package := self requestPackage. cg@2410: package isNil ifTrue:[^ self ]. cg@2410: self readResourceFileForPackage:package. cg@2410: ] cg@2410: ! cg@2410: cg@2015: menuSave fm@2050: "Saves the language selected in the fileName from where the language resource was obtained." fm@2053: |lang| cg@2015: fm@2327: lang := self requestLanguageToSave. fm@2050: lang isNil ifTrue:[^ self]. fm@2053: self saveLanguage: lang fm@2053: ! fm@2053: fm@2053: menuSaveAll fm@2053: "Saves all the languages in the fileName from where the language resource was obtained." fm@2053: keyStringsToLanguageMappings languagesInUse do:[:each | self saveLanguage: each]. cg@2015: ! cg@2015: cg@2015: menuSaveAs fm@2050: "Saves the language selected in the specified fileName." fm@2050: |lang aFilename| cg@2015: fm@2327: lang := self requestLanguageToSave. fm@2050: lang isNil ifTrue:[^ self]. fm@2053: aFilename := self requestFilenameFor:lang. fm@2050: aFilename isNil ifTrue:[^ self]. fm@2050: self saveResourceFile:aFilename for:lang asSymbol cg@2015: ! cg@2015: cg@2015: openAboutThisApplication cg@2015: "This method was generated by the Browser. cg@2015: It will be invoked when the menu-item 'help-about' is selected." cg@2015: cg@2015: "/ could open a customized aboutBox here ... cg@2015: super openAboutThisApplication cg@2015: ! cg@2015: cg@2015: openDocumentation cg@2015: "This method was generated by the Browser. cg@2015: It will be invoked when the menu-item 'help-documentation' is selected." cg@2015: cg@2015: "/ change below as required ... cg@2015: cg@2015: "/ to open an HTML viewer on some document (under 'doc/online//' ): cg@2413: HTMLDocumentView openFullOnDocumentationFile:'tools/languageEditor/TOP.html'. cg@2015: cg@2015: "/ add application-specific help files under the 'doc/online//help/appName' cg@2015: "/ directory, and open a viewer with: cg@2015: "/ HTMLDocumentView openFullOnDocumentationFile:'help//TOP.html'. cg@2015: ! cg@2015: cg@2015: readResourceFile:aFilename cg@2031: |lang| cg@2031: fm@2327: lang := self requestLanguage. cg@2031: lang isNil ifTrue:[^ self ]. cg@2031: cg@2031: self readResourceFile:aFilename asLanguage:lang asSymbol cg@2031: ! cg@2031: cg@2410: readResourceFileForPackage:aPackage cg@2410: |allLanguages lang packageDir resourceDir langFile| cg@2410: cg@2410: packageDir := Smalltalk packageDirectoryForPackageId:aPackage. cg@2410: resourceDir := packageDir asFilename construct:'resources'. cg@2410: cg@2410: allLanguages := Set new. cg@2410: resourceDir directoryContentsAsFilenamesDo:[:eachFile | cg@2410: eachFile suffix = 'rs' ifTrue:[ cg@2410: (('##.rs' match:eachFile baseName) cg@2410: or:[('##-##.rs' match:eachFile baseName)]) ifTrue:[ cg@2410: allLanguages add:(eachFile withoutSuffix baseName) cg@2410: ]. cg@2410: ]. cg@2410: ]. cg@2410: cg@2410: allLanguages addAll:languagesList. cg@2410: allLanguages := allLanguages asSortedCollection. cg@2410: cg@2410: lang := Dialog cg@2410: choose:(resources string:'For which language ?') cg@2410: fromList:allLanguages cg@2410: values:allLanguages cg@2410: buttons:(resources array:#('All')) cg@2410: values:#(all) cg@2410: lines:10 cg@2410: cancel:nil. cg@2410: cg@2410: lang isNil ifTrue:[^ self ]. cg@2410: cg@2410: langFile := resourceDir construct:lang,'.rs'. cg@2410: cg@2410: lang == #all ifTrue:[ cg@2410: allLanguages do:[:lang | cg@2410: self addLanguage:lang. cg@2410: self readResourceFile:(resourceDir construct:lang,'.rs') asLanguage:lang. cg@2410: ]. cg@2410: ] ifFalse:[ cg@2410: self readResourceFile:langFile asLanguage:lang asSymbol cg@2410: ]. cg@2410: ! cg@2410: fm@2050: removeLanguage fm@2050: |lang| cg@2031: fm@2050: lang := Dialog choose:'Which language do you want to remove?' fromList:languagesList lines:10. fm@2050: lang isNil ifTrue:[^ self ]. fm@2050: (Dialog confirm: 'Are you sure to remove the language ', lang ) ifTrue:[ fm@2050: self languagesList remove:lang. fm@2050: self shownLanguages remove:lang. fm@2050: ]. cg@2015: ! cg@2015: cg@2015: removeTranslation cg@2015: |rowSelectionIndex selectedKey| cg@2015: cg@2015: rowSelectionIndex := self selectedKeyRow value. fm@2163: rowSelectionIndex isNil ifTrue:[^self]. cg@2015: rowSelectionIndex ~~ 0 ifTrue:[ cg@2015: selectedKey := keyStringsToLanguageMappings keyAt:rowSelectionIndex ifAbsent:nil. fm@2163: selectedKey isNil ifTrue:[^self]. cg@2015: (Dialog confirm:(resources string:'Really remove key %1' with:selectedKey)) ifTrue:[ cg@2015: keyStringsToLanguageMappings removeKey:selectedKey. cg@2015: ]. cg@2015: ]. cg@2015: ! cg@2015: cg@2015: runApplicationAndCollectTranslations cg@2047: |applicationClass newTranslations pseudoPack app startSelector| cg@2015: cg@2015: monitoredApplication notNil ifTrue:[ cg@2015: monitoredApplication terminate. cg@2015: [monitoredApplication notNil] whileTrue:[ cg@2015: Delay waitForSeconds:0.1 cg@2015: ]. cg@2015: ]. cg@2015: cg@2015: applicationClass := Dialog cg@2015: requestClass:'Application class to start and collect translations from:' cg@2015: okLabel:'OK' cg@2015: initialAnswer:(lastExtractedApplicationClass ? LastExtractedApplicationClass ). cg@2015: applicationClass isNil ifTrue:[^ self ]. cg@2047: applicationClass isNamespace ifTrue:[ cg@2047: Dialog warn:'Entered class is a NameSpace'. cg@2047: ^ self. cg@2047: ]. cg@2047: cg@2047: applicationClass isVisualStartable ifTrue:[ cg@2047: startSelector := #open cg@2047: ] ifFalse:[ cg@2047: startSelector := Dialog cg@2047: request:'Entered class seems to be no application class. Ok to start using selector:' cg@2047: initialAnswer:((applicationClass respondsTo:#'start') cg@2047: ifTrue:#'start' cg@2047: ifFalse:#'new') cg@2047: okLabel:'START' cg@2047: title:'Start Application'. cg@2047: startSelector isNil ifTrue:[ cg@2047: ^ self cg@2047: ]. cg@2047: startSelector := startSelector asSymbol. cg@2047: ]. cg@2015: cg@2015: lastExtractedApplicationClass := LastExtractedApplicationClass := applicationClass. cg@2015: cg@2015: newTranslations := Set new. cg@2015: cg@2015: pseudoPack := AccessCollectingPseudoResourcePack new. cg@2015: pseudoPack realResourcePack:(applicationClass classResources). cg@2015: cg@2015: self stopApplicationIconVisibleHolder value:true. cg@2015: cg@2015: monitoredApplication := [ cg@2015: [ cg@2015: app := applicationClass new. cg@2047: app perform:startSelector. cg@2015: app window waitUntilVisible. cg@2015: app window waitUntilClosed. cg@2015: ] ensure:[ cg@2015: app closeRequest. cg@2015: self stopApplicationIconVisibleHolder value:false. cg@2015: monitoredApplication := nil. cg@2015: ]. cg@2015: ] fork. fm@2163: ! fm@2163: fm@2163: searchStringInLastNameSpace fm@2163: fm@2323: |selectedKey browser lastSearchPatterns| fm@2163: fm@2163: selectedKey := self selectedKey. fm@2163: selectedKey isNil ifTrue:[^Dialog information: 'No selected key']. fm@2163: browser := NewSystemBrowser new "open". fm@2163: browser allButOpen. fm@2323: lastSearchPatterns := browser lastSearchPatterns. fm@2323: (lastSearchPatterns notNil and:[lastSearchPatterns first ~= selectedKey]) ifTrue:[ fm@2163: browser lastSearchPatterns addFirst: selectedKey fm@2163: ]. fm@2327: SearchDialog lastStringSearchArea: #currentNameSpace. fm@2163: lastNameSpace isNil ifTrue:[ fm@2163: self changeLastNameSpace. fm@2163: ]. fm@2163: lastNameSpace notNil ifTrue:[ fm@2163: "/ browser navigationState selectedClasses value: lastNameSpace allClasses. fm@2163: browser navigationState nameSpaceFilter value: (OrderedCollection with:lastNameSpace name). fm@2163: browser navigationState selectedNamespaces value: (OrderedCollection with:lastNameSpace name). fm@2163: ]. fm@2163: self withWaitCursorDo:[ fm@2163: browser browseMenuMethodsWithString fm@2163: ]. fm@2327: ! fm@2327: fm@2327: searchStringInLastPackage fm@2327: fm@2327: | selectedKey browser lastSearchPatterns| fm@2327: fm@2327: selectedKey := self selectedKey. fm@2327: selectedKey isNil ifTrue:[^Dialog information: 'No selected key']. fm@2327: browser := NewSystemBrowser new "open". fm@2327: browser allButOpen. fm@2327: lastSearchPatterns := browser lastSearchPatterns. fm@2327: (lastSearchPatterns notNil and:[lastSearchPatterns first ~= selectedKey]) ifTrue:[ fm@2327: browser lastSearchPatterns addFirst: selectedKey fm@2327: ]. fm@2327: SearchDialog lastStringSearchArea: #currentPackage. fm@2327: lastPackage isNil ifTrue:[ fm@2327: self changeLastPackage. fm@2327: ]. fm@2327: lastPackage notNil ifTrue:[ fm@2327: "/ browser navigationState selectedClasses value: lastNameSpace allClasses. fm@2327: browser navigationState packageFilter value: (OrderedCollection with:lastPackage). fm@2327: browser navigationState selectedProjects value: (OrderedCollection with:lastPackage). fm@2327: ]. fm@2327: self withWaitCursorDo:[ fm@2327: browser browseMenuMethodsWithString fm@2327: ]. cg@2015: ! ! cg@2015: cg@2015: !InternationalLanguageTranslationEditor methodsFor:'menus dynamic'! cg@2015: cg@2015: disableLanguageDisplayFor:lang cg@2015: self shownLanguages remove:lang ifAbsent:[] cg@2015: ! cg@2015: cg@2015: enableLanguageDisplayFor:newLang cg@2015: |shownLanguagesInOrder| cg@2015: cg@2015: (self shownLanguages includes:newLang) ifFalse:[ cg@2048: "/ shownLanguagesInOrder := self languagesList cg@2048: "/ select:[:lang | (self shownLanguages includes:lang) cg@2048: "/ or:[ lang = newLang ]]. cg@2048: "/ self shownLanguages contents:shownLanguagesInOrder. cg@2048: self shownLanguages add:newLang. cg@2015: ] cg@2015: ! cg@2015: cg@2015: isLanguageShown:lang cg@2015: ^ self shownLanguages includes:lang cg@2015: ! cg@2015: cg@2015: shownLanguagesMenu cg@2015: cg@2015: cg@2015: ^ [ cg@2015: |m selected| cg@2015: cg@2015: m := Menu new. cg@2015: cg@2015: self languagesList do:[:lang | cg@2015: |item| cg@2015: cg@2015: item := MenuItem label:lang. cg@2015: item indication:(self languageShownHolderFor:lang). cg@2015: item hideMenuOnActivated:false. cg@2015: m addItem:item. cg@2015: ]. cg@2015: m cg@2015: ]. cg@2015: ! cg@2015: cg@2015: toggleLanguageDisplayFor:lang cg@2015: (self shownLanguages includes:lang) ifTrue:[ cg@2015: self disableLanguageDisplayFor:lang cg@2015: ] ifFalse:[ cg@2015: self enableLanguageDisplayFor:lang cg@2015: ]. cg@2015: ! ! cg@2015: cg@2015: !InternationalLanguageTranslationEditor methodsFor:'private-key extraction'! cg@2015: cg@2032: addAllTranslations:newTranslations cg@2034: |newTranslationKeys stringKeys nonStringKeys| cg@2032: cg@2034: newTranslationKeys := newTranslations select:[:k | k notEmpty and:[k isString not or:[k isBlank not]]]. cg@2032: newTranslationKeys := newTranslationKeys select:[:k | (keyStringsToLanguageMappings includesKey:k) not]. cg@2034: newTranslationKeys := newTranslationKeys cg@2034: collect:[:k | cg@2034: (k endsWith:'...') ifTrue:[ cg@2034: k copyWithoutLast:3. cg@2034: ] ifFalse:[ cg@2035: ('.:?' includes:k last) ifTrue:[ cg@2034: k copyWithoutLast:1. cg@2034: ] ifFalse:[ cg@2034: k cg@2034: ]]]. cg@2034: newTranslationKeys := newTranslationKeys asSet. cg@2034: cg@2032: newTranslationKeys notEmpty ifTrue:[ cg@2034: stringKeys := newTranslationKeys select:[:k | k isString]. cg@2034: nonStringKeys := newTranslationKeys select:[:k | k isString not]. cg@2034: cg@2034: stringKeys := stringKeys asSortedCollection. cg@2034: keyStringsToLanguageMappings addKeys:stringKeys. cg@2034: keyStringsToLanguageMappings addKeys:nonStringKeys. cg@2032: modified := true. cg@2032: ]. cg@2032: ! cg@2032: cg@2032: extractTranslationsFromClass:aClass cg@2032: |newTranslations| cg@2032: cg@2032: newTranslations := Set new. cg@2032: cg@2032: self withWaitCursorDo:[ cg@2032: "/ now, the hard part: cg@2032: "/ possible translations are in the specs, cg@2032: "/ and all arguments to (resources string:) messages. cg@2032: aClass instAndClassMethodsDo:[:eachMethod | cg@2032: newTranslations addAll:( self extractTranslationsFromMethod:eachMethod ). cg@2032: ]. cg@2032: ]. cg@2032: ^ newTranslations cg@2032: ! cg@2032: cg@2015: extractTranslationsFromHelpSpecMethod:aMethod cg@2015: |codeStrings matcher parseTree resourceKeys| cg@2015: cg@2015: parseTree := RBParser cg@2015: parseMethod:aMethod source cg@2015: onError: [:str :pos | Transcript showCR:str. Transcript showCR:pos. cg@2015: nil]. cg@2015: parseTree isNil ifTrue:[^ #() ]. cg@2015: cg@2015: codeStrings := cg@2015: #( cg@2015: '`@dict addPairsFrom: `#helpKeysAndStrings' cg@2015: ). cg@2015: cg@2015: resourceKeys := Set new. cg@2015: cg@2015: matcher := ParseTreeSearcher new. cg@2015: matcher cg@2015: matchesAnyOf: codeStrings cg@2015: do: [:aNode :answer | cg@2015: |sel argNode arg| cg@2015: cg@2015: sel := aNode selector. cg@2015: (sel startsWith:'addPairsFrom:') ifTrue:[ cg@2015: argNode := aNode arguments at:1. cg@2015: argNode isLiteral ifTrue:[ cg@2015: arg := argNode value. cg@2015: arg isArray ifTrue:[ cg@2015: arg doWithIndex:[:el :index | cg@2015: index even ifTrue:[ cg@2015: el isString ifTrue:[ cg@2015: resourceKeys add:el. cg@2015: ] cg@2015: ]. cg@2015: ]. cg@2015: ] ifFalse:[ cg@2015: Transcript cg@2015: showCR:(resources cg@2015: string:'Cannot derive resourceKey from non-array in %1 in %2' cg@2015: with:argNode formattedCode cg@2015: with:aMethod selector). cg@2015: ]. cg@2015: ] ifFalse:[ cg@2015: Transcript cg@2015: showCR:(resources cg@2015: string:'Cannot derive resourceKey from non-literal: %1 in %2' cg@2015: with:argNode formattedCode cg@2015: with:aMethod selector). cg@2015: ]. cg@2015: ]. cg@2015: aNode cg@2015: ]. cg@2015: cg@2015: matcher executeTree: parseTree initialAnswer: nil. cg@2015: ^ resourceKeys cg@2015: ! cg@2015: cg@2015: extractTranslationsFromMenuSpecMethod:aMethod cg@2015: |menu resourceKeys| cg@2015: cg@2015: menu := aMethod mclass theNonMetaclass perform:aMethod selector. cg@2015: menu isNil ifTrue:[ ^ #() ]. cg@2015: cg@2015: (menu isKindOf:Menu) ifFalse:[ cg@2015: menu := Menu new fromLiteralArrayEncoding:menu cg@2015: ]. cg@2015: cg@2015: resourceKeys := Set new. cg@2015: menu allItemsDo:[:aMenuItem | cg@2015: aMenuItem translateLabel ifTrue:[ cg@2015: aMenuItem isSeparatorItem ifFalse:[ cg@2015: resourceKeys add:aMenuItem label. cg@2015: ] cg@2015: ] cg@2015: ]. cg@2015: ^ resourceKeys cg@2015: ! cg@2015: cg@2015: extractTranslationsFromMethod:aMethod cg@2015: |mResources| cg@2015: cg@2015: mResources := aMethod resources. cg@2015: mResources notNil ifTrue:[ cg@2015: (mResources includesKey:#menu) ifTrue:[ cg@2015: ^ self extractTranslationsFromMenuSpecMethod:aMethod. cg@2015: ]. cg@2015: (mResources includesKey:#canvas) ifTrue:[ cg@2015: ^ self extractTranslationsFromUISpecMethod:aMethod. cg@2015: ]. cg@2015: (mResources includesKey:#help) ifTrue:[ cg@2015: ^ self extractTranslationsFromHelpSpecMethod:aMethod. cg@2015: ]. cg@2015: (mResources includesKey:#tableColumns) ifTrue:[ cg@2015: ^ self extractTranslationsFromTableColumnsSpecMethod:aMethod. cg@2015: ]. cg@2015: cg@2015: ^ self extractTranslationsFromSpecMethod:aMethod. cg@2015: ]. cg@2015: ^ self extractTranslationsFromMethodsCode:aMethod cg@2015: ! cg@2015: cg@2015: extractTranslationsFromMethodsCode:aMethod cg@2015: "/method:mthd selector:sel inClass:cls matchesParseTreeMatcher:aMatcher cg@2015: |codeStrings matcher parseTree resourceKeys| cg@2015: cg@2015: parseTree := RBParser cg@2015: parseMethod:aMethod source cg@2015: onError: [:str :pos | Transcript showCR:str. Transcript showCR:pos. cg@2015: nil]. cg@2015: parseTree isNil ifTrue:[^ #() ]. cg@2015: cg@2015: codeStrings := cg@2015: #( cg@2015: 'resources `@msg: `@args' cg@2015: 'self resources `@msg: `@args' cg@2015: 'self class resources `@msg: `@args' cg@2015: 'self classResources `@msg: `@args' cg@2015: ). cg@2015: cg@2015: resourceKeys := Set new. cg@2015: cg@2015: matcher := ParseTreeSearcher new. cg@2015: matcher cg@2015: matchesAnyOf: codeStrings cg@2015: do: [:aNode :answer | cg@2015: |sel keyStringArgNode keyStringArg| cg@2015: cg@2015: sel := aNode selector. cg@2015: ((sel startsWith:'string:') or:[(sel startsWith:'at:')]) ifTrue:[ cg@2015: keyStringArgNode := aNode arguments at:1. cg@2015: keyStringArgNode isLiteral ifTrue:[ cg@2015: keyStringArg := keyStringArgNode value. cg@2015: keyStringArg isString ifTrue:[ cg@2015: resourceKeys add:keyStringArg. cg@2015: ] ifFalse:[ cg@2015: Transcript cg@2015: showCR:(resources cg@2015: string:'Cannot derive resourceKey from non-string: %1 in %2' cg@2015: with:keyStringArgNode formattedCode cg@2015: with:aMethod selector). cg@2015: ]. cg@2015: ] ifFalse:[ cg@2015: Transcript cg@2015: showCR:(resources cg@2015: string:'Cannot derive resourceKey from non-literal: %1 in %2' cg@2015: with:keyStringArgNode formattedCode cg@2015: with:aMethod selector). cg@2015: ]. cg@2015: ]. cg@2015: aNode cg@2015: ]. cg@2015: cg@2015: matcher executeTree: parseTree initialAnswer: nil. cg@2015: ^ resourceKeys cg@2015: ! cg@2015: cg@2015: extractTranslationsFromSpecMethod:aMethod cg@2015: ^ #() cg@2015: ! cg@2015: cg@2015: extractTranslationsFromTableColumnsSpecMethod:aMethod cg@2015: |columnDescription resourceKeys| cg@2015: cg@2015: columnDescription := aMethod mclass theNonMetaclass perform:aMethod selector. cg@2015: columnDescription isNil ifTrue:[ ^ #() ]. cg@2015: cg@2015: (columnDescription first isKindOf:DataSetColumnSpec) ifFalse:[ cg@2015: columnDescription := columnDescription collect:[:el | DataSetColumnSpec new fromLiteralArrayEncoding:el]. cg@2015: ]. cg@2015: cg@2015: resourceKeys := Set new. cg@2015: columnDescription do:[:aColumnSpec | cg@2015: aColumnSpec translateLabel ifTrue:[ cg@2015: resourceKeys add:aColumnSpec label. cg@2015: ] cg@2015: ]. cg@2015: ^ resourceKeys cg@2015: ! cg@2015: cg@2015: extractTranslationsFromUISpecMethod:aMethod cg@2015: |spec resourceKeys visitor| cg@2015: cg@2015: spec := aMethod mclass theNonMetaclass perform:aMethod selector. cg@2015: spec isNil ifTrue:[ ^ #() ]. cg@2015: cg@2015: (spec isKindOf:UISpecification) ifFalse:[ cg@2015: spec := UISpecification from:spec cg@2015: ]. cg@2015: cg@2015: resourceKeys := Set new. cg@2015: cg@2015: visitor := UISpecVisitor new. cg@2015: spec acceptVisitor:visitor. cg@2015: cg@2015: ^ visitor translatedLabels cg@2015: ! ! cg@2015: cg@2015: !InternationalLanguageTranslationEditor methodsFor:'queries'! cg@2015: fm@2050: autoAccept fm@2050: fm@2050: ^ self autoAcceptHolder value fm@2050: ! fm@2050: fm@2050: currentExampleLanguageText fm@2050: "Returns the language text corresponding for the current selected key and the example language selection" fm@2050: fm@2050: ^self languageTextFromSelectedKeyFor: self exampleLanguageSelectionHolder value fm@2050: ! fm@2050: fm@2051: currentLanguage fm@2051: fm@2163: |colSelectionIndex | fm@2051: fm@2051: colSelectionIndex := dataSetView selectedColIndex. fm@2051: ^colSelectionIndex > 1 ifTrue:[ shownLanguages at:colSelectionIndex-1 ] ifFalse:nil. fm@2051: ! fm@2051: fm@2050: exampleLanguageByDefault fm@2050: fm@2163: ^self shownLanguages isEmpty fm@2163: ifTrue:[nil] fm@2163: ifFalse:[self shownLanguages first] fm@2050: ! fm@2050: fm@2051: hasFirstRowSelection fm@2051: self selectedKeyRow isNil ifTrue:[^false]. fm@2051: ^ self selectedKeyRow value > 1 fm@2051: ! fm@2051: fm@2051: hasLanguageSelection fm@2051: dataSetView selectedColIndex isNil ifTrue:[^false]. fm@2051: ^ dataSetView selectedColIndex > 1 fm@2051: ! fm@2051: cg@2015: hasUnsavedChanges cg@2015: ^ modified fm@2050: ! fm@2050: fm@2163: includesKey: aKey fm@2163: keyStringsToLanguageMappings isNil ifTrue:[^false]. fm@2163: ^keyStringsToLanguageMappings includesKey:aKey fm@2163: ! fm@2163: fm@2051: isSearchForSimilarTranslationEnabled fm@2051: fm@2163: ^self searchForSimilarTranslationEnableHolder value fm@2051: ! fm@2051: fm@2051: languageTextFromKey: aKeyIndex for: language fm@2051: "Returns the language text corresponding for the aKeyIndex and the received language" fm@2051: fm@2051: language isNil ifTrue:[^'']. fm@2051: ^keyStringsToLanguageMappings at: aKeyIndex language:language. fm@2051: ! fm@2051: fm@2050: languageTextFromSelectedKeyFor: language fm@2050: "Returns the language text corresponding for the current selected key and the received language" fm@2050: fm@2051: ^self languageTextFromKey: self selectedKey for: language fm@2051: ! fm@2051: fm@2051: shouldCopyPreviousTranslationButtonBeEnabled fm@2051: ^ self hasLanguageSelection fm@2051: and:[self hasFirstRowSelection] fm@2051: ! fm@2051: fm@2323: shouldPasteOriginalButtonBeEnabled fm@2323: ^ self hasLanguageSelection fm@2323: and:[self hasFirstRowSelection] fm@2323: ! fm@2323: fm@2051: shouldSearchForSimilarTranslation fm@2051: fm@2163: self isSearchForSimilarTranslationEnabled ifFalse:[^false]. fm@2163: (self languageTextHolder value notNil and:[self languageTextHolder value notEmpty]) ifTrue:[^false]. fm@2163: (self hasLanguageSelection and:[self selectedKeyRow notNil]) ifFalse:[^false]. fm@2163: ^true fm@2050: ! ! fm@2050: fm@2050: !InternationalLanguageTranslationEditor methodsFor:'read/write resourceFile'! fm@2050: fm@2053: encoderAt: lang fm@2053: fm@2163: self alwaysWriteUTF8Holder value ifTrue:[^CharacterEncoder encoderForUTF8]. fm@2163: ^keyStringsToLanguageMappings encoderAt: lang. fm@2053: ! fm@2053: fm@2050: printEditingWarningOn: aStream fm@2050: fm@2163: aStream nextPutAll: ';'; fm@2163: cr; fm@2163: nextPutAll: '; WARNING:'; fm@2163: cr; fm@2163: nextPutAll: '; this file contains national characters'; fm@2163: cr; fm@2163: nextPutAll: '; DONT EDIT this file with an old vi !!'; fm@2163: cr; fm@2163: nextPutAll: ';'; fm@2163: cr; fm@2163: cr. fm@2050: ! fm@2050: fm@2050: printEncoderFor: lang on: aStream fm@2163: |characterEncoder encoderString| fm@2050: fm@2163: characterEncoder := self encoderAt: lang. fm@2163: encoderString := characterEncoder isNil fm@2163: ifTrue:[self requestEncoderStringFor: lang] fm@2163: ifFalse:[characterEncoder nameOfEncoding printString]. fm@2050: fm@2163: aStream nextPutAll: '#encoding'; fm@2163: space; fm@2163: nextPutAll: encoderString; fm@2163: cr; fm@2163: cr. fm@2050: ! fm@2050: fm@2050: printLanguage: lang on: aStream fm@2050: fm@2163: self printEncoderFor: lang on: aStream. fm@2163: self printEditingWarningOn: aStream. fm@2163: self printLanguageMappingsFor: lang on: aStream. fm@2050: ! fm@2050: fm@2050: printLanguageMappingsFor: lang on: aStream fm@2050: fm@2163: |orderedAssociations maxKeySize characterEncoder| fm@2050: fm@2163: characterEncoder := self encoderAt: lang. fm@2163: characterEncoder isNil ifTrue:[ characterEncoder := CharacterEncoder::NullEncoder ]. fm@2163: orderedAssociations := keyStringsToLanguageMappings orderedLanguageMappingsAssociationsFor: lang. fm@2050: fm@2163: maxKeySize := keyStringsToLanguageMappings maxKeySizeForLanguage: lang. fm@2050: fm@2163: orderedAssociations do:[:association | fm@2163: aStream nextPutAll: (association key storeString paddedTo: maxKeySize) ; fm@2163: nextPutAll: (String new: 10); fm@2163: nextPutAll: (characterEncoder encodeString: association value) storeString; fm@2163: cr. fm@2163: ]. fm@2050: ! fm@2050: fm@2050: readResourceFile:aFilename asLanguage:lang fm@2050: |resourcePack inStream lineString encoding decoder sortedKeys remainingKeys| fm@2050: cg@2410: aFilename exists ifFalse:[ cg@2410: Dialog information:(resources string:'Language file: "%1" does not exist' with:aFilename baseName). cg@2410: ^ self cg@2410: ]. fm@2050: fm@2050: resourcePack := ResourcePack new. fm@2050: fm@2050: inStream := aFilename readStream. fm@2050: [inStream atEnd] whileFalse:[ fm@2050: lineString := inStream nextLine. fm@2050: (lineString notEmpty fm@2050: and:[ (lineString startsWith:';') not ]) ifTrue:[ fm@2050: ((lineString startsWith:'#') and:[(lineString startsWith:'#(') not]) ifTrue:[ fm@2050: lineString := (lineString copyFrom:2) withoutSeparators. fm@2050: (lineString startsWith:'encoding ') ifTrue:[ fm@2050: encoding := ResourcePack extractEncodingFromLine:lineString. fm@2050: decoder := CharacterEncoder encoderFor:encoding ifAbsent:nil. fm@2050: ]. fm@2050: ] ifFalse:[ fm@2050: ResourcePack fm@2050: processResourceLine:lineString fm@2050: encoding:decoder fm@2050: file:aFilename pathName fm@2050: printErrorWith:[:msg | Transcript showCR:msg ] fm@2050: for:resourcePack fm@2050: keepUselessTranslations:true. fm@2050: ]. fm@2050: ]. fm@2050: ]. fm@2050: inStream close. fm@2050: fm@2050: sortedKeys := (resourcePack keys select:[:k | k isString]) asSortedCollection. fm@2050: remainingKeys := resourcePack keys select:[:k | k isString not]. fm@2050: fm@2050: keyStringsToLanguageMappings atLanguage: lang putFilename: aFilename. cg@2410: keyStringsToLanguageMappings atLanguage: lang putEncoder: decoder. fm@2050: fm@2050: sortedKeys do:[:k | cg@2410: keyStringsToLanguageMappings at:k language:lang put:(resourcePack at:k) sendChange:false fm@2050: ]. fm@2050: remainingKeys do:[:k | cg@2410: keyStringsToLanguageMappings at:k language:lang put:(resourcePack at:k) sendChange:false fm@2050: ]. cg@2410: keyStringsToLanguageMappings changed. fm@2050: ! fm@2050: fm@2053: saveLanguage: lang fm@2053: "Saves the language in the fileName from where the language resource was obtained." fm@2053: |aFilename| fm@2053: fm@2053: lang isNil ifTrue:[^ self]. fm@2053: aFilename := keyStringsToLanguageMappings filenameAt:lang. fm@2053: aFilename isNil ifTrue:[ fm@2053: aFilename := self requestFilenameFor: lang. fm@2053: aFilename isNil ifTrue:[^ self]. fm@2053: ]. fm@2053: self saveResourceFile:aFilename for:lang asSymbol fm@2053: ! fm@2053: fm@2050: saveResourceFile: aFilename for: lang fm@2050: fm@2163: |aStream | fm@2050: fm@2163: keyStringsToLanguageMappings atLanguage: lang putFilename: aFilename. fm@2163: aStream := FileStream newFileNamed: aFilename. fm@2163: self printLanguage: lang on: aStream. fm@2163: aStream flush; fm@2163: close. fm@2163: DialogBox information: 'The resource file for the language ', lang printString storeString, ' was saved in the file: ', aFilename nameString cg@2015: ! ! cg@2015: fm@2327: !InternationalLanguageTranslationEditor methodsFor:'searching'! fm@2327: fm@2327: ignoreCaseHolderChanged fm@2327: fm@2327: self searchNextTextIncludingCurrentSelection: true. fm@2327: fm@2327: "Created: / 16-06-2007 / 09:33:33 / Administrador" fm@2327: ! fm@2327: fm@2327: searchNextText fm@2327: fm@2327: self searchNextTextIncludingCurrentSelection: false. fm@2327: fm@2327: "Modified: / 16-06-2007 / 09:21:14 / Administrador" fm@2327: ! fm@2327: fm@2327: searchNextTextFromBeginning fm@2327: |searchText rowFoundIndex| fm@2327: fm@2327: searchText := searchTextView contents. fm@2327: searchText isEmptyOrNil ifTrue:[^self]. fm@2327: self objectsList isEmpty ifTrue:[^self]. fm@2327: rowFoundIndex := self tableView findFirstRowWithString: searchText fm@2327: from:1 fm@2327: to:self objectsList size fm@2327: ignoreCase:self ignoreCaseHolder value. fm@2327: rowFoundIndex isNil ifTrue:[ fm@2327: self searchTextNotFound. fm@2327: ^self fm@2327: ]. fm@2327: self selectListIndex: rowFoundIndex fm@2327: fm@2327: "Created: / 16-06-2007 / 10:54:51 / Administrador" fm@2327: "Modified: / 19-06-2007 / 15:38:59 / Administrador" fm@2327: ! fm@2327: fm@2327: searchNextTextIncludingCurrentSelection: includeCurrentSelection fm@2327: |searchText currentSelectionIndex rowFoundIndex fromIndex listSize| fm@2327: fm@2327: self searchTextStarted. fm@2327: searchText := searchTextView contents. fm@2327: searchText isEmptyOrNil ifTrue:[^self]. fm@2327: self objectsList isEmpty ifTrue:[^self]. fm@2327: currentSelectionIndex := self currentSelectionIndex. fm@2327: (currentSelectionIndex isNil or:[currentSelectionIndex == 0]) ifTrue:[ fm@2327: self searchNextTextFromBeginning. fm@2327: ^self. fm@2327: ]. fm@2327: listSize := self objectsList size. fm@2327: (currentSelectionIndex == listSize and:[includeCurrentSelection not]) ifTrue:[ fm@2327: self searchNextTextReachEnd. fm@2327: ^self. fm@2327: ]. fm@2327: fromIndex := includeCurrentSelection fm@2327: ifTrue:[currentSelectionIndex] fm@2327: ifFalse:[currentSelectionIndex + 1]. fm@2327: rowFoundIndex := self tableView findFirstRowWithString: searchText fm@2327: from:fromIndex fm@2327: to:listSize fm@2327: ignoreCase:self ignoreCaseHolder value. fm@2327: rowFoundIndex isNil ifTrue:[ fm@2327: self searchNextTextReachEnd. fm@2327: ^self fm@2327: ]. fm@2327: self selectListIndex: rowFoundIndex fm@2327: fm@2327: "Created: / 16-06-2007 / 09:20:57 / Administrador" fm@2327: "Modified: / 19-06-2007 / 15:38:06 / Administrador" fm@2327: ! fm@2327: fm@2327: searchNextTextReachEnd fm@2327: |message| fm@2327: message := 'End of list reached, starting from the beginning'. fm@2327: self searchTextRestarted: message. fm@2330: Smalltalk beep. fm@2327: self searchNextTextFromBeginning. fm@2327: fm@2327: "Created: / 16-06-2007 / 11:00:59 / Administrador" fm@2327: ! fm@2327: fm@2327: searchPreviousText fm@2327: fm@2327: |searchText currentSelectionIndex rowFoundIndex fromIndex| fm@2327: fm@2327: self searchTextStarted. fm@2327: searchText := searchTextView contents. fm@2327: searchText isEmptyOrNil ifTrue:[^self]. fm@2327: self objectsList isEmpty ifTrue:[^self]. fm@2327: currentSelectionIndex := self currentSelectionIndex. fm@2327: currentSelectionIndex == 1 ifTrue:[ fm@2327: self searchPreviousTextReachBeginning. fm@2327: ^self. fm@2327: ]. fm@2327: (currentSelectionIndex isNil or:[currentSelectionIndex == 0]) fm@2327: ifTrue:[ fm@2327: self searchPreviousTextFromEnd. fm@2327: ^self. fm@2327: ] fm@2327: ifFalse:[fromIndex := currentSelectionIndex - 1]. fm@2327: rowFoundIndex := self tableView findFirstRowWithString: searchText fm@2327: from: fromIndex fm@2327: to: 1 fm@2327: by: -1 fm@2327: ignoreCase:self ignoreCaseHolder value. fm@2327: rowFoundIndex isNil ifTrue:[ fm@2327: self searchPreviousTextReachBeginning. fm@2327: ^self fm@2327: ]. fm@2327: self selectListIndex: rowFoundIndex. fm@2327: fm@2327: "Modified: / 19-06-2007 / 15:38:16 / Administrador" fm@2327: ! fm@2327: fm@2327: searchPreviousTextFromEnd fm@2327: fm@2327: |searchText rowFoundIndex| fm@2327: fm@2327: searchText := searchTextView contents. fm@2327: searchText isEmptyOrNil ifTrue:[^self]. fm@2327: self objectsList isEmpty ifTrue:[^self]. fm@2327: rowFoundIndex := self tableView findFirstRowWithString: searchText fm@2327: from: self objectsList size fm@2327: to: 1 fm@2327: by: -1 fm@2327: ignoreCase:self ignoreCaseHolder value. fm@2327: rowFoundIndex isNil ifTrue:[ fm@2327: self searchTextNotFound. fm@2327: ^self fm@2327: ]. fm@2327: self selectListIndex: rowFoundIndex. fm@2327: fm@2327: "Created: / 16-06-2007 / 10:55:43 / Administrador" fm@2327: "Modified: / 19-06-2007 / 15:38:26 / Administrador" fm@2327: ! fm@2327: fm@2327: searchPreviousTextReachBeginning fm@2327: |message| fm@2327: message := 'Beginning of list reached, starting from the end'. fm@2327: self searchTextRestarted: message. fm@2330: Smalltalk beep. fm@2327: self searchPreviousTextFromEnd. fm@2327: fm@2327: "Created: / 16-06-2007 / 11:01:23 / Administrador" fm@2327: ! fm@2327: fm@2327: searchTextModifiedHolderChanged fm@2327: fm@2327: self searchNextTextIncludingCurrentSelection: true. fm@2327: self searchTextModifiedHolder setValue: false. fm@2327: fm@2327: "/Transcript showCR: 'searchTextModifiedHolderChanged: ',(self searchTextHolder value ? ''). fm@2327: "/Transcript showCR: 'searchTextView contents: ',(searchTextView contents ? ''). fm@2327: fm@2327: "Created: / 15-06-2007 / 18:07:57 / Administrador" fm@2327: "Modified: / 16-06-2007 / 09:21:27 / Administrador" fm@2327: ! fm@2327: fm@2327: searchTextNotFound fm@2327: fm@2327: self selectListIndex: 0. fm@2327: self searchBarImageInfoLabelHolder value: self warningSearchBarIcon. fm@2327: self searchBarInfoLabelHolder value: 'Text not found'. fm@2327: self setSearchTextNotFoundColors. fm@2327: fm@2327: "Created: / 16-06-2007 / 06:51:01 / Administrador" fm@2327: "Modified: / 16-06-2007 / 11:43:53 / Administrador" fm@2327: ! fm@2327: fm@2327: searchTextRestarted: message fm@2327: fm@2327: self searchBarImageInfoLabelHolder value: self restartSearchBarIcon. fm@2327: self searchBarInfoLabelHolder value: message. fm@2327: "/ self setSearchTextNotFoundColors. fm@2327: fm@2327: "Created: / 16-06-2007 / 11:02:06 / Administrador" fm@2327: ! fm@2327: fm@2327: searchTextStarted fm@2327: fm@2327: self searchBarImageInfoLabelHolder value: nil. fm@2327: self searchBarInfoLabelHolder value: ''. fm@2327: self setSearchTextFoundColors. fm@2327: fm@2327: "Created: / 16-06-2007 / 06:54:03 / Administrador" fm@2327: "Modified: / 16-06-2007 / 10:07:06 / Administrador" fm@2327: ! fm@2327: fm@2327: setSearchTextFoundColors fm@2327: fm@2327: searchTextView foregroundColor: Color black. fm@2327: searchTextView backgroundColor: Color white. fm@2327: fm@2327: "Created: / 16-06-2007 / 06:28:32 / Administrador" fm@2327: ! fm@2327: fm@2327: setSearchTextNotFoundColors fm@2327: fm@2327: searchTextView foregroundColor: Color white. fm@2327: searchTextView backgroundColor: Color lightRed. fm@2327: fm@2327: "Created: / 16-06-2007 / 06:29:00 / Administrador" fm@2327: ! ! fm@2327: cg@2015: !InternationalLanguageTranslationEditor methodsFor:'specs-dynamic'! cg@2015: cg@2015: columnInRow:row at:colIndex cg@2015: |lang| cg@2015: cg@2015: lang := self languageAtCol:colIndex. cg@2015: ^ row atLanguage:lang cg@2015: ! cg@2015: cg@2015: getBackgroundForRow:row rowNr:rowNr col:colIndex cg@2015: |lang| cg@2015: cg@2015: colIndex == 1 ifTrue:[^ nil]. cg@2015: lang := self languageAtCol:colIndex. cg@2015: ^ (row atLanguage:lang) isNil ifTrue:[Color red lightened] ifFalse:nil cg@2015: ! cg@2015: cg@2015: keyStringAndLanguageSelectionTableColumnDescription cg@2015: |spec| cg@2015: cg@2015: spec := OrderedCollection new. cg@2015: cg@2047: spec add:(self class keyTableColumn first). cg@2015: cg@2015: self shownLanguages do:[:lang | cg@2015: |entry| cg@2015: cg@2047: entry := self class languageTableColumn first. cg@2047: entry := entry copy replaceAll:#lang with:lang. cg@2015: spec add: entry cg@2015: ]. cg@2015: ^ spec cg@2015: ! cg@2015: cg@2015: keyStringInRow:row cg@2015: ^ row keyString cg@2015: ! ! cg@2015: fm@2327: !InternationalLanguageTranslationEditor methodsFor:'update'! fm@2327: fm@2327: updateToolVisibility fm@2327: | bottomOffset searchBarVisible | fm@2327: fm@2327: bottomOffset := 0. fm@2327: fm@2327: searchBarVisible := self searchBoxVisible value. fm@2327: searchBarVisible ifTrue:[ fm@2327: bottomOffset := bottomOffset - searchBoxView height. fm@2327: ]. fm@2327: translationsPanel layout bottomOffset:bottomOffset-1. fm@2327: translationsPanel container notNil ifTrue:[ fm@2327: translationsPanel containerChangedSize. fm@2327: ]. fm@2327: fm@2327: "Created: / 16-06-2007 / 11:58:25 / Administrador" fm@2327: ! ! fm@2327: cg@2015: !InternationalLanguageTranslationEditor methodsFor:'user actions'! cg@2015: fm@2327: closeSearchBar fm@2327: fm@2327: self searchBoxVisible value: false. fm@2327: self updateToolVisibility. fm@2327: fm@2327: "Created: / 15-06-2007 / 18:03:05 / Administrador" fm@2327: "Modified: / 16-06-2007 / 11:58:52 / Administrador" fm@2327: ! fm@2327: fm@2050: exampleLanguageSelectionChanged fm@2050: fm@2050: self updateExampleLanguageText. fm@2050: ! fm@2050: fm@2051: languageTextAccepted cg@2416: |nextRowIndex selRow| cg@2416: cg@2416: selRow := self selectedKeyRow value. cg@2416: selRow notNil ifTrue:[ cg@2416: keyStringsToLanguageMappings size = selRow cg@2416: ifTrue:[ self updateLanguageTextModification.] cg@2416: ifFalse:[ cg@2416: nextRowIndex := selRow + 1. cg@2416: self selectedKeyRow value: nextRowIndex] cg@2416: ]. fm@2051: ! fm@2051: fm@2323: pasteOriginalInLanguageText fm@2323: fm@2323: fm@2323: | originalText| fm@2323: fm@2323: originalText := self selectedKey. fm@2323: languageEditor selectAll. fm@2323: languageEditor pasteOrReplace:originalText. fm@2323: self languageTextModifiedHolder value:true. fm@2323: ! fm@2323: fm@2051: pastePreviousTranslationInLanguageText fm@2051: "Obtain the text from the previous translation and paste it into the languageTextEditor" fm@2051: fm@2051: | previousLanguageText previousLanguageRow| fm@2051: fm@2051: previousLanguageRow := dataSetView at:self selectedKeyRow value - 1 fm@2051: ifAbsent:[^self]. fm@2051: previousLanguageText := previousLanguageRow atLanguage: self currentLanguage. fm@2051: languageEditor selectAll. fm@2051: languageEditor pasteOrReplace:previousLanguageText. fm@2051: self languageTextModifiedHolder value:true. fm@2051: ! fm@2051: fm@2327: search fm@2327: fm@2327: self searchBoxVisible value: true. fm@2327: self updateToolVisibility. fm@2327: searchTextView takeFocus. fm@2327: fm@2327: "Modified: / 16-06-2007 / 11:58:44 / Administrador" fm@2327: ! fm@2327: fm@2049: selectionChanged cg@2048: fm@2049: self updateOriginalTextModification. fm@2049: self updateLanguageTextModification. fm@2049: self updateLanguageAndKeySelection. fm@2050: self updateExampleLanguageText. cg@2015: fm@2051: self updateCopyPreviousTranslationButtonEnabled. fm@2323: self updatePasteOriginalButtonEnabled. fm@2051: fm@2049: self originalTextModifiedHolder value:false. fm@2049: self languageTextModifiedHolder value:false. fm@2051: fm@2051: self searchForSimilarTranslation. fm@2051: ! fm@2051: fm@2051: showMissingTranslationsOnlyChanged cg@2015: ! cg@2015: cg@2015: shownLanguagesChanged cg@2015: self keyStringAndLanguageSelectionTableColumnDescriptionHolder cg@2015: value:(self keyStringAndLanguageSelectionTableColumnDescription). cg@2015: ! cg@2015: cg@2015: stopApplication cg@2015: |p| cg@2015: cg@2015: (p := monitoredApplication) notNil ifTrue:[ cg@2015: p terminate. cg@2015: ]. cg@2015: ! ! cg@2015: cg@2015: !InternationalLanguageTranslationEditor::AccessCollectingPseudoResourcePack methodsFor:'accessing'! cg@2015: cg@2015: realResourcePack:something cg@2015: realResourcePack := something. cg@2015: ! ! cg@2015: cg@2015: !InternationalLanguageTranslationEditor::KeyStringsToLanguageMappings class methodsFor:'instance creation'! cg@2015: cg@2015: new cg@2015: ^ self basicNew initialize cg@2015: ! ! cg@2015: cg@2015: !InternationalLanguageTranslationEditor::KeyStringsToLanguageMappings methodsFor:'accessing'! cg@2015: cg@2015: addKey:aKey cg@2410: self addKey:aKey sendChange:true cg@2410: ! cg@2410: cg@2410: addKey:aKey sendChange:aBoolean cg@2031: (keys includes:aKey) ifFalse:[ cg@2031: keys add:aKey. cg@2410: aBoolean ifTrue:[ self changed ]. cg@2031: ] cg@2015: ! cg@2015: cg@2015: addKeys:aCollectionOfKey cg@2015: keys addAll:aCollectionOfKey. cg@2015: self changed. cg@2015: ! cg@2015: cg@2015: addLanguage:lang cg@2031: (languages includes:lang) ifFalse:[ cg@2031: languages add:lang. fm@2051: perLanguageMappings at:lang put:(OrderedDictionary new). cg@2031: ] cg@2015: ! cg@2015: cg@2015: at:aKey language:language cg@2032: ^ (perLanguageMappings at:language) at:aKey ifAbsent:nil cg@2015: ! cg@2015: cg@2015: at:aKey language:language put:value cg@2015: self addKey:aKey. fm@2049: (perLanguageMappings at:language) at:aKey put:value. fm@2049: (self rowForKey:aKey) changed cg@2015: ! cg@2015: cg@2410: at:aKey language:language put:value sendChange:sendChange cg@2410: self addKey:aKey sendChange:sendChange. cg@2410: (perLanguageMappings at:language) at:aKey put:value. cg@2410: (self rowForKey:aKey) changed cg@2410: ! cg@2410: fm@2050: atLanguage: lang putEncoder: aDecoder fm@2050: fm@2050: ^(self languageInfoAt: lang) at: self encoderKey put: aDecoder fm@2050: ! fm@2050: fm@2050: atLanguage: lang putFilename: aFilename fm@2050: fm@2050: ^(self languageInfoAt: lang) at: self fileNameKey put: aFilename fm@2050: ! fm@2050: fm@2050: decoderKey fm@2050: ^#decoder fm@2050: ! fm@2050: fm@2050: encoderAt:lang fm@2050: ^ (self languageInfoAt:lang) at: self encoderKey ifAbsent:[nil] fm@2050: ! fm@2050: fm@2050: encoderKey fm@2050: ^#encoder fm@2050: ! fm@2050: fm@2050: fileNameKey fm@2050: ^ #filename fm@2050: ! fm@2050: fm@2050: filenameAt:lang fm@2050: ^ (self languageInfoAt:lang) at: self fileNameKey ifAbsent:[nil] fm@2050: ! fm@2050: cg@2015: keyAt:index fm@2051: ^ keys at:index ifAbsent:[nil]. cg@2015: ! cg@2015: cg@2015: keyAt:index ifAbsent:exceptionalValue cg@2015: ^ keys at:index ifAbsent:exceptionalValue. cg@2015: ! cg@2015: cg@2015: keys cg@2015: ^ keys cg@2015: ! cg@2015: fm@2050: languageInfoAt: lang fm@2050: fm@2050: ^self perLanguageInfo at: lang ifAbsentPut:[Dictionary new] fm@2050: ! fm@2050: cg@2015: languages cg@2015: ^ languages cg@2015: ! cg@2015: fm@2053: languagesInUse fm@2053: "Returns a collection of symbols for the languages that have mappings" fm@2053: fm@2053: ^self languages select:[:each | (self atLanguage: each) notEmpty] fm@2053: ! fm@2053: fm@2051: orderedLanguageMappingsAssociationsFor: language fm@2051: "Returns a collection of languageMappings associations (alphabetically ordered by keys) " fm@2051: ^(self atLanguage: language) associations asSortedCollection:[:a :b | a key < b key]. fm@2051: ! fm@2051: fm@2050: perLanguageInfo fm@2050: ^ perLanguageInfo fm@2050: ! fm@2050: fm@2050: perLanguageInfo:something fm@2050: perLanguageInfo := something. fm@2050: ! fm@2050: cg@2015: removeKey:aKey cg@2015: keys remove:aKey ifAbsent:[]. cg@2032: perLanguageMappings do:[:eachMapping | cg@2015: eachMapping removeKey:aKey ifAbsent:[]. cg@2015: ]. cg@2015: self changed. cg@2015: ! cg@2015: fm@2049: rowForKey:aKey fm@2049: ^ rowPerKey fm@2049: at:aKey fm@2049: ifAbsentPut:[InternationalLanguageTranslationEditor::LanguageMappingRow new fm@2049: key:aKey; mappings:self]. fm@2049: ! fm@2049: cg@2015: size cg@2015: ^ keys size cg@2015: ! ! cg@2015: cg@2015: !InternationalLanguageTranslationEditor::KeyStringsToLanguageMappings methodsFor:'enumerating'! cg@2015: cg@2015: do:aBlock cg@2015: keys do:[:eachKey | fm@2049: aBlock value:(self rowForKey:eachKey). cg@2015: ]. cg@2015: ! ! cg@2015: cg@2015: !InternationalLanguageTranslationEditor::KeyStringsToLanguageMappings methodsFor:'initialization'! cg@2015: cg@2015: initialize cg@2015: super initialize. cg@2015: cg@2015: keys := OrderedSet new. cg@2015: languages := OrderedCollection new. cg@2032: perLanguageMappings := Dictionary new. fm@2050: perLanguageInfo := Dictionary new. fm@2049: rowPerKey := Dictionary new. cg@2015: cg@2031: self addLanguage:#'de'. cg@2031: self addLanguage:#'fr'. cg@2031: self addLanguage:#'es'. cg@2031: self addLanguage:(Smalltalk language). cg@2031: cg@2031: "/ self initializeDemoMappings. cg@2031: ! cg@2031: cg@2031: initializeDemoMappings cg@2015: keys add:'open'. cg@2015: keys add:'close'. cg@2015: keys add:'yes'. cg@2015: keys add:'no'. cg@2015: cg@2015: self addLanguage:#'de'. cg@2015: self addLanguage:#'fr'. cg@2015: cg@2015: self at:'open' language:#'de' put:'öffnen'. cg@2015: self at:'close' language:#'de' put:'schliessen'. cg@2015: self at:'yes' language:#'de' put:'ja'. cg@2015: self at:'no' language:#'de' put:'nein'. cg@2015: self at:'cancel' language:#'de' put:'abbrechen'. cg@2015: cg@2015: self at:'open' language:#'fr' put:'ouvrir'. cg@2015: self at:'close' language:#'fr' put:'fermer'. cg@2015: self at:'yes' language:#'fr' put:'oui'. cg@2015: self at:'no' language:#'fr' put:'non'. cg@2015: ! ! cg@2015: cg@2015: !InternationalLanguageTranslationEditor::KeyStringsToLanguageMappings methodsFor:'private'! cg@2015: cg@2015: atLanguage:lang cg@2032: ^ perLanguageMappings at:lang cg@2015: ! cg@2015: cg@2015: atLanguageIndex:idx cg@2015: |lang| cg@2015: cg@2015: lang := languages at:idx. cg@2015: ^ self atLanguage:lang. cg@2032: ! cg@2032: cg@2032: mappingAtLanguage:lang cg@2032: ^ perLanguageMappings at:lang cg@2032: ! cg@2032: cg@2032: mappingAtLanguageIndex:idx cg@2032: |lang| cg@2032: cg@2032: lang := languages at:idx. cg@2032: ^ self mappingAtLanguage:lang. cg@2015: ! ! cg@2015: cg@2015: !InternationalLanguageTranslationEditor::KeyStringsToLanguageMappings methodsFor:'queries'! cg@2015: cg@2015: includesKey:aKey cg@2015: ^ keys includes:aKey cg@2015: ! cg@2015: cg@2015: includesLanguage:lang cg@2015: ^ languages includes:lang cg@2015: ! cg@2015: cg@2015: indexOfKey:aKey cg@2015: ^ keys indexOf:aKey fm@2050: ! fm@2050: fm@2050: maxKeySizeForLanguage: lang fm@2050: fm@2050: ^(self atLanguage: lang) keys inject: 0 into:[:maxSize :each | fm@2051: (maxSize < each size and:[each size < 100]) fm@2050: ifTrue:[each size] fm@2050: ifFalse:[maxSize].]. fm@2051: ! fm@2051: fm@2051: searchForSimilarTranslation: aKey in: language fm@2327: "Returns a collection of translation associations that corresponds to a quite similar key comparing with aKey" fm@2327: fm@2327: |similarAssociations| fm@2327: fm@2327: similarAssociations:= fm@2327: (self mappingAtLanguage: language) associationsSelect:[:each | fm@2327: ((each key sameAs: aKey) fm@2327: or:[(aKey asUppercase startsWith: each key asUppercase) fm@2327: or:[((each key asUppercase levenshteinTo: aKey asUppercase)/ each key size) < 0.3 fm@2327: ]]) fm@2327: and:[each value notNil fm@2327: and:[each value notEmpty]] fm@2327: ]. fm@2327: ^similarAssociations cg@2015: ! ! cg@2015: cg@2015: !InternationalLanguageTranslationEditor::LanguageMappingRow methodsFor:'accessing'! cg@2015: cg@2015: atLanguage:language cg@2032: |translation| cg@2032: cg@2032: translation := (mappings mappingAtLanguage:language) at:key ifAbsent:nil. cg@2032: ^ translation isNil ifTrue:nil ifFalse:[translation printString] cg@2015: ! cg@2015: cg@2015: columnAt:columnNr cg@2032: ^ (mappings mappingAtLanguageIndex:columnNr-1) at: key ifAbsent:nil cg@2015: ! cg@2015: cg@2015: key:something cg@2015: key := something. cg@2015: ! cg@2015: cg@2015: keyString cg@2032: ^ key printString cg@2015: ! cg@2015: cg@2015: mappings:something cg@2015: mappings := something. cg@2015: ! ! cg@2015: cg@2015: !InternationalLanguageTranslationEditor::UISpecVisitor methodsFor:'accessing'! cg@2015: cg@2015: translatedLabels cg@2015: ^ translatedLabels ? #() cg@2015: ! ! cg@2015: cg@2015: !InternationalLanguageTranslationEditor::UISpecVisitor methodsFor:'visiting'! cg@2015: cg@2015: visitObject:anObject with:aParameter cg@2033: |l| cg@2033: cg@2015: (anObject isKindOf:UISpecification) ifTrue:[ cg@2015: (anObject respondsTo:#translateLabel) ifTrue:[ cg@2015: anObject translateLabel == true ifTrue:[ cg@2015: translatedLabels isNil ifTrue:[ cg@2015: translatedLabels := Set new. cg@2015: ]. cg@2033: l := anObject perform:#label ifNotUnderstood:nil. cg@2033: l notNil ifTrue:[ cg@2033: translatedLabels add:l. cg@2033: ]. cg@2015: ]. cg@2015: ]. cg@2015: ]. cg@2015: self visitChildrenOf:anObject. cg@2015: ! ! cg@2015: cg@2015: !InternationalLanguageTranslationEditor class methodsFor:'documentation'! cg@2015: cg@2015: version cg@2015: ^ '$Header$' cg@2015: ! !