Tools__InternationalLanguageTranslationEditor.st
changeset 3245 ff9a2e01e0a5
parent 3189 4f828e688bf5
child 3246 034fe0de47bd
equal deleted inserted replaced
3244:6b83ffb461b5 3245:ff9a2e01e0a5
   296      Tools::InternationalLanguageTranslationEditor open
   296      Tools::InternationalLanguageTranslationEditor open
   297     "
   297     "
   298 
   298 
   299     <resource: #canvas>
   299     <resource: #canvas>
   300 
   300 
   301     ^
   301     ^ 
   302      #(FullSpec
   302     #(FullSpec
   303 	name: windowSpec
   303        name: windowSpec
   304 	window:
   304        window: 
   305        (WindowSpec
   305       (WindowSpec
   306 	  label: 'InternationalLanguageTranslationEditor'
   306          label: 'InternationalLanguageTranslationEditor'
   307 	  name: 'InternationalLanguageTranslationEditor'
   307          name: 'InternationalLanguageTranslationEditor'
   308 	  min: (Point 10 10)
   308          min: (Point 10 10)
   309 	  bounds: (Rectangle 0 0 774 610)
   309          bounds: (Rectangle 0 0 774 610)
   310 	  menu: mainMenu
   310          menu: mainMenu
   311 	)
   311        )
   312 	component:
   312        component: 
   313        (SpecCollection
   313       (SpecCollection
   314 	  collection: (
   314          collection: (
   315 	   (MenuPanelSpec
   315           (MenuPanelSpec
   316 	      name: 'ToolBar'
   316              name: 'ToolBar'
   317 	      layout: (LayoutFrame 0 0 0 0 0 1 30 0)
   317              layout: (LayoutFrame 0 0 0 0 0 1 30 0)
   318 	      menu: menuToolBar
   318              menu: menuToolBar
   319 	      textDefault: true
   319              textDefault: true
   320 	    )
   320            )
   321 	   (VariableVerticalPanelSpec
   321           (VariableVerticalPanelSpec
   322 	      name: 'TranslationsVariableVerticalPanel'
   322              name: 'TranslationsVariableVerticalPanel'
   323 	      layout: (LayoutFrame 0 0 30 0 0 1 -32 1)
   323              layout: (LayoutFrame 0 0 30 0 0 1 -32 1)
   324 	      component:
   324              component: 
   325 	     (SpecCollection
   325             (SpecCollection
   326 		collection: (
   326                collection: (
   327 		 (DataSetSpec
   327                 (DataSetSpec
   328 		    name: 'KeyStringAndLanguageSelectionTable'
   328                    name: 'KeyStringAndLanguageSelectionTable'
   329 		    model: selectedKeyRow
   329                    model: selectedKeyRow
   330 		    menu: keyStringAndLanguageSelectionTableMenu
   330                    menu: keyStringAndLanguageSelectionTableMenu
   331 		    hasHorizontalScrollBar: true
   331                    hasHorizontalScrollBar: true
   332 		    hasVerticalScrollBar: true
   332                    hasVerticalScrollBar: true
   333 		    dataList: keyStringAndLanguageSelectionTable
   333                    dataList: keyStringAndLanguageSelectionTable
   334 		    columnHolder: keyStringAndLanguageSelectionTableColumnDescriptionHolder
   334                    columnHolder: keyStringAndLanguageSelectionTableColumnDescriptionHolder
   335 		    beDependentOfRows: true
   335                    beDependentOfRows: true
   336 		    columnAdaptor: yourself
   336                    columnAdaptor: yourself
   337 		    postBuildCallback: postBuildDataSet:
   337                    postBuildCallback: postBuildDataSet:
   338 		  )
   338                  )
   339 		 (VariableVerticalPanelSpec
   339                 (VariableVerticalPanelSpec
   340 		    name: 'VariableVerticalPanel1'
   340                    name: 'VariableVerticalPanel1'
   341 		    component:
   341                    component: 
   342 		   (SpecCollection
   342                   (SpecCollection
   343 		      collection: (
   343                      collection: (
   344 		       (ViewSpec
   344                       (ViewSpec
   345 			  name: 'Box1'
   345                          name: 'Box1'
   346 			  component:
   346                          component: 
   347 			 (SpecCollection
   347                         (SpecCollection
   348 			    collection: (
   348                            collection: (
   349 			     (LabelSpec
   349                             (LabelSpec
   350 				label: 'Original String (Key):'
   350                                label: 'Original String (Key):'
   351 				name: 'Label2'
   351                                name: 'Label2'
   352 				layout: (LayoutFrame 0 0 -2 0 0 1 28 0)
   352                                layout: (LayoutFrame 0 0 -2 0 0 1 28 0)
   353 				translateLabel: true
   353                                translateLabel: true
   354 				adjust: left
   354                                adjust: left
   355 			      )
   355                              )
   356 			     (TextEditorSpec
   356                             (TextEditorSpec
   357 				name: 'OriginalText'
   357                                name: 'OriginalText'
   358 				layout: (LayoutFrame 0 0 27 0 0 1 -2 1)
   358                                layout: (LayoutFrame 0 0 27 0 0 1 -2 1)
   359 				model: originalTextHolder
   359                                model: originalTextHolder
   360 				hasHorizontalScrollBar: true
   360                                hasHorizontalScrollBar: true
   361 				hasVerticalScrollBar: true
   361                                hasVerticalScrollBar: true
   362 				modifiedChannel: originalTextModifiedHolder
   362                                modifiedChannel: originalTextModifiedHolder
   363 				acceptCallBack: languageTextAccepted
   363                                acceptCallBack: languageTextAccepted
   364 			      )
   364                                hasKeyboardFocusInitially: false
   365 			     )
   365                              )
   366 
   366                             )
   367 			  )
   367                           
   368 			)
   368                          )
   369 		       (ViewSpec
   369                        )
   370 			  name: 'Box3'
   370                       (ViewSpec
   371 			  component:
   371                          name: 'Box3'
   372 			 (SpecCollection
   372                          component: 
   373 			    collection: (
   373                         (SpecCollection
   374 			     (LabelSpec
   374                            collection: (
   375 				label: 'Select Another Language as example:'
   375                             (LabelSpec
   376 				name: 'Label3'
   376                                label: 'Select Another Language as example:'
   377 				layout: (LayoutFrame 0 0 -6 0 0 1 24 0)
   377                                name: 'Label3'
   378 				translateLabel: true
   378                                layout: (LayoutFrame 0 0 -6 0 0 1 24 0)
   379 				adjust: left
   379                                translateLabel: true
   380 			      )
   380                                adjust: left
   381 			     (ComboBoxSpec
   381                              )
   382 				name: 'ComboBox1'
   382                             (ComboBoxSpec
   383 				layout: (LayoutFrame 197 0 -2 0 322 0 18 0)
   383                                name: 'ComboBox1'
   384 				model: exampleLanguageSelectionHolder
   384                                layout: (LayoutFrame 281 0 -2 0 406 0 18 0)
   385 				immediateAccept: false
   385                                model: exampleLanguageSelectionHolder
   386 				acceptOnLeave: true
   386                                immediateAccept: false
   387 				acceptOnLostFocus: true
   387                                acceptOnLeave: true
   388 				acceptOnPointerLeave: false
   388                                acceptOnLostFocus: true
   389 				comboList: shownLanguages
   389                                acceptOnPointerLeave: false
   390 				useIndex: false
   390                                comboList: shownLanguages
   391 			      )
   391                                useIndex: false
   392 			     (TextEditorSpec
   392                              )
   393 				name: 'ExampleLanguageText'
   393                             (TextEditorSpec
   394 				layout: (LayoutFrame 0 0 30 0 0 1 0 1)
   394                                name: 'ExampleLanguageText'
   395 				model: exampleLanguageTextHolder
   395                                layout: (LayoutFrame 0 0 30 0 0 1 0 1)
   396 				hasHorizontalScrollBar: true
   396                                model: exampleLanguageTextHolder
   397 				hasVerticalScrollBar: true
   397                                hasHorizontalScrollBar: true
   398 				isReadOnly: true
   398                                hasVerticalScrollBar: true
   399 			      )
   399                                isReadOnly: true
   400 			     )
   400                                hasKeyboardFocusInitially: false
   401 
   401                              )
   402 			  )
   402                             )
   403 			)
   403                           
   404 		       (ViewSpec
   404                          )
   405 			  name: 'Box2'
   405                        )
   406 			  component:
   406                       (ViewSpec
   407 			 (SpecCollection
   407                          name: 'Box2'
   408 			    collection: (
   408                          component: 
   409 			     (LabelSpec
   409                         (SpecCollection
   410 				label: 'Translated String:'
   410                            collection: (
   411 				name: 'Label1'
   411                             (LabelSpec
   412 				layout: (LayoutFrame 0 0 0 0 0 1 30 0)
   412                                label: 'Translated String:'
   413 				translateLabel: true
   413                                name: 'Label1'
   414 				adjust: left
   414                                layout: (LayoutFrame 0 0 0 0 0 1 30 0)
   415 			      )
   415                                translateLabel: true
   416 			     (TextEditorSpec
   416                                adjust: left
   417 				name: 'LanguageText'
   417                              )
   418 				layout: (LayoutFrame 0 0 30 0 0 1 0 1)
   418                             (TextEditorSpec
   419 				model: languageTextHolder
   419                                name: 'LanguageText'
   420 				hasHorizontalScrollBar: true
   420                                layout: (LayoutFrame 0 0 30 0 0 1 0 1)
   421 				hasVerticalScrollBar: true
   421                                model: languageTextHolder
   422 				acceptChannel: languageTextAcceptHolder
   422                                hasHorizontalScrollBar: true
   423 				modifiedChannel: languageTextModifiedHolder
   423                                hasVerticalScrollBar: true
   424 				acceptCallBack: languageTextAccepted
   424                                acceptChannel: languageTextAcceptHolder
   425 				postBuildCallback: languageEditorBuilt:
   425                                modifiedChannel: languageTextModifiedHolder
   426 			      )
   426                                acceptCallBack: languageTextAccepted
   427 			     (ActionButtonSpec
   427                                hasKeyboardFocusInitially: false
   428 				label: 'Paste Previous'
   428                                postBuildCallback: languageEditorBuilt:
   429 				name: 'pastePreviousTranslation'
   429                              )
   430 				layout: (LayoutOrigin 0 0.83085250338295 0 0.03448275862069)
   430                             (ActionButtonSpec
   431 				translateLabel: true
   431                                label: 'Paste Previous'
   432 				model: pastePreviousTranslationInLanguageText
   432                                name: 'pastePreviousTranslation'
   433 				enableChannel: pastePreviousTranslationEnableHolder
   433                                layout: (LayoutOrigin 0 0.83085250338295003 0 0.034482758620689995)
   434 				disabledLogo: 'Paste Previous'
   434                                translateLabel: true
   435 			      )
   435                                model: pastePreviousTranslationInLanguageText
   436 			     (ActionButtonSpec
   436                                enableChannel: pastePreviousTranslationEnableHolder
   437 				label: 'Paste Original'
   437                                disabledLogo: 'Paste Previous'
   438 				name: 'Button1'
   438                              )
   439 				layout: (LayoutOrigin -95 0.83085250338295 0 0.03448275862069)
   439                             (ActionButtonSpec
   440 				translateLabel: true
   440                                label: 'Paste Original'
   441 				model: pasteOriginalInLanguageText
   441                                name: 'Button1'
   442 				enableChannel: pasteOriginalEnableHolder
   442                                layout: (LayoutOrigin -95 0.83085250338295003 0 0.034482758620689995)
   443 				disabledLogo: 'Paste Original'
   443                                translateLabel: true
   444 			      )
   444                                model: pasteOriginalInLanguageText
   445 			     )
   445                                enableChannel: pasteOriginalEnableHolder
   446 
   446                                disabledLogo: 'Paste Original'
   447 			  )
   447                              )
   448 			)
   448                             )
   449 		       )
   449                           
   450 
   450                          )
   451 		    )
   451                        )
   452 		    handles: (Any 0.33333333333333 0.66666666666667 1.0)
   452                       )
   453 		  )
   453                     
   454 		 )
   454                    )
   455 
   455                    handles: (Any 0.33333333333333004 0.66666666666667007 1.0)
   456 	      )
   456                  )
   457 	      handles: (Any 0.5 1.0)
   457                 )
   458 	      postBuildCallback: postBuildTranslationsPanel:
   458               
   459 	    )
   459              )
   460 	   (ViewSpec
   460              handles: (Any 0.5 1.0)
   461 	      name: 'SearchBox'
   461              postBuildCallback: postBuildTranslationsPanel:
   462 	      layout: (LayoutFrame 0 0 -32 1 0 1 0 1)
   462            )
   463 	      level: -1
   463           (ViewSpec
   464 	      visibilityChannel: searchBoxVisible
   464              name: 'SearchBox'
   465 	      component:
   465              layout: (LayoutFrame 0 0 -32 1 0 1 0 1)
   466 	     (SpecCollection
   466              level: -1
   467 		collection: (
   467              visibilityChannel: searchBoxVisible
   468 		 (ActionButtonSpec
   468              component: 
   469 		    label: 'closeSearchBarIcon'
   469             (SpecCollection
   470 		    name: 'closeSearchBarButton'
   470                collection: (
   471 		    layout: (LayoutFrame 4 0 5 0 25 0 26 0)
   471                 (ActionButtonSpec
   472 		    hasCharacterOrientedLabel: false
   472                    label: 'closeSearchBarIcon'
   473 		    translateLabel: true
   473                    name: 'closeSearchBarButton'
   474 		    model: closeSearchBar
   474                    layout: (LayoutFrame 4 0 5 0 25 0 26 0)
   475 		  )
   475                    hasCharacterOrientedLabel: false
   476 		 (LabelSpec
   476                    translateLabel: true
   477 		    label: 'Search:'
   477                    model: closeSearchBar
   478 		    name: 'SearchLabel'
   478                  )
   479 		    layout: (LayoutFrame 30 0 5 0 81 0 27 0)
   479                 (LabelSpec
   480 		    translateLabel: true
   480                    label: 'Search:'
   481 		    adjust: right
   481                    name: 'SearchLabel'
   482 		  )
   482                    layout: (LayoutFrame 30 0 5 0 81 0 27 0)
   483 		 (InputFieldSpec
   483                    translateLabel: true
   484 		    name: 'SearchEntryField'
   484                    adjust: right
   485 		    layout: (LayoutFrame 87 0 5 0 244 0 27 0)
   485                  )
   486 		    model: searchTextHolder
   486                 (InputFieldSpec
   487 		    immediateAccept: true
   487                    name: 'SearchEntryField'
   488 		    acceptOnReturn: true
   488                    layout: (LayoutFrame 87 0 5 0 244 0 27 0)
   489 		    acceptOnTab: true
   489                    model: searchTextHolder
   490 		    acceptOnLostFocus: true
   490                    immediateAccept: true
   491 		    modifiedChannel: searchTextModifiedHolder
   491                    acceptOnReturn: true
   492 		    acceptOnPointerLeave: false
   492                    acceptOnTab: true
   493 		    postBuildCallback: postBuildSearchTextView:
   493                    acceptOnLostFocus: true
   494 		  )
   494                    modifiedChannel: searchTextModifiedHolder
   495 		 (ActionButtonSpec
   495                    acceptOnPointerLeave: false
   496 		    label: 'searchNextIcon'
   496                    postBuildCallback: postBuildSearchTextView:
   497 		    name: 'SearchNextButton'
   497                  )
   498 		    layout: (LayoutFrame 251 0 5 0 272 0 26 0)
   498                 (ActionButtonSpec
   499 		    hasCharacterOrientedLabel: false
   499                    label: 'searchNextIcon'
   500 		    translateLabel: true
   500                    name: 'SearchNextButton'
   501 		    model: searchNextText
   501                    layout: (LayoutFrame 251 0 5 0 272 0 26 0)
   502 		  )
   502                    hasCharacterOrientedLabel: false
   503 		 (ActionButtonSpec
   503                    translateLabel: true
   504 		    label: 'searchPreviousIcon'
   504                    model: searchNextText
   505 		    name: 'searchPreviousButton'
   505                  )
   506 		    layout: (LayoutFrame 279 0 5 0 300 0 26 0)
   506                 (ActionButtonSpec
   507 		    hasCharacterOrientedLabel: false
   507                    label: 'searchPreviousIcon'
   508 		    translateLabel: true
   508                    name: 'searchPreviousButton'
   509 		    model: searchPreviousText
   509                    layout: (LayoutFrame 279 0 5 0 300 0 26 0)
   510 		  )
   510                    hasCharacterOrientedLabel: false
   511 		 (CheckBoxSpec
   511                    translateLabel: true
   512 		    label: 'Ignore case'
   512                    model: searchPreviousText
   513 		    name: 'IgnoreCaseCheckBox'
   513                  )
   514 		    layout: (LayoutFrame 309 0 5 0 505 0 27 0)
   514                 (CheckBoxSpec
   515 		    model: ignoreCaseHolder
   515                    label: 'Ignore case'
   516 		    translateLabel: true
   516                    name: 'IgnoreCaseCheckBox'
   517 		  )
   517                    layout: (LayoutFrame 309 0 5 0 505 0 27 0)
   518 		 (LabelSpec
   518                    model: ignoreCaseHolder
   519 		    label: 'SearchBarImageInfoLabel'
   519                    translateLabel: true
   520 		    name: 'SearchBarImageInfoLabel'
   520                  )
   521 		    layout: (LayoutFrame 511 0 5 0 535 0 27 0)
   521                 (LabelSpec
   522 		    hasCharacterOrientedLabel: false
   522                    label: 'SearchBarImageInfoLabel'
   523 		    translateLabel: true
   523                    name: 'SearchBarImageInfoLabel'
   524 		    labelChannel: searchBarImageInfoLabelHolder
   524                    layout: (LayoutFrame 511 0 5 0 535 0 27 0)
   525 		  )
   525                    hasCharacterOrientedLabel: false
   526 		 (LabelSpec
   526                    translateLabel: true
   527 		    label: 'SearchBarInfoLabel'
   527                    labelChannel: searchBarImageInfoLabelHolder
   528 		    name: 'SearchBarInfoLabel'
   528                  )
   529 		    layout: (LayoutFrame 538 0 5 0 816 0 27 0)
   529                 (LabelSpec
   530 		    translateLabel: true
   530                    label: 'SearchBarInfoLabel'
   531 		    labelChannel: searchBarInfoLabelHolder
   531                    name: 'SearchBarInfoLabel'
   532 		    adjust: left
   532                    layout: (LayoutFrame 538 0 5 0 816 0 27 0)
   533 		  )
   533                    translateLabel: true
   534 		 )
   534                    labelChannel: searchBarInfoLabelHolder
   535 
   535                    adjust: left
   536 	      )
   536                  )
   537 	      postBuildCallback: postBuildSearchBoxView:
   537                 )
   538 	    )
   538               
   539 	   )
   539              )
   540 
   540              postBuildCallback: postBuildSearchBoxView:
   541 	)
   541            )
   542       )
   542           )
       
   543         
       
   544        )
       
   545      )
   543 ! !
   546 ! !
   544 
   547 
   545 !InternationalLanguageTranslationEditor class methodsFor:'menu specs'!
   548 !InternationalLanguageTranslationEditor class methodsFor:'menu specs'!
   546 
   549 
   547 keyStringAndLanguageSelectionTableMenu
   550 keyStringAndLanguageSelectionTableMenu
  1032     "Created: / 19-06-2007 / 16:39:44 / Administrador"
  1035     "Created: / 19-06-2007 / 16:39:44 / Administrador"
  1033 !
  1036 !
  1034 
  1037 
  1035 newLanguageText
  1038 newLanguageText
  1036 "/   languageEditor accept
  1039 "/   languageEditor accept
  1037     ^self languageTextHolder value isNil
  1040     ^self languageTextHolder value isEmptyOrNil
  1038 	ifTrue:['']
  1041         ifTrue:['']
  1039 	ifFalse:[self languageTextHolder value asCollectionOfLines first.]
  1042         ifFalse:[self languageTextHolder value asCollectionOfLines first.]
  1040 !
  1043 !
  1041 
  1044 
  1042 objectsList
  1045 objectsList
  1043 
  1046 
  1044     ^ keyStringsToLanguageMappings
  1047     ^ keyStringsToLanguageMappings
  1399 
  1402 
  1400 updateOriginalTextModification
  1403 updateOriginalTextModification
  1401 
  1404 
  1402     |answer|
  1405     |answer|
  1403 
  1406 
  1404 	self originalTextModifiedHolder value ifTrue:[
  1407         self originalTextModifiedHolder value ifTrue:[
  1405 	    answer := OptionBox
  1408             answer := OptionBox
  1406 			  request:'Accept changed original text (key) ?'
  1409                           request:'Accept changed original text (key) ?'
  1407 			  label:'Original text (key) changed'
  1410                           label:'Original text (key) changed'
  1408 			  image:(WarningBox iconBitmap)
  1411                           image:(WarningBox iconBitmap)
  1409 			  buttonLabels:#('Cancel' 'Accept' 'Accept As New')
  1412                           buttonLabels:#('Cancel' 'Accept' 'Accept As New')
  1410 			  values:#(nil #accept #acceptAsNew)
  1413                           values:#(nil #accept #acceptAsNew)
  1411 			  default:#acceptAsNew.
  1414                           default:#acceptAsNew.
  1412 
  1415 
  1413 	    answer isNil ifTrue:[^ self originalTextModifiedHolder value:false. ].
  1416             answer isNil ifTrue:[^ self originalTextModifiedHolder value:false. ].
  1414 	    answer == #accept ifTrue:[
  1417             answer == #accept ifTrue:[
  1415     self halt.        ].
  1418     self shouldImplement.        ].
  1416 	    answer == #acceptAsNew ifTrue:[
  1419             answer == #acceptAsNew ifTrue:[
  1417     self halt.        ].
  1420     self shouldImplement.        ].
  1418 	].
  1421         ].
  1419 !
  1422 !
  1420 
  1423 
  1421 updatePasteOriginalButtonEnabled
  1424 updatePasteOriginalButtonEnabled
  1422 
  1425 
  1423      self pasteOriginalEnableHolder value: self shouldPasteOriginalButtonBeEnabled
  1426      self pasteOriginalEnableHolder value: self shouldPasteOriginalButtonBeEnabled
  2112 !InternationalLanguageTranslationEditor methodsFor:'private-key extraction'!
  2115 !InternationalLanguageTranslationEditor methodsFor:'private-key extraction'!
  2113 
  2116 
  2114 addAllTranslations:newTranslations
  2117 addAllTranslations:newTranslations
  2115     |newTranslationKeys stringKeys nonStringKeys|
  2118     |newTranslationKeys stringKeys nonStringKeys|
  2116 
  2119 
  2117     newTranslationKeys := newTranslations select:[:k | k notEmpty and:[k isString not or:[k isBlank not]]].
  2120     newTranslationKeys := newTranslations select:[:k | k notEmptyOrNil and:[k isString not or:[k isBlank not]]].
  2118     newTranslationKeys := newTranslationKeys select:[:k | (keyStringsToLanguageMappings includesKey:k) not].
  2121     newTranslationKeys := newTranslationKeys select:[:k | (keyStringsToLanguageMappings includesKey:k) not].
  2119     newTranslationKeys := newTranslationKeys
  2122     newTranslationKeys := newTranslationKeys
  2120                                 collect:[:k |
  2123                                 collect:[:k |
  2121                                         (k endsWith:'...') ifTrue:[
  2124                                         (k endsWith:'...') ifTrue:[
  2122                                             k copyButLast:3.
  2125                                             k copyButLast:3.
  2157 
  2160 
  2158 extractTranslationsFromHelpSpecMethod:aMethod
  2161 extractTranslationsFromHelpSpecMethod:aMethod
  2159     |codeStrings matcher parseTree resourceKeys|
  2162     |codeStrings matcher parseTree resourceKeys|
  2160 
  2163 
  2161     parseTree := RBParser
  2164     parseTree := RBParser
  2162 	    parseMethod:aMethod source
  2165             parseMethod:aMethod source
  2163 	    onError: [:str :pos | Transcript showCR:str. Transcript showCR:pos.
  2166             onError: [:str :pos | Transcript showCR:str. Transcript showCR:pos.
  2164 				  nil].
  2167                                   nil].
  2165     parseTree isNil ifTrue:[^ #() ].
  2168     parseTree isNil ifTrue:[^ #() ].
  2166 
  2169 
  2167     codeStrings  :=
  2170     codeStrings  :=
  2168 	#(
  2171         #(
  2169 		'`@dict addPairsFrom: `#helpKeysAndStrings'
  2172                 '`@dict addPairsFrom: `#helpKeysAndStrings'
  2170 	).
  2173         ).
  2171 
  2174 
  2172     resourceKeys := Set new.
  2175     resourceKeys := Set new.
  2173 
  2176 
  2174     matcher := ParseTreeSearcher new.
  2177     matcher := ParseTreeSearcher new.
  2175     matcher
  2178     matcher
  2176 	matchesAnyOf: codeStrings
  2179         matchesAnyOf: codeStrings
  2177 	do: [:aNode :answer |
  2180         do: [:aNode :answer |
  2178 		|sel argNode arg|
  2181                 |sel argNode arg|
  2179 
  2182 
  2180 		sel := aNode selector.
  2183                 sel := aNode selector.
  2181 		(sel startsWith:'addPairsFrom:') ifTrue:[
  2184                 (sel startsWith:'addPairsFrom:') ifTrue:[
  2182 		    argNode := aNode arguments at:1.
  2185                     argNode := aNode arguments at:1.
  2183 		    argNode isLiteral ifTrue:[
  2186                     argNode isLiteral ifTrue:[
  2184 			arg := argNode value.
  2187                         arg := argNode value.
  2185 			arg isArray ifTrue:[
  2188                         arg isArray ifTrue:[
  2186 			    arg doWithIndex:[:el :index |
  2189                             arg doWithIndex:[:el :index |
  2187 				index even ifTrue:[
  2190                                 index even ifTrue:[
  2188 				    el isString ifTrue:[
  2191                                     el isString ifTrue:[
  2189 					resourceKeys add:el.
  2192                                         resourceKeys add:el.
  2190 				    ]
  2193                                     ]
  2191 				].
  2194                                 ].
  2192 			    ].
  2195                             ].
  2193 			] ifFalse:[
  2196                         ] ifFalse:[
  2194 			    Transcript
  2197                             Transcript
  2195 				showCR:(resources
  2198                                 showCR:(resources
  2196 					string:'Cannot derive resourceKey from non-array in %1 in %2'
  2199                                         string:'Cannot derive resourceKey from non-array in %1 in %2'
  2197 					with:argNode formattedCode
  2200                                         with:argNode formattedCode
  2198 					with:aMethod selector).
  2201                                         with:aMethod selector).
  2199 			].
  2202                         ].
  2200 		    ] ifFalse:[
  2203                     ] ifFalse:[
  2201 			Transcript
  2204                         Transcript halt
  2202 			    showCR:(resources
  2205                             showCR:(resources
  2203 					string:'Cannot derive resourceKey from non-literal: %1 in %2'
  2206                                         string:'Cannot derive resourceKey from non-literal: %1 in %2'
  2204 					with:argNode formattedCode
  2207                                         with:argNode formattedCode
  2205 					with:aMethod selector).
  2208                                         with:aMethod selector).
  2206 		    ].
  2209                     ].
  2207 		].
  2210                 ].
  2208 		aNode
  2211                 aNode
  2209 	    ].
  2212             ].
  2210 
  2213 
  2211     matcher executeTree: parseTree initialAnswer: nil.
  2214     matcher executeTree: parseTree initialAnswer: nil.
  2212     ^ resourceKeys
  2215     ^ resourceKeys
  2213 !
  2216 !
  2214 
  2217 
  2270         #(
  2273         #(
  2271                 'resources `@msg: `@args'
  2274                 'resources `@msg: `@args'
  2272                 'self resources `@msg: `@args'
  2275                 'self resources `@msg: `@args'
  2273                 'self class resources `@msg: `@args'
  2276                 'self class resources `@msg: `@args'
  2274                 'self classResources `@msg: `@args'
  2277                 'self classResources `@msg: `@args'
       
  2278                 '`V classResources `@msg: `@args'
  2275         ).
  2279         ).
  2276 
  2280 
  2277     resourceKeys := Set new.
  2281     resourceKeys := Set new.
  2278 
  2282 
  2279     matcher := ParseTreeSearcher new.
  2283     matcher := ParseTreeSearcher new.
  2292                         ] ifFalse:[
  2296                         ] ifFalse:[
  2293                             Transcript
  2297                             Transcript
  2294                                 showCR:(resources
  2298                                 showCR:(resources
  2295                                         string:'Cannot derive resourceKey from non-string: %1 in %2'
  2299                                         string:'Cannot derive resourceKey from non-string: %1 in %2'
  2296                                         with:keyStringArgNode formattedCode
  2300                                         with:keyStringArgNode formattedCode
  2297                                         with:aMethod selector).
  2301                                         with:aMethod whoString).
  2298                         ].
  2302                         ].
  2299                     ] ifFalse:[
  2303                     ] ifFalse:[
  2300                         Transcript
  2304                         Transcript
  2301                             showCR:(resources
  2305                             showCR:(resources 
  2302                                         string:'Cannot derive resourceKey from non-literal: %1 in %2'
  2306                                         string:'Cannot derive resourceKey from non-literal: %1 in %2'
  2303                                         with:keyStringArgNode formattedCode
  2307                                         with:keyStringArgNode formattedCode
  2304                                         with:aMethod selector).
  2308                                         with:aMethod whoString).
  2305                     ].
  2309                     ].
  2306                 ].
  2310                 ].
  2307                 aNode
  2311                 aNode
  2308             ].
  2312             ].
  2309 
  2313 
  2491     orderedAssociations := keyStringsToLanguageMappings orderedLanguageMappingsAssociationsFor: lang.
  2495     orderedAssociations := keyStringsToLanguageMappings orderedLanguageMappingsAssociationsFor: lang.
  2492 
  2496 
  2493     maxKeySize := keyStringsToLanguageMappings maxKeySizeForLanguage: lang.
  2497     maxKeySize := keyStringsToLanguageMappings maxKeySizeForLanguage: lang.
  2494 
  2498 
  2495     orderedAssociations do:[:association |
  2499     orderedAssociations do:[:association |
  2496 	aStream nextPutAll: (association key storeString paddedTo: maxKeySize) ;
  2500         "use #basicStoreString to avoid implicit utf8Encoding for UnicodeStrings"
  2497 	    nextPutAll: (String new: 10);
  2501         aStream nextPutAll: ((characterEncoder encodeString:association key basicStoreString) paddedTo: maxKeySize) ;
  2498 	    nextPutAll: (characterEncoder encodeString: association value) storeString;
  2502             tab;
  2499 	    cr.
  2503             nextPutAll: (characterEncoder encodeString: association value basicStoreString);
  2500 	].
  2504             cr.
       
  2505         ].
  2501 !
  2506 !
  2502 
  2507 
  2503 readResourceFile:aFilename asLanguage:lang
  2508 readResourceFile:aFilename asLanguage:lang
  2504     |resourcePack inStream lineString encoding decoder sortedKeys remainingKeys|
  2509     |resourcePack inStream lineString encoding decoder sortedKeys remainingKeys|
  2505 
  2510 
  2506     aFilename exists ifFalse:[
  2511     aFilename exists ifFalse:[
  2507 	Dialog information:(resources string:'Language file: "%1" does not exist' with:aFilename baseName).
  2512         Dialog information:(resources string:'Language file: "%1" does not exist' with:aFilename baseName).
  2508 	^ self
  2513         ^ self
  2509     ].
  2514     ].
  2510 
  2515 
  2511     resourcePack := ResourcePack new.
  2516     resourcePack := ResourcePack new.
  2512 
  2517 
  2513     inStream := aFilename readStream.
  2518     inStream := aFilename readStream.
  2514     [inStream atEnd] whileFalse:[
  2519     [inStream atEnd] whileFalse:[
  2515 	lineString := inStream nextLine.
  2520         lineString := inStream nextLine.
  2516 	(lineString notEmpty
  2521         (lineString notEmpty
  2517 	and:[ (lineString startsWith:';') not ]) ifTrue:[
  2522         and:[ (lineString startsWith:';') not and:[ (lineString startsWith:'"/') not]]) ifTrue:[
  2518 	    ((lineString startsWith:'#') and:[(lineString startsWith:'#(') not]) ifTrue:[
  2523             ((lineString startsWith:'#') and:[(lineString startsWith:'#(') not]) ifTrue:[
  2519 		lineString := (lineString copyFrom:2) withoutSeparators.
  2524                 lineString := (lineString copyFrom:2) withoutSeparators.
  2520 		(lineString startsWith:'encoding ') ifTrue:[
  2525                 (lineString startsWith:'encoding ') ifTrue:[
  2521 		    encoding := ResourcePack extractEncodingFromLine:lineString.
  2526                     encoding := ResourcePack extractEncodingFromLine:lineString.
  2522 		    decoder := CharacterEncoder encoderFor:encoding ifAbsent:nil.
  2527                     decoder := CharacterEncoder encoderFor:encoding ifAbsent:nil.
  2523 		].
  2528                 ].
  2524 	    ] ifFalse:[
  2529             ] ifFalse:[
  2525 		ResourcePack
  2530                 ResourcePack
  2526 		    processResourceLine:lineString
  2531                     processResourceLine:lineString
  2527 		    encoding:decoder
  2532                     encoding:decoder
  2528 		    file:aFilename pathName
  2533                     file:aFilename pathName
  2529 		    printErrorWith:[:msg | Transcript showCR:msg ]
  2534                     printErrorWith:[:msg | Transcript showCR:msg ]
  2530 		    for:resourcePack
  2535                     for:resourcePack
  2531 		    keepUselessTranslations:true.
  2536                     keepUselessTranslations:true.
  2532 	    ].
  2537             ].
  2533 	].
  2538         ].
  2534     ].
  2539     ].
  2535     inStream close.
  2540     inStream close.
  2536 
  2541 
  2537     sortedKeys := (resourcePack keys select:[:k | k isString]) asSortedCollection.
  2542     sortedKeys := (resourcePack keys select:[:k | k isString]) asSortedCollection.
  2538     remainingKeys := resourcePack keys select:[:k | k isString not].
  2543     remainingKeys := resourcePack keys select:[:k | k isString not].
  2539 
  2544 
  2540     keyStringsToLanguageMappings atLanguage: lang putFilename: aFilename.
  2545     keyStringsToLanguageMappings atLanguage: lang putFilename: aFilename.
  2541     keyStringsToLanguageMappings atLanguage: lang putEncoder: decoder.
  2546     keyStringsToLanguageMappings atLanguage: lang putEncoder: decoder.
  2542 
  2547 
  2543     sortedKeys do:[:k |
  2548     sortedKeys do:[:k |
  2544 	keyStringsToLanguageMappings at:k language:lang put:(resourcePack at:k) sendChange:false
  2549         keyStringsToLanguageMappings at:k language:lang put:(resourcePack at:k) sendChange:false
  2545     ].
  2550     ].
  2546     remainingKeys do:[:k |
  2551     remainingKeys do:[:k |
  2547 	keyStringsToLanguageMappings at:k language:lang put:(resourcePack at:k) sendChange:false
  2552         keyStringsToLanguageMappings at:k language:lang put:(resourcePack at:k) sendChange:false
  2548     ].
  2553     ].
  2549     keyStringsToLanguageMappings changed.
  2554     keyStringsToLanguageMappings changed.
  2550 !
  2555 !
  2551 
  2556 
  2552 saveLanguage: lang
  2557 saveLanguage: lang
  3038 ^self languages select:[:each | (self atLanguage: each) notEmpty]
  3043 ^self languages select:[:each | (self atLanguage: each) notEmpty]
  3039 !
  3044 !
  3040 
  3045 
  3041 orderedLanguageMappingsAssociationsFor: language
  3046 orderedLanguageMappingsAssociationsFor: language
  3042 "Returns a collection of languageMappings associations (alphabetically ordered by keys) "
  3047 "Returns a collection of languageMappings associations (alphabetically ordered by keys) "
  3043 ^(self atLanguage: language) associations asSortedCollection:[:a :b | a key < b key].
  3048     ^(self atLanguage: language) associations 
       
  3049             asSortedCollection:[:a :b | a key isArray or:[b key isArray or:[a key < b key]]].
  3044 !
  3050 !
  3045 
  3051 
  3046 perLanguageInfo
  3052 perLanguageInfo
  3047     ^ perLanguageInfo
  3053     ^ perLanguageInfo
  3048 !
  3054 !
  3171 
  3177 
  3172     |similarAssociations|
  3178     |similarAssociations|
  3173 
  3179 
  3174     similarAssociations:=
  3180     similarAssociations:=
  3175     (self mappingAtLanguage: language) associationsSelect:[:each |
  3181     (self mappingAtLanguage: language) associationsSelect:[:each |
  3176 	((each key sameAs: aKey)
  3182         |eachKey|
  3177 	    or:[(aKey asUppercase startsWith: each key asUppercase)
  3183 
  3178 		or:[((each key asUppercase levenshteinTo: aKey asUppercase)/ each key size) < 0.3
  3184         eachKey := eachKey.
  3179 		]])
  3185         eachKey isString 
  3180 	 and:[each value notNil
  3186         and:[(eachKey sameAs: aKey)
  3181 		and:[each value notEmpty]]
  3187              or:[(aKey asUppercase startsWith: eachKey asUppercase)
       
  3188              or:[((eachKey asUppercase levenshteinTo: aKey asUppercase)/ eachKey size) < 0.3
       
  3189          ]]]
       
  3190          and:[each value notEmptyOrNil]
  3182     ].
  3191     ].
  3183     ^similarAssociations
  3192     ^similarAssociations
  3184 ! !
  3193 ! !
  3185 
  3194 
  3186 !InternationalLanguageTranslationEditor::LanguageMappingRow methodsFor:'accessing'!
  3195 !InternationalLanguageTranslationEditor::LanguageMappingRow methodsFor:'accessing'!