diff --git a/cocoa/base/AppDelegate.m b/cocoa/base/AppDelegate.m index bf968c35..b4bb8e5c 100644 --- a/cocoa/base/AppDelegate.m +++ b/cocoa/base/AppDelegate.m @@ -9,6 +9,7 @@ http://www.hardcoded.net/licenses/bsd_license #import "AppDelegate.h" #import "ProgressController.h" #import "HSFairwareReminder.h" +#import "ExtraFairwareReminder.h" #import "Utils.h" #import "Consts.h" #import "Dialogs.h" @@ -32,6 +33,8 @@ http://www.hardcoded.net/licenses/bsd_license _aboutBox = nil; // Lazily loaded _preferencesPanel = nil; // Lazily loaded [[[self directoryPanel] window] makeKeyAndOrderFront:self]; + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(showExtraFairwareReminder:) name:ShowExtraFairwareReminder object:nil]; } /* Virtual */ @@ -203,4 +206,12 @@ http://www.hardcoded.net/licenses/bsd_license { [py loadResultsFrom:path]; } + +- (void)showExtraFairwareReminder:(NSNotification *)aNotification +{ + ExtraFairwareReminder *dialog = [[ExtraFairwareReminder alloc] initWithPy:py]; + [dialog start]; + [NSApp runModalForWindow:[dialog window]]; + [dialog release]; +} @end diff --git a/cocoa/base/Consts.h b/cocoa/base/Consts.h index 0bea482f..42f0ebf8 100644 --- a/cocoa/base/Consts.h +++ b/cocoa/base/Consts.h @@ -10,6 +10,7 @@ http://www.hardcoded.net/licenses/bsd_license #define JobStarted @"JobStarted" #define JobInProgress @"JobInProgress" +#define ShowExtraFairwareReminder @"ShowExtraFairwareReminder" #define jobLoad @"job_load" #define jobScan @"job_scan" diff --git a/cocoa/base/ExtraFairwareReminder.h b/cocoa/base/ExtraFairwareReminder.h new file mode 100644 index 00000000..72c4ba52 --- /dev/null +++ b/cocoa/base/ExtraFairwareReminder.h @@ -0,0 +1,27 @@ +/* +Copyright 2010 Hardcoded Software (http://www.hardcoded.net) + +This software is licensed under the "BSD" License as described in the "LICENSE" file, +which should be included with this package. The terms are also available at +http://www.hardcoded.net/licenses/bsd_license +*/ + +#import +#import "PyExtraFairwareReminder.h" +#import "HSWindowController.h" +#import "PyApp.h" + +@interface ExtraFairwareReminder : HSWindowController +{ + IBOutlet NSButton *continueButton; + + NSTimer *timer; +} +- (id)initWithPy:(PyApp *)aPy; +- (PyExtraFairwareReminder *)py; + +- (void)start; +- (void)updateButton; +- (IBAction)continue:(id)sender; +- (IBAction)contribute:(id)sender; +@end diff --git a/cocoa/base/ExtraFairwareReminder.m b/cocoa/base/ExtraFairwareReminder.m new file mode 100644 index 00000000..057a0805 --- /dev/null +++ b/cocoa/base/ExtraFairwareReminder.m @@ -0,0 +1,74 @@ +/* +Copyright 2010 Hardcoded Software (http://www.hardcoded.net) + +This software is licensed under the "BSD" License as described in the "LICENSE" file, +which should be included with this package. The terms are also available at +http://www.hardcoded.net/licenses/bsd_license +*/ + +#import "ExtraFairwareReminder.h" + +@implementation ExtraFairwareReminder +- (id)initWithPy:(PyApp *)aPy +{ + self = [super initWithNibName:@"ExtraFairwareReminder" pyClassName:@"PyExtraFairwareReminder" pyParent:aPy]; + [self window]; + [continueButton setEnabled:NO]; + return self; +} + +- (void)dealloc +{ + [timer release]; + [super dealloc]; +} + +- (PyExtraFairwareReminder *)py +{ + return (PyExtraFairwareReminder *)py; +} + +- (void)start +{ + [[self py] start]; +} + +- (void)updateButton +{ + [[self py] updateButton]; +} + +- (IBAction)continue:(id)sender +{ + [NSApp stopModal]; +} + +- (IBAction)contribute:(id)sender +{ + [[NSWorkspace sharedWorkspace] openURL:[NSURL URLWithString:@"http://open.hardcoded.net/contribute/"]]; +} + +/* Model --> View */ +- (void)startTimer +{ + timer = [[NSTimer timerWithTimeInterval:0.2 target:self selector:@selector(updateButton) + userInfo:nil repeats:YES] retain]; + // Needed for the timer to work in modal mode. + [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSModalPanelRunLoopMode]; +} + +- (void)stopTimer +{ + [timer invalidate]; +} + +- (void)setButtonText:(NSString *)text +{ + [continueButton setTitle:text]; +} + +- (void)enableButton +{ + [continueButton setEnabled:YES]; +} +@end \ No newline at end of file diff --git a/cocoa/base/PyExtraFairwareReminder.h b/cocoa/base/PyExtraFairwareReminder.h new file mode 100644 index 00000000..69d19245 --- /dev/null +++ b/cocoa/base/PyExtraFairwareReminder.h @@ -0,0 +1,15 @@ +/* +Copyright 2010 Hardcoded Software (http://www.hardcoded.net) + +This software is licensed under the "BSD" License as described in the "LICENSE" file, +which should be included with this package. The terms are also available at +http://www.hardcoded.net/licenses/bsd_license +*/ + +#import +#import "PyGUI.h" + +@interface PyExtraFairwareReminder : PyGUI +- (void)start; +- (void)updateButton; +@end diff --git a/cocoa/base/en.lproj/ExtraFairwareReminder.strings b/cocoa/base/en.lproj/ExtraFairwareReminder.strings new file mode 100644 index 00000000..bf01eef1 --- /dev/null +++ b/cocoa/base/en.lproj/ExtraFairwareReminder.strings @@ -0,0 +1,11 @@ +/* Class = "NSWindow"; title = "Sorry, I must insist"; ObjectID = "1"; */ +"1.title" = "Sorry, I must insist"; + +/* Class = "NSTextFieldCell"; title = "This reminder showed up because:

1. You are processing more than 100 duplicates
2. You have not yet contributed to dupeGuru
3. There are unpaid hours in the project"; ObjectID = "4"; */ +"4.title" = "This reminder showed up because:\n\n1. You are processing more than 100 duplicates\n2. You have not yet contributed to dupeGuru\n3. There are unpaid hours in the project"; + +/* Class = "NSTextFieldCell"; title = "It seems that you found a lot of duplicates. Nice! I must insist, however, that contributions are expected when there are unpaid hours on the project.

You might think \"but I'm only going to use this once, I don't have to contribute\". The problem is that most people use dupeGuru only once in a while. If everyone thinks like that, dupeGuru development cannot be funded.

If you can't afford to contribute, you can ignore this reminder or send me an e-mail at hsoft@hardcoded.net so I can give you a key to remove this popup."; ObjectID = "6"; */ +"6.title" = "It seems that you found a lot of duplicates. Nice! I must insist, however, that contributions are expected when there are unpaid hours on the project.\n\nYou might think \"but I'm only going to use this once, I don't have to contribute\". The problem is that most people use dupeGuru only once in a while. If everyone thinks like that, dupeGuru development cannot be funded. It's because of this tendency inherent to dupeGuru's nature that I have to insist here.\n\nIf you can't afford to contribute, you can ignore this reminder or send me an e-mail at hsoft@hardcoded.net so I can give you a key to remove this popup."; + +/* Class = "NSButtonCell"; title = "Contribute"; ObjectID = "10"; */ +"10.title" = "Contribute"; diff --git a/cocoa/base/en.lproj/ExtraFairwareReminder.xib b/cocoa/base/en.lproj/ExtraFairwareReminder.xib new file mode 100644 index 00000000..08eb17ea --- /dev/null +++ b/cocoa/base/en.lproj/ExtraFairwareReminder.xib @@ -0,0 +1,945 @@ + + + + 1050 + 10J567 + 823 + 1038.35 + 462.00 + + com.apple.InterfaceBuilder.CocoaPlugin + 823 + + + YES + + + + YES + com.apple.InterfaceBuilder.CocoaPlugin + + + YES + + YES + + + YES + + + + YES + + ExtraFairwareReminder + + + FirstResponder + + + NSApplication + + + 1 + 2 + {{418, 295}, {480, 390}} + 1081606144 + Sorry, I must insist + NSWindow + + {1.79769e+308, 1.79769e+308} + + + 256 + + YES + + + 268 + {{17, 48}, {446, 85}} + + YES + + 67239424 + 272629760 + This reminder showed up because:

