Skip to content

Commit 9f33ce3

Browse files
Support for multiple localized strings
1 parent a02c6d7 commit 9f33ce3

5 files changed

Lines changed: 73 additions & 16 deletions

File tree

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3+
<plist version="1.0">
4+
<dict>
5+
<key>IDEDidComputeMac32BitWarning</key>
6+
<true/>
7+
</dict>
8+
</plist>

LocalizationEditor/AppDelegate.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import Cocoa
1212
@NSApplicationMain
1313
class AppDelegate: NSObject, NSApplicationDelegate {
1414
@IBOutlet weak var openFolderMenuItem: NSMenuItem!
15+
@IBOutlet weak var selectMenuItem: NSMenuItem!
1516

1617
func applicationDidFinishLaunching(_: Notification) {
1718
setupLogging()

LocalizationEditor/Providers/LocalizationsDataSource.swift

Lines changed: 25 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -13,30 +13,45 @@ class LocalizationsDataSource: NSObject, NSTableViewDataSource {
1313

1414
// MARK: - Properties
1515

16-
private var localizationGroup: LocalizationGroup? = nil
16+
private var localizationGroups: [LocalizationGroup] = []
17+
private var selectedLocalizationGroup: LocalizationGroup? = nil
1718
private var localizations: [Localization] = []
1819
private var masterLocalization: Localization?
1920
private let localizationProvider = LocalizationProvider()
2021
private var numberOfKeys = 0
2122

2223
// MARK: - Action
2324

24-
func load(folder: URL, onCompletion: @escaping ([String]) -> Void) {
25+
func load(folder: URL, onCompletion: @escaping ([String], String?, [LocalizationGroup]) -> Void) {
2526
DispatchQueue.global(qos: .background).async {
2627

27-
self.localizationGroup = self.localizationProvider.getLocalizations(url: folder).filter({$0.name == "Localizable.strings" }).first
28-
self.localizations = self.localizationGroup?.localizations ?? []
29-
self.numberOfKeys = self.localizations.map({ $0.translations.count }).max() ?? 0
30-
self.masterLocalization = self.localizations.first(where: { $0.translations.count == self.numberOfKeys })
31-
32-
DispatchQueue.main.async {
33-
onCompletion(self.localizations.map({ $0.language }))
28+
self.localizationGroups = self.localizationProvider.getLocalizations(url: folder)
29+
if let group = self.localizationGroups.filter({$0.name == "Localizable.strings" }).first ?? self.localizationGroups.first {
30+
let languages = self.select(group: group)
31+
32+
DispatchQueue.main.async {
33+
onCompletion(languages, self.selectedLocalizationGroup?.name, self.localizationGroups)
34+
}
3435
}
3536
}
3637
}
38+
39+
func select(name: String) -> [String]{
40+
let group = self.localizationGroups.filter({$0.name == name}).first!
41+
return select(group: group)
42+
}
43+
44+
func select(group: LocalizationGroup) -> [String]{
45+
self.selectedLocalizationGroup = group
46+
self.localizations = self.selectedLocalizationGroup?.localizations ?? []
47+
self.numberOfKeys = self.localizations.map({ $0.translations.count }).max() ?? 0
48+
self.masterLocalization = self.localizations.first(where: { $0.translations.count == self.numberOfKeys })
49+
50+
return self.localizations.map({ $0.language })
51+
}
3752

3853
func getKey(row: Int) -> String? {
39-
return masterLocalization?.translations[row].key
54+
return (row < masterLocalization?.translations.count ?? 0) ? masterLocalization?.translations[row].key : nil
4055
}
4156

4257
func getLocalization(language: String, row: Int) -> LocalizationString {

LocalizationEditor/UI/Base.lproj/Main.storyboard

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<?xml version="1.0" encoding="UTF-8"?>
2-
<document type="com.apple.InterfaceBuilder3.Cocoa.Storyboard.XIB" version="3.0" toolsVersion="13771" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" initialViewController="B8D-0N-5wS">
2+
<document type="com.apple.InterfaceBuilder3.Cocoa.Storyboard.XIB" version="3.0" toolsVersion="14113" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" initialViewController="B8D-0N-5wS">
33
<dependencies>
4-
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="13771"/>
4+
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="14113"/>
55
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
66
</dependencies>
77
<scenes>
@@ -62,6 +62,16 @@
6262
</items>
6363
</menu>
6464
</menuItem>
65+
<menuItem title="Select" id="3lY-JD-VuH">
66+
<modifierMask key="keyEquivalentModifierMask"/>
67+
<menu key="submenu" title="Select" id="mcz-dt-iwt">
68+
<items>
69+
<menuItem title="Item" id="rhJ-Q3-oPZ">
70+
<modifierMask key="keyEquivalentModifierMask"/>
71+
</menuItem>
72+
</items>
73+
</menu>
74+
</menuItem>
6575
</items>
6676
</menu>
6777
<connections>
@@ -71,6 +81,7 @@
7181
<customObject id="Voe-Tx-rLC" customClass="AppDelegate" customModule="LocalizationEditor" customModuleProvider="target">
7282
<connections>
7383
<outlet property="openFolderMenuItem" destination="pXV-BH-hD6" id="9EJ-PN-yBL"/>
84+
<outlet property="selectMenuItem" destination="3lY-JD-VuH" id="vyY-or-HeH"/>
7485
</connections>
7586
</customObject>
7687
<customObject id="YLy-65-1bz" customClass="NSFontManager"/>

LocalizationEditor/UI/ViewController.swift

Lines changed: 26 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@ class ViewController: NSViewController {
3131
private func setupMenu() {
3232
let appDelegate = NSApplication.shared.delegate as! AppDelegate
3333
appDelegate.openFolderMenuItem.action = #selector(ViewController.openAction(sender:))
34+
appDelegate.selectMenuItem.isHidden = true
35+
appDelegate.selectMenuItem.submenu?.removeAllItems();
3436
}
3537

3638
private func setupData() {
@@ -43,8 +45,18 @@ class ViewController: NSViewController {
4345
tableView.delegate = self
4446
tableView.dataSource = dataSource
4547
}
48+
49+
private func setupSetupLocalizsationSelectionMenu(files: [LocalizationGroup]){
50+
let appDelegate = NSApplication.shared.delegate as! AppDelegate
51+
appDelegate.selectMenuItem.isHidden = false
52+
53+
files.map({NSMenuItem(title: $0.name, action: #selector(ViewController.selectAction(sender:)), keyEquivalent: "")}).forEach({appDelegate.selectMenuItem.submenu?.addItem($0)})
54+
}
55+
56+
private func reloadData(with languages: [String], title: String?) {
57+
let prefix = "LocalizationEditor"
58+
self.view.window?.title = title.flatMap({"\(prefix) [\($0)]"}) ?? prefix // TODO
4659

47-
private func reloadData(with languages: [String]) {
4860
let columns = tableView.tableColumns
4961
columns.forEach {
5062
self.tableView.removeTableColumn($0)
@@ -73,6 +85,13 @@ class ViewController: NSViewController {
7385
}
7486
return string
7587
}
88+
89+
@objc func selectAction(sender: NSMenuItem) {
90+
let title = sender.title
91+
let languages = self.dataSource.select(name: title)
92+
93+
self.reloadData(with: languages, title:title)
94+
}
7695

7796
@objc func openAction(sender _: NSMenuItem) {
7897
let openPanel = NSOpenPanel()
@@ -84,9 +103,12 @@ class ViewController: NSViewController {
84103
if result.rawValue == NSApplication.ModalResponse.OK.rawValue {
85104
if let url = openPanel.url {
86105
self.progressIndicator.startAnimation(self)
87-
self.dataSource.load(folder: url) { [unowned self] languages in
88-
self.reloadData(with: languages)
106+
self.dataSource.load(folder: url) { [unowned self] languages, title, localizationFiles in
107+
self.reloadData(with: languages, title:title)
89108
self.progressIndicator.stopAnimation(self)
109+
if(localizationFiles.count > 1){
110+
self.setupSetupLocalizsationSelectionMenu(files: localizationFiles)
111+
}
90112
}
91113
}
92114
}
@@ -112,7 +134,7 @@ extension ViewController: NSTableViewDelegate {
112134
let cell = tableView.makeView(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: LocalizationCell.identifier), owner: self)! as! LocalizationCell
113135
cell.delegate = self
114136
cell.language = language
115-
cell.value = dataSource.getLocalization(language: language, row: row)
137+
cell.value = row < dataSource.numberOfRows(in: tableView) ? dataSource.getLocalization(language: language, row: row) : nil
116138
return cell
117139
}
118140
}

0 commit comments

Comments
 (0)