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 |
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 |
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 |