1. You are processing more than 100 duplicates
2. You have not yet contributed to dupeGuru
3. There are unpaid hours in the project + + LucidaGrande-Bold + 12 + 16 + + + + 6 + System + controlColor + + 3 + MC42NjY2NjY2NjY3AA + + + + 6 + System + controlTextColor + + 3 + MAA + + + + + + + 268 + {{17, 141}, {446, 229}} + + YES + + 67239424 + 205520896 + It seems that you found a lot of duplicates. Nice! I must insist, however, that contributions are expected when there are unpaid hours on the project.

You might think "but I'm only going to use this once, I don't have to contribute". The problem is that most people use dupeGuru only once in a while. If everyone thinks like that, dupeGuru development cannot be funded. It's because of this tendency inherent to dupeGuru's nature that I have to insist here.

If you can't afford to contribute, you can ignore this reminder or send me an e-mail at hsoft@hardcoded.net so I can give you a key to remove this popup. + + LucidaGrande + 12 + 16 + + + + + + + + + 268 + {{338, 12}, {128, 32}} + + YES + + 67239424 + 134217728 + Continue + + LucidaGrande + 13 + 1044 + + + -2038284033 + 129 + + + 200 + 25 + + + + + 268 + {{210, 12}, {128, 32}} + + YES + + 67239424 + 134217728 + Contribute + + + -2038284033 + 129 + + DQ + 200 + 25 + + + + {480, 390} + + + {{0, 0}, {1440, 878}} + {1.79769e+308, 1.79769e+308} + + + + + YES + + + contribute: + + + + 11 + + + + continue: + + + + 12 + + + + window + + + + 13 + + + + continueButton + + + + 14 + + + + + YES + + 0 + + + + + + -2 + + + File's Owner + + + -1 + + + First Responder + + + -3 + + + Application + + + 1 + + + YES + + + + + + 2 + + + YES + + + + + + + + + 3 + + + YES + + + + + + 4 + + + + + 5 + + + YES + + + + + + 6 + + + + + 7 + + + YES + + + + + + 8 + + + + + 9 + + + YES + + + + + + 10 + + + + + + + YES + + YES + -1.IBPluginDependency + -2.IBPluginDependency + -3.IBPluginDependency + 1.IBEditorWindowLastContentRect + 1.IBPluginDependency + 1.IBWindowTemplateEditedContentRect + 1.NSWindowTemplate.visibleAtLaunch + 1.WindowOrigin + 1.editorWindowContentRectSynchronizationRect + 10.IBPluginDependency + 2.IBPluginDependency + 3.IBPluginDependency + 3.IBViewBoundsToFrameTransform + 4.IBPluginDependency + 5.IBPluginDependency + 5.IBViewBoundsToFrameTransform + 6.IBPluginDependency + 7.IBPluginDependency + 7.IBViewBoundsToFrameTransform + 8.IBPluginDependency + 9.IBPluginDependency + 9.IBViewBoundsToFrameTransform + + + YES + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + {{418, 295}, {480, 390}} + com.apple.InterfaceBuilder.CocoaPlugin + {{418, 295}, {480, 390}} + + {196, 240} + {{357, 418}, {480, 270}} + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBiAAAwxwAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABAoAAAw3gAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABDqQAAwigAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABDUgAAwigAAA + + + + + YES + + + YES + + + + + YES + + + YES + + + + 14 + + + + YES + + ExtraFairwareReminder + HSWindowController + + YES + + YES + continue: + contribute: + + + YES + id + id + + + + YES + + YES + continue: + contribute: + + + YES + + continue: + id + + + contribute: + id + + + + + continueButton + NSButton + + + continueButton + + continueButton + NSButton + + + + IBProjectSource + ../base/ExtraFairwareReminder.h + + + + HSWindowController + NSWindowController + + IBProjectSource + ../controllers/HSWindowController.h + + + + NSObject + + IBProjectSource + ../views/HSOutlineView.h + + + + NSObject + + IBProjectSource + ../views/HSTableView.h + + + + NSObject + + IBProjectSource + ../views/NSTableViewAdditions.h + + + + + YES + + NSActionCell + NSCell + + IBFrameworkSource + AppKit.framework/Headers/NSActionCell.h + + + + NSApplication + NSResponder + + IBFrameworkSource + AppKit.framework/Headers/NSApplication.h + + + + NSApplication + + IBFrameworkSource + AppKit.framework/Headers/NSApplicationScripting.h + + + + NSApplication + + IBFrameworkSource + AppKit.framework/Headers/NSColorPanel.h + + + + NSApplication + + IBFrameworkSource + AppKit.framework/Headers/NSHelpManager.h + + + + NSApplication + + IBFrameworkSource + AppKit.framework/Headers/NSPageLayout.h + + + + NSApplication + + IBFrameworkSource + AppKit.framework/Headers/NSUserInterfaceItemSearching.h + + + + NSButton + NSControl + + IBFrameworkSource + AppKit.framework/Headers/NSButton.h + + + + NSButtonCell + NSActionCell + + IBFrameworkSource + AppKit.framework/Headers/NSButtonCell.h + + + + NSCell + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSCell.h + + + + NSControl + NSView + + IBFrameworkSource + AppKit.framework/Headers/NSControl.h + + + + NSFormatter + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSFormatter.h + + + + NSMenu + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSMenu.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSAccessibility.h + + + + NSObject + + + + NSObject + + + + NSObject + + + + NSObject + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSDictionaryController.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSDragging.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSFontManager.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSFontPanel.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSKeyValueBinding.h + + + + NSObject + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSNibLoading.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSOutlineView.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSPasteboard.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSSavePanel.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSTableView.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSToolbarItem.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSView.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSArchiver.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSClassDescription.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSError.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSFileManager.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyValueCoding.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyValueObserving.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyedArchiver.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSObject.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSObjectScripting.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSPortCoder.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSRunLoop.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSScriptClassDescription.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSScriptKeyValueCoding.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSScriptObjectSpecifiers.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSScriptWhoseTests.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSThread.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSURL.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSURLConnection.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSURLDownload.h + + + + NSObject + + IBFrameworkSource + Sparkle.framework/Headers/SUAppcast.h + + + + NSObject + + IBFrameworkSource + Sparkle.framework/Headers/SUUpdater.h + + + + NSResponder + + IBFrameworkSource + AppKit.framework/Headers/NSInterfaceStyle.h + + + + NSResponder + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSResponder.h + + + + NSTextField + NSControl + + IBFrameworkSource + AppKit.framework/Headers/NSTextField.h + + + + NSTextFieldCell + NSActionCell + + IBFrameworkSource + AppKit.framework/Headers/NSTextFieldCell.h + + + + NSView + + IBFrameworkSource + AppKit.framework/Headers/NSClipView.h + + + + NSView + + IBFrameworkSource + AppKit.framework/Headers/NSMenuItem.h + + + + NSView + + IBFrameworkSource + AppKit.framework/Headers/NSRulerView.h + + + + NSView + NSResponder + + + + NSWindow + + IBFrameworkSource + AppKit.framework/Headers/NSDrawer.h + + + + NSWindow + NSResponder + + IBFrameworkSource + AppKit.framework/Headers/NSWindow.h + + + + NSWindow + + IBFrameworkSource + AppKit.framework/Headers/NSWindowScripting.h + + + + NSWindowController + NSResponder + + showWindow: + id + + + showWindow: + + showWindow: + id + + + + IBFrameworkSource + AppKit.framework/Headers/NSWindowController.h + + + + + 0 + IBCocoaFramework + + com.apple.InterfaceBuilder.CocoaPlugin.macosx + + + + com.apple.InterfaceBuilder.CocoaPlugin.macosx + + + + com.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3 + + + YES + ../../pe/dupeguru.xcodeproj + 3 + + diff --git a/cocoa/base/en.lproj/core.strings b/cocoa/base/en.lproj/core.strings index b9786151..c2fd6199 100644 --- a/cocoa/base/en.lproj/core.strings +++ b/cocoa/base/en.lproj/core.strings @@ -11,12 +11,14 @@ "Grouped %d/%d matches" = "Grouped %d/%d matches"; "%d / %d (%s / %s) duplicates marked." = "%d / %d (%s / %s) duplicates marked."; " filter: %s" = " filter: %s"; -"Read size of %d/%d files" = "Read size of %d/%d files"; "Read metadata of %d/%d files" = "Read metadata of %d/%d files"; "Removing false matches" = "Removing false matches"; "Processed %d/%d matches against the ignore list" = "Processed %d/%d matches against the ignore list"; "Doing group prioritization" = "Doing group prioritization"; +"Continue" = "Continue"; +"Continue ({})" = "Continue ({})"; + "Analyzed %d/%d pictures" = "Analyzed %d/%d pictures"; "Preparing for matching" = "Preparing for matching"; "Performed %d/%d chunk matches" = "Performed %d/%d chunk matches"; diff --git a/cocoa/base/fr.lproj/ExtraFairwareReminder.strings b/cocoa/base/fr.lproj/ExtraFairwareReminder.strings new file mode 100644 index 00000000..81889dc5 --- /dev/null +++ b/cocoa/base/fr.lproj/ExtraFairwareReminder.strings @@ -0,0 +1,11 @@ +/* Class = "NSWindow"; title = "Sorry, I must insist"; ObjectID = "1"; */ +"1.title" = "Désolé, je dois insister"; + +/* Class = "NSTextFieldCell"; title = "This reminder showed up because:

1. You are processing more than 100 duplicates
2. You have not yet contributed to dupeGuru
3. There are unpaid hours in the project"; ObjectID = "4"; */ +"4.title" = "Ce rappel apparaît parce que:\n\n1. Plus de 100 doublons sont traités\n2. Vous n'avez pas encore contribué à dupeGuru\n3. Il y a des heures non-payées au projet"; + +/* Class = "NSTextFieldCell"; title = "It seems that you found a lot of duplicates. Nice! I must insist, however, that contributions are expected when there are unpaid hours on the project.

You might think \"but I'm only going to use this once, I don't have to contribute\". The problem is that most people use dupeGuru only once in a while. If everyone thinks like that, dupeGuru development cannot be funded.

If you can't afford to contribute, you can ignore this reminder or send me an e-mail at hsoft@hardcoded.net so I can give you a key to remove this popup."; ObjectID = "6"; */ +"6.title" = "Il semble que vous ayez trouvé beaucoup de doublons. Super! Je dois par contre insister que des contributions sont attendues lorsqu'il y'a des heures non-payées au projet.\n\nVous pensez peut-être \"je n'utiliserai ce programme qu'une fois, pas besoin de contribuer\". Le problème c'est que la plupart des utilisateurs de dupeGuru ne l'utilisent qu'une fois. Si tous suivent ce raisonnement, le développement de dupeGuru ne peut pas continuer. C'est à cause de cette tendance inhérente à la nature de dupeGuru que je me vois contraint d'insister ici.\n\nSi vous n'avez pas les moyens de contribuer, ignorez ce message ou envoyez moi un message à hsoft@hardcoded.net pour que je vous envoie une clé d'enregistrement."; + +/* Class = "NSButtonCell"; title = "Contribute"; ObjectID = "10"; */ +"10.title" = "Contribuer"; diff --git a/cocoa/base/fr.lproj/ExtraFairwareReminder.xib b/cocoa/base/fr.lproj/ExtraFairwareReminder.xib new file mode 100644 index 00000000..07f5341c --- /dev/null +++ b/cocoa/base/fr.lproj/ExtraFairwareReminder.xib @@ -0,0 +1,962 @@ + + + + 1050 + 10J567 + 823 + 1038.35 + 462.00 + + com.apple.InterfaceBuilder.CocoaPlugin + 823 + + + YES + + + + YES + com.apple.InterfaceBuilder.CocoaPlugin + + + YES + + YES + + + YES + + + + YES + + ExtraFairwareReminder + + + FirstResponder + + + NSApplication + + + 1 + 2 + {{418, 295}, {480, 390}} + 1081606144 + Désolé, je dois insister + NSWindow + + {1.79769e+308, 1.79769e+308} + + + 256 + + YES + + + 268 + {{17, 48}, {446, 85}} + + YES + + 67239424 + 272629760 + Q2UgcmFwcGVsIGFwcGFyYcOudCBwYXJjZSBxdWU6CgoxLiBQbHVzIGRlIDEwMCBkb3VibG9ucyBzb250 +IHRyYWl0w6lzCjIuIFZvdXMgbidhdmV6IHBhcyBlbmNvcmUgY29udHJpYnXDqSDDoCBkdXBlR3VydQoz +LiBJbCB5IGEgZGVzIGhldXJlcyBub24tcGF5w6llcyBhdSBwcm9qZXQ + + LucidaGrande-Bold + 12 + 16 + + + + 6 + System + controlColor + + 3 + MC42NjY2NjY2NjY3AA + + + + 6 + System + controlTextColor + + 3 + MAA + + + + + + + 268 + {{17, 141}, {446, 229}} + + YES + + 67239424 + 205520896 + SWwgc2VtYmxlIHF1ZSB2b3VzIGF5ZXogdHJvdXbDqSBiZWF1Y291cCBkZSBkb3VibG9ucy4gU3VwZXIh +IEplIGRvaXMgcGFyIGNvbnRyZSBpbnNpc3RlciBxdWUgZGVzIGNvbnRyaWJ1dGlvbnMgc29udCBhdHRl +bmR1ZXMgbG9yc3F1J2lsIHknYSBkZXMgaGV1cmVzIG5vbi1wYXnDqWVzIGF1IHByb2pldC4KClZvdXMg +cGVuc2V6IHBldXQtw6p0cmUgImplIG4ndXRpbGlzZXJhaSBjZSBwcm9ncmFtbWUgcXUndW5lIGZvaXMs +IHBhcyBiZXNvaW4gZGUgY29udHJpYnVlciIuIExlIHByb2Jsw6htZSBjJ2VzdCBxdWUgbGEgcGx1cGFy +dCBkZXMgdXRpbGlzYXRldXJzIGRlIGR1cGVHdXJ1IG5lIGwndXRpbGlzZW50IHF1J3VuZSBmb2lzLiBT +aSB0b3VzIHN1aXZlbnQgY2UgcmFpc29ubmVtZW50LCBsZSBkw6l2ZWxvcHBlbWVudCBkZSBkdXBlR3Vy +dSBuZSBwZXV0IHBhcyBjb250aW51ZXIuIEMnZXN0IMOgIGNhdXNlIGRlIGNldHRlIHRlbmRhbmNlIGlu +aMOpcmVudGUgw6AgbGEgbmF0dXJlIGRlIGR1cGVHdXJ1IHF1ZSBqZSBtZSB2b2lzIGNvbnRyYWludCBk +J2luc2lzdGVyIGljaS4KClNpIHZvdXMgbidhdmV6IHBhcyBsZXMgbW95ZW5zIGRlIGNvbnRyaWJ1ZXIs +IGlnbm9yZXogY2UgbWVzc2FnZSBvdSBlbnZveWV6IG1vaSB1biBtZXNzYWdlIMOgIGhzb2Z0QGhhcmRj +b2RlZC5uZXQgcG91ciBxdWUgamUgdm91cyBlbnZvaWUgdW5lIGNsw6kgZCdlbnJlZ2lzdHJlbWVudC4 + + LucidaGrande + 12 + 16 + + + + + + + + + 268 + {{338, 12}, {128, 32}} + + YES + + 67239424 + 134217728 + Continue + + LucidaGrande + 13 + 1044 + + + -2038284033 + 129 + + + 200 + 25 + + + + + 268 + {{210, 12}, {128, 32}} + + YES + + 67239424 + 134217728 + Contribuer + + + -2038284033 + 129 + + DQ + 200 + 25 + + + + {480, 390} + + + {{0, 0}, {1440, 878}} + {1.79769e+308, 1.79769e+308} + + + + + YES + + + contribute: + + + + 11 + + + + continue: + + + + 12 + + + + window + + + + 13 + + + + continueButton + + + + 14 + + + + + YES + + 0 + + + + + + -2 + + + File's Owner + + + -1 + + + First Responder + + + -3 + + + Application + + + 1 + + + YES + + + + + + 2 + + + YES + + + + + + + + + 3 + + + YES + + + + + + 4 + + + + + 5 + + + YES + + + + + + 6 + + + + + 7 + + + YES + + + + + + 8 + + + + + 9 + + + YES + + + + + + 10 + + + + + + + YES + + YES + -1.IBPluginDependency + -2.IBPluginDependency + -3.IBPluginDependency + 1.IBEditorWindowLastContentRect + 1.IBPluginDependency + 1.IBWindowTemplateEditedContentRect + 1.NSWindowTemplate.visibleAtLaunch + 1.WindowOrigin + 1.editorWindowContentRectSynchronizationRect + 1.windowTemplate.maxSize + 1.windowTemplate.minSize + 10.IBPluginDependency + 2.IBPluginDependency + 3.IBPluginDependency + 3.IBViewBoundsToFrameTransform + 4.IBPluginDependency + 5.IBPluginDependency + 5.IBViewBoundsToFrameTransform + 6.IBPluginDependency + 7.IBPluginDependency + 7.IBViewBoundsToFrameTransform + 8.IBPluginDependency + 9.IBPluginDependency + 9.IBViewBoundsToFrameTransform + + + YES + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + {{418, 295}, {480, 390}} + com.apple.InterfaceBuilder.CocoaPlugin + {{418, 295}, {480, 390}} + + {196, 240} + {{357, 418}, {480, 270}} + {1.79769e+308, 1.79769e+308} + {0, 0} + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBiAAAwxwAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABAoAAAw3gAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABDqQAAwigAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABDUgAAwigAAA + + + + + YES + + + YES + + + + + YES + + + YES + + + + 14 + + + + YES + + ExtraFairwareReminder + HSWindowController + + YES + + YES + continue: + contribute: + + + YES + id + id + + + + YES + + YES + continue: + contribute: + + + YES + + continue: + id + + + contribute: + id + + + + + continueButton + NSButton + + + continueButton + + continueButton + NSButton + + + + IBProjectSource + ../base/ExtraFairwareReminder.h + + + + HSWindowController + NSWindowController + + IBProjectSource + ../controllers/HSWindowController.h + + + + NSObject + + IBProjectSource + ../views/HSOutlineView.h + + + + NSObject + + IBProjectSource + ../views/HSTableView.h + + + + NSObject + + IBProjectSource + ../views/NSTableViewAdditions.h + + + + + YES + + NSActionCell + NSCell + + IBFrameworkSource + AppKit.framework/Headers/NSActionCell.h + + + + NSApplication + NSResponder + + IBFrameworkSource + AppKit.framework/Headers/NSApplication.h + + + + NSApplication + + IBFrameworkSource + AppKit.framework/Headers/NSApplicationScripting.h + + + + NSApplication + + IBFrameworkSource + AppKit.framework/Headers/NSColorPanel.h + + + + NSApplication + + IBFrameworkSource + AppKit.framework/Headers/NSHelpManager.h + + + + NSApplication + + IBFrameworkSource + AppKit.framework/Headers/NSPageLayout.h + + + + NSApplication + + IBFrameworkSource + AppKit.framework/Headers/NSUserInterfaceItemSearching.h + + + + NSButton + NSControl + + IBFrameworkSource + AppKit.framework/Headers/NSButton.h + + + + NSButtonCell + NSActionCell + + IBFrameworkSource + AppKit.framework/Headers/NSButtonCell.h + + + + NSCell + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSCell.h + + + + NSControl + NSView + + IBFrameworkSource + AppKit.framework/Headers/NSControl.h + + + + NSFormatter + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSFormatter.h + + + + NSMenu + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSMenu.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSAccessibility.h + + + + NSObject + + + + NSObject + + + + NSObject + + + + NSObject + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSDictionaryController.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSDragging.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSFontManager.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSFontPanel.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSKeyValueBinding.h + + + + NSObject + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSNibLoading.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSOutlineView.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSPasteboard.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSSavePanel.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSTableView.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSToolbarItem.h + + + + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSView.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSArchiver.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSClassDescription.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSError.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSFileManager.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyValueCoding.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyValueObserving.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyedArchiver.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSObject.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSObjectScripting.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSPortCoder.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSRunLoop.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSScriptClassDescription.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSScriptKeyValueCoding.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSScriptObjectSpecifiers.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSScriptWhoseTests.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSThread.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSURL.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSURLConnection.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSURLDownload.h + + + + NSObject + + IBFrameworkSource + Sparkle.framework/Headers/SUAppcast.h + + + + NSObject + + IBFrameworkSource + Sparkle.framework/Headers/SUUpdater.h + + + + NSResponder + + IBFrameworkSource + AppKit.framework/Headers/NSInterfaceStyle.h + + + + NSResponder + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSResponder.h + + + + NSTextField + NSControl + + IBFrameworkSource + AppKit.framework/Headers/NSTextField.h + + + + NSTextFieldCell + NSActionCell + + IBFrameworkSource + AppKit.framework/Headers/NSTextFieldCell.h + + + + NSView + + IBFrameworkSource + AppKit.framework/Headers/NSClipView.h + + + + NSView + + IBFrameworkSource + AppKit.framework/Headers/NSMenuItem.h + + + + NSView + + IBFrameworkSource + AppKit.framework/Headers/NSRulerView.h + + + + NSView + NSResponder + + + + NSWindow + + IBFrameworkSource + AppKit.framework/Headers/NSDrawer.h + + + + NSWindow + NSResponder + + IBFrameworkSource + AppKit.framework/Headers/NSWindow.h + + + + NSWindow + + IBFrameworkSource + AppKit.framework/Headers/NSWindowScripting.h + + + + NSWindowController + NSResponder + + showWindow: + id + + + showWindow: + + showWindow: + id + + + + IBFrameworkSource + AppKit.framework/Headers/NSWindowController.h + + + + + 0 + IBCocoaFramework + + com.apple.InterfaceBuilder.CocoaPlugin.macosx + + + + com.apple.InterfaceBuilder.CocoaPlugin.macosx + + + + com.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3 + + + YES + ../../pe/dupeguru.xcodeproj + 3 + + diff --git a/cocoa/base/fr.lproj/core.strings b/cocoa/base/fr.lproj/core.strings index c4df9736..9c9067e0 100644 --- a/cocoa/base/fr.lproj/core.strings +++ b/cocoa/base/fr.lproj/core.strings @@ -16,6 +16,9 @@ "Processed %d/%d matches against the ignore list" = "Vérification de %d/%d paires dans la ignore list"; "Doing group prioritization" = "Prioritization des groupes"; +"Continue" = "Continuer"; +"Continue ({})" = "Continuer ({})"; + "Analyzed %d/%d pictures" = "Analyzé %d/%d images"; "Preparing for matching" = "Préparation pour la comparaison"; "Performed %d/%d chunk matches" = "%d/%d blocs d'images comparés"; diff --git a/cocoa/me/dupeguru.xcodeproj/project.pbxproj b/cocoa/me/dupeguru.xcodeproj/project.pbxproj index 61a05c66..08d8a5bc 100644 --- a/cocoa/me/dupeguru.xcodeproj/project.pbxproj +++ b/cocoa/me/dupeguru.xcodeproj/project.pbxproj @@ -67,6 +67,8 @@ CE74A12712537F2E008A8DF0 /* FairwareReminder.xib in Resources */ = {isa = PBXBuildFile; fileRef = CE74A12512537F2E008A8DF0 /* FairwareReminder.xib */; }; CE848A1909DD85810004CB44 /* Consts.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = CE848A1809DD85810004CB44 /* Consts.h */; }; CEB14D29124DFC2800FA7481 /* ResultTable.m in Sources */ = {isa = PBXBuildFile; fileRef = CEB14D28124DFC2800FA7481 /* ResultTable.m */; }; + CEB5E07813225C89009F521D /* ExtraFairwareReminder.m in Sources */ = {isa = PBXBuildFile; fileRef = CEB5E07613225C89009F521D /* ExtraFairwareReminder.m */; }; + CEB5E07D13225CA2009F521D /* ExtraFairwareReminder.xib in Resources */ = {isa = PBXBuildFile; fileRef = CEB5E07B13225CA2009F521D /* ExtraFairwareReminder.xib */; }; CEDF07A3112493B200EE5BC0 /* StatsLabel.m in Sources */ = {isa = PBXBuildFile; fileRef = CEDF07A2112493B200EE5BC0 /* StatsLabel.m */; }; CEEB135209C837A2004D2330 /* dupeguru.icns in Resources */ = {isa = PBXBuildFile; fileRef = CEEB135109C837A2004D2330 /* dupeguru.icns */; }; CEFC294609C89E3D00D9F998 /* folder32.png in Resources */ = {isa = PBXBuildFile; fileRef = CEFC294509C89E3D00D9F998 /* folder32.png */; }; @@ -186,6 +188,11 @@ CEB14D26124DFC2800FA7481 /* PyResultTable.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PyResultTable.h; path = ../base/PyResultTable.h; sourceTree = SOURCE_ROOT; }; CEB14D27124DFC2800FA7481 /* ResultTable.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ResultTable.h; path = ../base/ResultTable.h; sourceTree = SOURCE_ROOT; }; CEB14D28124DFC2800FA7481 /* ResultTable.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = ResultTable.m; path = ../base/ResultTable.m; sourceTree = SOURCE_ROOT; }; + CEB5E07513225C89009F521D /* ExtraFairwareReminder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ExtraFairwareReminder.h; path = ../base/ExtraFairwareReminder.h; sourceTree = SOURCE_ROOT; }; + CEB5E07613225C89009F521D /* ExtraFairwareReminder.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = ExtraFairwareReminder.m; path = ../base/ExtraFairwareReminder.m; sourceTree = SOURCE_ROOT; }; + CEB5E07713225C89009F521D /* PyExtraFairwareReminder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PyExtraFairwareReminder.h; path = ../base/PyExtraFairwareReminder.h; sourceTree = SOURCE_ROOT; }; + CEB5E07C13225CA2009F521D /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = ../base/en.lproj/ExtraFairwareReminder.xib; sourceTree = SOURCE_ROOT; }; + CEB5E07E13225CB8009F521D /* fr */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = fr; path = ../base/fr.lproj/ExtraFairwareReminder.xib; sourceTree = SOURCE_ROOT; }; CED0A591111C9FD10020AD7D /* PyDetailsPanel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PyDetailsPanel.h; path = ../base/PyDetailsPanel.h; sourceTree = SOURCE_ROOT; }; CEDF07A0112493B200EE5BC0 /* PyStatsLabel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PyStatsLabel.h; path = ../base/PyStatsLabel.h; sourceTree = SOURCE_ROOT; }; CEDF07A1112493B200EE5BC0 /* StatsLabel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = StatsLabel.h; path = ../base/StatsLabel.h; sourceTree = SOURCE_ROOT; }; @@ -341,6 +348,7 @@ CE05331312E5D3ED0029EF25 /* ProblemDialog.xib */, CE05331512E5D3ED0029EF25 /* ResultWindow.xib */, CE05332112E5D4100029EF25 /* Preferences.xib */, + CEB5E07B13225CA2009F521D /* ExtraFairwareReminder.xib */, ); name = xib; sourceTree = ""; @@ -402,7 +410,6 @@ CE515E140FC6C17900EC695D /* dgbase */ = { isa = PBXGroup; children = ( - CEB14D26124DFC2800FA7481 /* PyResultTable.h */, CEB14D27124DFC2800FA7481 /* ResultTable.h */, CEB14D28124DFC2800FA7481 /* ResultTable.m */, CE003CCD11242D2C004B0AA7 /* DirectoryOutline.h */, @@ -421,10 +428,14 @@ CE515E1C0FC6C19300EC695D /* ResultWindow.m */, CEDF07A1112493B200EE5BC0 /* StatsLabel.h */, CEDF07A2112493B200EE5BC0 /* StatsLabel.m */, + CEB5E07513225C89009F521D /* ExtraFairwareReminder.h */, + CEB5E07613225C89009F521D /* ExtraFairwareReminder.m */, CE515E1A0FC6C19300EC695D /* PyDupeGuru.h */, CED0A591111C9FD10020AD7D /* PyDetailsPanel.h */, CE0A0C031175A1DE00DCA3C6 /* PyProblemDialog.h */, CEDF07A0112493B200EE5BC0 /* PyStatsLabel.h */, + CEB14D26124DFC2800FA7481 /* PyResultTable.h */, + CEB5E07713225C89009F521D /* PyExtraFairwareReminder.h */, ); name = dgbase; sourceTree = ""; @@ -508,6 +519,7 @@ CE05332312E5D4100029EF25 /* Preferences.xib in Resources */, CE05332F12E5D6100029EF25 /* Localizable.strings in Resources */, CE45274F12E5F62D00005A15 /* core.strings in Resources */, + CEB5E07D13225CA2009F521D /* ExtraFairwareReminder.xib in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -548,6 +560,7 @@ CE74A12412537F06008A8DF0 /* HSFairwareReminder.m in Sources */, CE4F934912CCA96C0067A3AE /* HSAboutBox.m in Sources */, CE1EAA0A12DF3E81009BA949 /* HSRecentFiles.m in Sources */, + CEB5E07813225C89009F521D /* ExtraFairwareReminder.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -636,6 +649,15 @@ path = ../../cocoalib/xib; sourceTree = SOURCE_ROOT; }; + CEB5E07B13225CA2009F521D /* ExtraFairwareReminder.xib */ = { + isa = PBXVariantGroup; + children = ( + CEB5E07C13225CA2009F521D /* en */, + CEB5E07E13225CB8009F521D /* fr */, + ); + name = ExtraFairwareReminder.xib; + sourceTree = SOURCE_ROOT; + }; /* End PBXVariantGroup section */ /* Begin XCBuildConfiguration section */ diff --git a/cocoa/pe/dupeguru.xcodeproj/project.pbxproj b/cocoa/pe/dupeguru.xcodeproj/project.pbxproj index 879c8d9d..956593a6 100644 --- a/cocoa/pe/dupeguru.xcodeproj/project.pbxproj +++ b/cocoa/pe/dupeguru.xcodeproj/project.pbxproj @@ -23,6 +23,8 @@ CE15C8C00ADEB8D40061D4A5 /* Sparkle.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = CE15C8A70ADEB8B50061D4A5 /* Sparkle.framework */; }; CE1EB5FE12537F9D0034AABB /* HSFairwareReminder.m in Sources */ = {isa = PBXBuildFile; fileRef = CE1EB5FC12537F9D0034AABB /* HSFairwareReminder.m */; }; CE1EB60112537FB90034AABB /* FairwareReminder.xib in Resources */ = {isa = PBXBuildFile; fileRef = CE1EB5FF12537FB90034AABB /* FairwareReminder.xib */; }; + CE2A29F413213BE3005899AC /* ExtraFairwareReminder.m in Sources */ = {isa = PBXBuildFile; fileRef = CE2A29F313213BE3005899AC /* ExtraFairwareReminder.m */; }; + CE2A29F713213BFB005899AC /* ExtraFairwareReminder.xib in Resources */ = {isa = PBXBuildFile; fileRef = CE2A29F513213BFB005899AC /* ExtraFairwareReminder.xib */; }; CE381C9609914ACE003581CE /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = CE381C9409914ACE003581CE /* AppDelegate.m */; }; CE381C9C09914ADF003581CE /* ResultWindow.m in Sources */ = {isa = PBXBuildFile; fileRef = CE381C9A09914ADF003581CE /* ResultWindow.m */; }; CE381D0509915304003581CE /* dg_cocoa.plugin in Resources */ = {isa = PBXBuildFile; fileRef = CE381CF509915304003581CE /* dg_cocoa.plugin */; }; @@ -115,6 +117,10 @@ CE1EB5FC12537F9D0034AABB /* HSFairwareReminder.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = HSFairwareReminder.m; path = ../../cocoalib/HSFairwareReminder.m; sourceTree = SOURCE_ROOT; }; CE1EB5FD12537F9D0034AABB /* PyFairware.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PyFairware.h; path = ../../cocoalib/PyFairware.h; sourceTree = SOURCE_ROOT; }; CE1EB60012537FB90034AABB /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = ../../cocoalib/en.lproj/FairwareReminder.xib; sourceTree = SOURCE_ROOT; }; + CE2A29F213213BE3005899AC /* ExtraFairwareReminder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ExtraFairwareReminder.h; path = ../base/ExtraFairwareReminder.h; sourceTree = SOURCE_ROOT; }; + CE2A29F313213BE3005899AC /* ExtraFairwareReminder.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = ExtraFairwareReminder.m; path = ../base/ExtraFairwareReminder.m; sourceTree = SOURCE_ROOT; }; + CE2A29F613213BFB005899AC /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = ../base/en.lproj/ExtraFairwareReminder.xib; sourceTree = SOURCE_ROOT; }; + CE2A29FF13213C31005899AC /* PyExtraFairwareReminder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PyExtraFairwareReminder.h; path = ../base/PyExtraFairwareReminder.h; sourceTree = SOURCE_ROOT; }; CE381C9409914ACE003581CE /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = SOURCE_ROOT; }; CE381C9509914ACE003581CE /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = SOURCE_ROOT; }; CE381C9A09914ADF003581CE /* ResultWindow.m */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.objc; path = ResultWindow.m; sourceTree = SOURCE_ROOT; }; @@ -184,6 +190,7 @@ CEC9DB4B12CCAA7D003102F0 /* HSAboutBox.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = HSAboutBox.m; path = ../../cocoalib/HSAboutBox.m; sourceTree = SOURCE_ROOT; }; CECA899A09DB132E00A3D774 /* DetailsPanel.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = DetailsPanel.h; sourceTree = ""; }; CECA899B09DB132E00A3D774 /* DetailsPanel.m */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.objc; path = DetailsPanel.m; sourceTree = ""; }; + CEE660B7132253910036DB04 /* fr */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = fr; path = ../base/fr.lproj/ExtraFairwareReminder.xib; sourceTree = SOURCE_ROOT; }; CEEB135109C837A2004D2330 /* dupeguru.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = dupeguru.icns; sourceTree = ""; }; CEF12A7C124DFD400087B51D /* HSTableView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = HSTableView.h; path = ../../cocoalib/views/HSTableView.h; sourceTree = SOURCE_ROOT; }; CEF12A7D124DFD400087B51D /* HSTableView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = HSTableView.m; path = ../../cocoalib/views/HSTableView.m; sourceTree = SOURCE_ROOT; }; @@ -299,6 +306,7 @@ CE05339912E5DA350029EF25 /* ResultWindow.xib */, CE0533A312E5DA4D0029EF25 /* DetailsPanel.xib */, CE0533A512E5DA4D0029EF25 /* Preferences.xib */, + CE2A29F513213BFB005899AC /* ExtraFairwareReminder.xib */, ); name = xib; sourceTree = ""; @@ -354,6 +362,7 @@ CE80DB810FC194BD0086DCA6 /* dgbase */ = { isa = PBXGroup; children = ( + CE2A29FF13213C31005899AC /* PyExtraFairwareReminder.h */, CEF12A81124DFD620087B51D /* PyResultTable.h */, CEF12A82124DFD620087B51D /* ResultTable.h */, CEF12A83124DFD620087B51D /* ResultTable.m */, @@ -372,6 +381,8 @@ CE80DB890FC1951C0086DCA6 /* ResultWindow.m */, CE95865C112C516400F95FD2 /* StatsLabel.h */, CE95865D112C516400F95FD2 /* StatsLabel.m */, + CE2A29F213213BE3005899AC /* ExtraFairwareReminder.h */, + CE2A29F313213BE3005899AC /* ExtraFairwareReminder.m */, CE80DB870FC1951C0086DCA6 /* PyDupeGuru.h */, CE18126F111C9D5100E49FCE /* PyDetailsPanel.h */, CE9EA7711122CA0B008CD2BC /* PyDirectoryOutline.h */, @@ -512,6 +523,7 @@ CE0533A812E5DA4D0029EF25 /* Preferences.xib in Resources */, CE0533AB12E5DA6A0029EF25 /* Localizable.strings in Resources */, CE4527AC12E5F6E700005A15 /* core.strings in Resources */, + CE2A29F713213BFB005899AC /* ExtraFairwareReminder.xib in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -555,6 +567,7 @@ CE1EB5FE12537F9D0034AABB /* HSFairwareReminder.m in Sources */, CEC9DB4C12CCAA7D003102F0 /* HSAboutBox.m in Sources */, CE60180812DF3EA900236FDC /* HSRecentFiles.m in Sources */, + CE2A29F413213BE3005899AC /* ExtraFairwareReminder.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -634,6 +647,15 @@ path = ../../cocoalib/xib; sourceTree = SOURCE_ROOT; }; + CE2A29F513213BFB005899AC /* ExtraFairwareReminder.xib */ = { + isa = PBXVariantGroup; + children = ( + CE2A29F613213BFB005899AC /* en */, + CEE660B7132253910036DB04 /* fr */, + ); + name = ExtraFairwareReminder.xib; + sourceTree = SOURCE_ROOT; + }; CE4527AA12E5F6E700005A15 /* core.strings */ = { isa = PBXVariantGroup; children = ( diff --git a/cocoa/se/dupeguru.xcodeproj/project.pbxproj b/cocoa/se/dupeguru.xcodeproj/project.pbxproj index 11d4792f..2a1661b4 100644 --- a/cocoa/se/dupeguru.xcodeproj/project.pbxproj +++ b/cocoa/se/dupeguru.xcodeproj/project.pbxproj @@ -21,6 +21,8 @@ CE45579B0AE3BC2B005A9546 /* Sparkle.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CE45579A0AE3BC2B005A9546 /* Sparkle.framework */; }; CE4557B40AE3BC50005A9546 /* Sparkle.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = CE45579A0AE3BC2B005A9546 /* Sparkle.framework */; }; CE647E571173024A006D28BA /* ProblemDialog.m in Sources */ = {isa = PBXBuildFile; fileRef = CE647E551173024A006D28BA /* ProblemDialog.m */; }; + CE665B3013225ADD003F5CFB /* ExtraFairwareReminder.m in Sources */ = {isa = PBXBuildFile; fileRef = CE665B2E13225ADD003F5CFB /* ExtraFairwareReminder.m */; }; + CE665B3313225AF8003F5CFB /* ExtraFairwareReminder.xib in Resources */ = {isa = PBXBuildFile; fileRef = CE665B3113225AF8003F5CFB /* ExtraFairwareReminder.xib */; }; CE6DD4E7124CA3070089A48D /* ResultTable.m in Sources */ = {isa = PBXBuildFile; fileRef = CE6DD4E6124CA3070089A48D /* ResultTable.m */; }; CE6DD547124CAF1F0089A48D /* HSTableView.m in Sources */ = {isa = PBXBuildFile; fileRef = CE6DD546124CAF1F0089A48D /* HSTableView.m */; }; CE6E0DFE1054E9EF008D9390 /* dsa_pub.pem in Resources */ = {isa = PBXBuildFile; fileRef = CE6E0DFD1054E9EF008D9390 /* dsa_pub.pem */; }; @@ -97,6 +99,11 @@ CE647E541173024A006D28BA /* ProblemDialog.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ProblemDialog.h; path = ../base/ProblemDialog.h; sourceTree = SOURCE_ROOT; }; CE647E551173024A006D28BA /* ProblemDialog.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = ProblemDialog.m; path = ../base/ProblemDialog.m; sourceTree = SOURCE_ROOT; }; CE647E561173024A006D28BA /* PyProblemDialog.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PyProblemDialog.h; path = ../base/PyProblemDialog.h; sourceTree = SOURCE_ROOT; }; + CE665B2D13225ADD003F5CFB /* ExtraFairwareReminder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ExtraFairwareReminder.h; path = ../base/ExtraFairwareReminder.h; sourceTree = SOURCE_ROOT; }; + CE665B2E13225ADD003F5CFB /* ExtraFairwareReminder.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = ExtraFairwareReminder.m; path = ../base/ExtraFairwareReminder.m; sourceTree = SOURCE_ROOT; }; + CE665B2F13225ADD003F5CFB /* PyExtraFairwareReminder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PyExtraFairwareReminder.h; path = ../base/PyExtraFairwareReminder.h; sourceTree = SOURCE_ROOT; }; + CE665B3213225AF8003F5CFB /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = ../base/en.lproj/ExtraFairwareReminder.xib; sourceTree = SOURCE_ROOT; }; + CE665B3413225B07003F5CFB /* fr */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = fr; path = ../base/fr.lproj/ExtraFairwareReminder.xib; sourceTree = SOURCE_ROOT; }; CE6DD4E4124CA3070089A48D /* PyResultTable.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PyResultTable.h; path = ../base/PyResultTable.h; sourceTree = SOURCE_ROOT; }; CE6DD4E5124CA3070089A48D /* ResultTable.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ResultTable.h; path = ../base/ResultTable.h; sourceTree = SOURCE_ROOT; }; CE6DD4E6124CA3070089A48D /* ResultTable.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = ResultTable.m; path = ../base/ResultTable.m; sourceTree = SOURCE_ROOT; }; @@ -340,6 +347,7 @@ CE81134812E5CE4D00A36C80 /* ProblemDialog.xib */, CE81134A12E5CE4D00A36C80 /* ResultWindow.xib */, CE81135612E5CE6D00A36C80 /* Preferences.xib */, + CE665B3113225AF8003F5CFB /* ExtraFairwareReminder.xib */, ); name = xib; sourceTree = ""; @@ -403,6 +411,8 @@ CEE7EA120FE675C80004E467 /* DetailsPanel.m */, CEFC7FB40FC951A700CD5728 /* DirectoryPanel.h */, CEFC7FB50FC951A700CD5728 /* DirectoryPanel.m */, + CE665B2D13225ADD003F5CFB /* ExtraFairwareReminder.h */, + CE665B2E13225ADD003F5CFB /* ExtraFairwareReminder.m */, CEFC7FB60FC951A700CD5728 /* PyDupeGuru.h */, CE6E7407111C997500C350E3 /* PyDetailsPanel.h */, CEFC7FB70FC951A700CD5728 /* ResultWindow.h */, @@ -410,6 +420,7 @@ CE647E541173024A006D28BA /* ProblemDialog.h */, CE647E551173024A006D28BA /* ProblemDialog.m */, CE647E561173024A006D28BA /* PyProblemDialog.h */, + CE665B2F13225ADD003F5CFB /* PyExtraFairwareReminder.h */, ); name = dgbase; sourceTree = ""; @@ -487,6 +498,7 @@ CE81135812E5CE6D00A36C80 /* Preferences.xib in Resources */, CE8113EB12E5CE9A00A36C80 /* Localizable.strings in Resources */, CE4526F212E5F55F00005A15 /* core.strings in Resources */, + CE665B3313225AF8003F5CFB /* ExtraFairwareReminder.xib in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -526,6 +538,7 @@ CE79638C12536F4E008D405B /* HSFairwareReminder.m in Sources */, CE27D3C412CCA43800859E67 /* HSAboutBox.m in Sources */, CEF0ACCE12DF3C2000B32F7E /* HSRecentFiles.m in Sources */, + CE665B3013225ADD003F5CFB /* ExtraFairwareReminder.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -541,6 +554,15 @@ name = core.strings; sourceTree = SOURCE_ROOT; }; + CE665B3113225AF8003F5CFB /* ExtraFairwareReminder.xib */ = { + isa = PBXVariantGroup; + children = ( + CE665B3213225AF8003F5CFB /* en */, + CE665B3413225B07003F5CFB /* fr */, + ); + name = ExtraFairwareReminder.xib; + sourceTree = SOURCE_ROOT; + }; CE79638412536C94008D405B /* FairwareReminder.xib */ = { isa = PBXVariantGroup; children = ( diff --git a/core/app.py b/core/app.py index 481ec40e..1da0d965 100644 --- a/core/app.py +++ b/core/app.py @@ -150,6 +150,9 @@ class DupeGuru(RegistrableApplication, Broadcaster): def _set_default(self, key_name, value): raise NotImplementedError() + def _show_extra_fairware_reminder(self): + raise NotImplementedError() + #--- Public def add_directory(self, d): try: @@ -178,6 +181,10 @@ class DupeGuru(RegistrableApplication, Broadcaster): self.results.apply_filter(filter) self._results_changed() + def show_extra_fairware_reminder_if_needed(self): + if self.results.mark_count > 100 and self.should_show_fairware_reminder: + self._show_extra_fairware_reminder() + def clean_empty_dirs(self, path): if self.options['clean_empty_dirs']: while delete_if_empty(path, ['.DS_Store']): @@ -216,10 +223,12 @@ class DupeGuru(RegistrableApplication, Broadcaster): j.start_job(self.results.mark_count) self.results.perform_on_marked(op, not copy) + self.show_extra_fairware_reminder_if_needed() jobid = JOB_COPY if copy else JOB_MOVE self._start_job(jobid, do) def delete_marked(self, replace_with_hardlinks=False): + self.show_extra_fairware_reminder_if_needed() self._start_job(JOB_DELETE, self._do_delete, replace_with_hardlinks) def export_to_xhtml(self, column_ids): diff --git a/core/app_cocoa.py b/core/app_cocoa.py index 7efd56a0..3a2c54ab 100644 --- a/core/app_cocoa.py +++ b/core/app_cocoa.py @@ -64,6 +64,9 @@ class DupeGuru(app.DupeGuru): def _set_default(self, key_name, value): NSUserDefaults.standardUserDefaults().setObject_forKey_(value, key_name) + def _show_extra_fairware_reminder(self): + NSNotificationCenter.defaultCenter().postNotificationName_object_userInfo_('ShowExtraFairwareReminder', self, None) + #--- Public def start_scanning(self): self._select_dupes([]) diff --git a/core/app_cocoa_inter.py b/core/app_cocoa_inter.py index 490ab35c..a42aac30 100644 --- a/core/app_cocoa_inter.py +++ b/core/app_cocoa_inter.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- # Created By: Virgil Dupras # Created On: 2010-02-02 # Copyright 2010 Hardcoded Software (http://www.hardcoded.net) @@ -17,6 +16,7 @@ from .gui.problem_dialog import ProblemDialog from .gui.problem_table import ProblemTable from .gui.result_table import ResultTable from .gui.stats_label import StatsLabel +from .gui.extra_fairware_reminder import ExtraFairwareReminder class PyDupeGuruBase(PyFairware): #---Directories @@ -236,3 +236,26 @@ class PyProblemDialog(PyGUIObject): class PyProblemTable(PyTable): py_class = ProblemTable + +class PyExtraFairwareReminder(PyGUIObject): + py_class = ExtraFairwareReminder + + def start(self): + self.py.start() + + def updateButton(self): + self.py.update_button() + + # model --> view + def start_timer(self): + self.cocoa.startTimer() + + def stop_timer(self): + self.cocoa.stopTimer() + + def enable_button(self): + self.cocoa.enableButton() + + def set_button_text(self, text): + self.cocoa.setButtonText_(text) + diff --git a/core/gui/extra_fairware_reminder.py b/core/gui/extra_fairware_reminder.py new file mode 100644 index 00000000..a8c0039e --- /dev/null +++ b/core/gui/extra_fairware_reminder.py @@ -0,0 +1,30 @@ +# Created By: Virgil Dupras +# Created On: 2011-03-04 +# Copyright 2011 Hardcoded Software (http://www.hardcoded.net) +# +# This software is licensed under the "BSD" License as described in the "LICENSE" file, +# which should be included with this package. The terms are also available at +# http://www.hardcoded.net/licenses/bsd_license + +import time + +from hscommon.trans import tr +from .base import GUIObject + +class ExtraFairwareReminder(GUIObject): + def start(self): + self.start_time = time.time() + self.view.start_timer() + + def update_button(self): + elapsed = time.time() - self.start_time + remaining = 60 - round(elapsed) + if remaining > 0: + text = tr("Continue ({})").format(remaining) + else: + text = tr("Continue") + self.view.enable_button() + self.view.stop_timer() + self.view.set_button_text(text) + + \ No newline at end of file diff --git a/qt/base/app.py b/qt/base/app.py index 23e735ff..bbb7454b 100644 --- a/qt/base/app.py +++ b/qt/base/app.py @@ -26,6 +26,7 @@ from qtlib.recent import Recent from qtlib.reg import Registration from . import platform +from .extra_fairware_reminder import ExtraFairwareReminder from .result_window import ResultWindow from .directories_dialog import DirectoriesDialog from .problem_dialog import ProblemDialog @@ -163,6 +164,10 @@ class DupeGuru(DupeGuruBase, QObject): def _set_default(self, key, value): self.prefs.set_value(key, value) + def _show_extra_fairware_reminder(self): + dialog = ExtraFairwareReminder(self.directories_dialog, self) + dialog.exec_() + def add_selected_to_ignore_list(self): dupes = self.without_ref(self.selected_dupes) if not dupes: diff --git a/qt/base/extra_fairware_reminder.py b/qt/base/extra_fairware_reminder.py new file mode 100644 index 00000000..9138e783 --- /dev/null +++ b/qt/base/extra_fairware_reminder.py @@ -0,0 +1,90 @@ +# Created By: Virgil Dupras +# Created On: 2011-03-04 +# Copyright 2011 Hardcoded Software (http://www.hardcoded.net) +# +# This software is licensed under the "BSD" License as described in the "LICENSE" file, +# which should be included with this package. The terms are also available at +# http://www.hardcoded.net/licenses/bsd_license + +import sys + +from PyQt4.QtCore import Qt, QUrl, QTimer +from PyQt4.QtGui import (QDialog, QDesktopServices, QApplication, QVBoxLayout, QHBoxLayout, QLabel, + QFont, QSpacerItem, QSizePolicy, QPushButton) + +from hscommon.trans import tr as trbase, trmsg as trmsgbase +tr = lambda s: trbase(s, "ExtraFairwareReminder") +trmsg = lambda s: trmsgbase(s, "ExtraFairwareReminder") +from core.gui.extra_fairware_reminder import ExtraFairwareReminder as ExtraFairwareReminderModel + +class ExtraFairwareReminder(QDialog): + def __init__(self, parent, app): + flags = Qt.CustomizeWindowHint | Qt.WindowTitleHint + QDialog.__init__(self, parent, flags) + self.setModal(True) + self.app = app + self.model = ExtraFairwareReminderModel(self, app) + self._setupUi() + + self.continueButton.setEnabled(False) + self.continueButton.clicked.connect(self.accept) + self.contributeButton.clicked.connect(self.contributeClicked) + self.model.start() + + def _setupUi(self): + self.setWindowTitle(tr("Sorry, I must insist")) + self.resize(380, 350) + self.verticalLayout = QVBoxLayout(self) + self.descLabel = QLabel(self) + self.descLabel.setText(trmsg("ExtraFairwarePromptMsg")) + self.descLabel.setWordWrap(True) + self.verticalLayout.addWidget(self.descLabel) + self.reasonLabel = QLabel(self) + self.reasonLabel.setText(trmsg("ExtraFairwareReasonMsg")) + self.reasonLabel.setWordWrap(True) + font = QFont() + font.setWeight(75) + font.setBold(True) + self.reasonLabel.setFont(font) + self.verticalLayout.addWidget(self.reasonLabel) + self.horizontalLayout = QHBoxLayout() + spacerItem = QSpacerItem(40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum) + self.horizontalLayout.addItem(spacerItem) + self.contributeButton = QPushButton(self) + self.contributeButton.setText(tr("Contribute")) + self.horizontalLayout.addWidget(self.contributeButton) + self.continueButton = QPushButton(self) + self.continueButton.setText(tr("Continue")) + self.horizontalLayout.addWidget(self.continueButton) + self.verticalLayout.addLayout(self.horizontalLayout) + + #--- model --> view + def start_timer(self): + self._timer = QTimer() + self._timer.setInterval(200) + self._timer.timeout.connect(self.model.update_button) + self._timer.start() + + def stop_timer(self): + self._timer.stop() + del self._timer + + def enable_button(self): + self.continueButton.setEnabled(True) + + def set_button_text(self, text): + self.continueButton.setText(text) + + #--- Events + def contributeClicked(self): + url = QUrl('http://open.hardcoded.net/contribute/') + QDesktopServices.openUrl(url) + + +if __name__ == '__main__': + app = QApplication([]) + class FakeReg: + app = app + dialog = ExtraFairwareReminder(None, FakeReg()) + dialog.show() + sys.exit(app.exec_()) \ No newline at end of file diff --git a/qt/lang/en.ts b/qt/lang/en.ts index d243de95..a9b4c869 100644 --- a/qt/lang/en.ts +++ b/qt/lang/en.ts @@ -100,4 +100,24 @@ Picture cache cleared. + + +ExtraFairwareReminder + + ExtraFairwarePromptMsg + It seems that you found a lot of duplicates. Nice! I must insist, however, that contributions are expected when there are unpaid hours on the project. + +You might think "but I'm only going to use this once, I don't have to contribute". The problem is that most people use dupeGuru only once in a while. If everyone thinks like that, dupeGuru development cannot be funded. It's because of this tendency inherent to dupeGuru's nature that I have to insist here. + +If you can't afford to contribute, you can ignore this reminder or send me an e-mail at hsoft@hardcoded.net so I can give you a key to remove this reminder. + + + ExtraFairwareReasonMsg + This reminder showed up because: + +1. You are processing more than 100 duplicates +2. You have not yet contributed to dupeGuru +3. There are unpaid hours in the project + + \ No newline at end of file diff --git a/qt/lang/fr.ts b/qt/lang/fr.ts index 8e5ad3e4..37641882 100644 --- a/qt/lang/fr.ts +++ b/qt/lang/fr.ts @@ -74,6 +74,15 @@ Prioritization des groupes + + Continue + Continuer + + + Continue ({}) + Continuer ({}) + + Analyzed %d/%d pictures Analyzé %d/%d images @@ -629,6 +638,34 @@ + + +ExtraFairwareReminder + + Sorry, I must insist + Désolé, je dois insister + + + Contribute + Contribuer + + + ExtraFairwarePromptMsg + Il semble que vous ayez trouvé beaucoup de doublons. Super! Je dois par contre insister que des contributions sont attendues lorsqu'il y'a des heures non-payées au projet. + +Vous pensez peut-être "je n'utiliserai ce programme qu'une fois, pas besoin de contribuer". Le problème c'est que la plupart des utilisateurs de dupeGuru ne l'utilisent qu'une fois. Si tous suivent ce raisonnement, le développement de dupeGuru ne peut pas continuer. C'est à cause de cette tendance inhérente à la nature de dupeGuru que je me vois contraint d'insister ici. + +Si vous n'avez pas les moyens de contribuer, ignorez ce message ou envoyez moi un message à hsoft@hardcoded.net pour que je vous envoie une clé d'enregistrement. + + + ExtraFairwareReasonMsg + Ce rappel apparaît parce que: + +1. Plus de 100 doublons sont traités +2. Vous n'avez pas encore contribué à dupeGuru +3. Il y a des heures non-payées au projet + + message