From f5be59831142b323d0587dc4c36906d2eec9c854 Mon Sep 17 00:00:00 2001 From: Christopher Snowhill Date: Sun, 24 Nov 2024 19:47:55 -0800 Subject: [PATCH] Add support for custom Dock icons while running The emoji labeled buttons will convert and save their respective state icon to the settings folder, and refresh the current icon as necessary. Signed-off-by: Christopher Snowhill --- Application/DockIconController.h | 7 ++ Application/DockIconController.m | 78 ++++++++++++++-- Preferences/Preferences/AppearancePane.h | 19 ++++ Preferences/Preferences/AppearancePane.m | 90 +++++++++++++++++++ .../Preferences/Base.lproj/Preferences.xib | 84 ++++++++++++++--- .../Preferences/GeneralPreferencesPlugin.h | 3 +- .../Preferences/GeneralPreferencesPlugin.m | 5 +- .../Preferences.xcodeproj/project.pbxproj | 6 ++ .../Preferences/en.lproj/Preferences.strings | 6 ++ .../Preferences/es.lproj/Preferences.strings | 6 ++ .../Preferences/pl.lproj/Preferences.strings | 6 ++ .../Preferences/ru.lproj/Preferences.strings | 6 ++ .../Preferences/tr.lproj/Preferences.strings | 6 ++ en.lproj/Credits.html | 2 +- es.lproj/Credits.html | 2 +- pl.lproj/Credits.html | 2 +- ru.lproj/Credits.html | 2 +- tr.lproj/Credits.html | 2 +- 18 files changed, 305 insertions(+), 27 deletions(-) create mode 100644 Preferences/Preferences/AppearancePane.h create mode 100644 Preferences/Preferences/AppearancePane.m diff --git a/Application/DockIconController.h b/Application/DockIconController.h index ed88b2078..c60e8d694 100644 --- a/Application/DockIconController.h +++ b/Application/DockIconController.h @@ -13,6 +13,13 @@ @interface DockIconController : NSObject { NSImage *dockImage; + NSInteger lastDockCustom; + NSInteger lastDockCustomPlaque; + NSInteger dockCustomLoaded; + NSImage *dockCustomStop; + NSImage *dockCustomPlay; + NSImage *dockCustomPause; + IBOutlet PlaybackController *playbackController; NSInteger lastPlaybackStatus; diff --git a/Application/DockIconController.m b/Application/DockIconController.m index 4d9f77905..10ea9de35 100644 --- a/Application/DockIconController.m +++ b/Application/DockIconController.m @@ -14,16 +14,24 @@ static NSString *DockIconPlaybackStatusObservationContext = @"DockIconPlaybackStatusObservationContext"; +static NSString *CogCustomDockIconsReloadNotification = @"CogCustomDockIconsReloadNotification"; + - (void)startObserving { [playbackController addObserver:self forKeyPath:@"playbackStatus" options:(NSKeyValueObservingOptionNew | NSKeyValueObservingOptionInitial) context:(__bridge void *_Nullable)(DockIconPlaybackStatusObservationContext)]; [playbackController addObserver:self forKeyPath:@"progressOverall" options:(NSKeyValueObservingOptionNew | NSKeyValueObservingOptionInitial | NSKeyValueObservingOptionOld) context:(__bridge void *_Nullable)(DockIconPlaybackStatusObservationContext)]; [[NSUserDefaultsController sharedUserDefaultsController] addObserver:self forKeyPath:@"values.colorfulDockIcons" options:0 context:(__bridge void *_Nullable)(DockIconPlaybackStatusObservationContext)]; + [[NSUserDefaultsController sharedUserDefaultsController] addObserver:self forKeyPath:@"values.customDockIcons" options:0 context:(__bridge void *_Nullable)(DockIconPlaybackStatusObservationContext)]; + [[NSUserDefaultsController sharedUserDefaultsController] addObserver:self forKeyPath:@"values.customDockIconsPlaque" options:0 context:(__bridge void *_Nullable)(DockIconPlaybackStatusObservationContext)]; + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(refreshDockIcons:) name:CogCustomDockIconsReloadNotification object:nil]; } - (void)stopObserving { [playbackController removeObserver:self forKeyPath:@"playbackStatus" context:(__bridge void *_Nullable)(DockIconPlaybackStatusObservationContext)]; [playbackController removeObserver:self forKeyPath:@"progressOverall" context:(__bridge void *_Nullable)(DockIconPlaybackStatusObservationContext)]; [[NSUserDefaultsController sharedUserDefaultsController] removeObserver:self forKeyPath:@"values.colorfulDockIcons" context:(__bridge void *_Nullable)(DockIconPlaybackStatusObservationContext)]; + [[NSUserDefaultsController sharedUserDefaultsController] removeObserver:self forKeyPath:@"values.customDockIcons" context:(__bridge void *_Nullable)(DockIconPlaybackStatusObservationContext)]; + [[NSUserDefaultsController sharedUserDefaultsController] removeObserver:self forKeyPath:@"values.customDockIconsPlaque" context:(__bridge void *_Nullable)(DockIconPlaybackStatusObservationContext)]; + [[NSNotificationCenter defaultCenter] removeObserver:self name:CogCustomDockIconsReloadNotification object:nil]; } - (void)startObservingProgress:(NSProgress *)progress { @@ -42,6 +50,34 @@ static NSString *getBadgeName(NSString *baseName, BOOL colorfulIcons) { } } +static NSString *getCustomIconName(NSString *baseName) { + NSArray *paths = NSSearchPathForDirectoriesInDomains(NSApplicationSupportDirectory, NSUserDomainMask, YES); + NSString *basePath = [[paths firstObject] stringByAppendingPathComponent:@"Cog"]; + basePath = [basePath stringByAppendingPathComponent:@"Icons"]; + basePath = [basePath stringByAppendingPathComponent:baseName]; + return [basePath stringByAppendingPathExtension:@"png"]; +} + +- (BOOL)loadCustomDockIcons { + NSError *error = nil; + NSData *dataStopIcon = [NSData dataWithContentsOfFile:getCustomIconName(@"Stop") options:(NSDataReadingMappedIfSafe) error:&error]; + if(!dataStopIcon || error) { + return NO; + } + NSData *dataPlayIcon = [NSData dataWithContentsOfFile:getCustomIconName(@"Play") options:(NSDataReadingMappedIfSafe) error:&error]; + if(!dataPlayIcon || error) { + return NO; + } + NSData *dataPauseIcon = [NSData dataWithContentsOfFile:getCustomIconName(@"Pause") options:(NSDataReadingMappedIfSafe) error:&error]; + if(!dataPauseIcon || error) { + return NO; + } + dockCustomStop = [[NSImage alloc] initWithData:dataStopIcon]; + dockCustomPlay = [[NSImage alloc] initWithData:dataPlayIcon]; + dockCustomPause = [[NSImage alloc] initWithData:dataPauseIcon]; + return (dockCustomStop && dockCustomPlay && dockCustomPause); +} + - (void)refreshDockIcon:(NSInteger)playbackStatus withProgress:(double)progressStatus { // Really weird crash user experienced because the plaque image didn't load? if(!dockImage || dockImage.size.width == 0 || dockImage.size.height == 0) return; @@ -50,6 +86,30 @@ static NSString *getBadgeName(NSString *baseName, BOOL colorfulIcons) { BOOL drawIcon = NO; BOOL removeProgress = NO; + BOOL useCustomDockIcons = [[NSUserDefaults standardUserDefaults] boolForKey:@"customDockIcons"]; + BOOL useCustomDockIconsPlaque = [[NSUserDefaults standardUserDefaults] boolForKey:@"customDockIconsPlaque"]; + + if(useCustomDockIcons && !dockCustomLoaded) { + dockCustomLoaded = [self loadCustomDockIcons]; + if(!dockCustomLoaded) { + useCustomDockIcons = NO; + } + } + + if(useCustomDockIcons != lastDockCustom || + useCustomDockIconsPlaque != lastDockCustomPlaque) { + lastDockCustom = useCustomDockIcons; + lastDockCustomPlaque = useCustomDockIconsPlaque; + drawIcon = YES; + + if(!useCustomDockIcons) { + dockCustomLoaded = NO; + dockCustomStop = nil; + dockCustomPlay = nil; + dockCustomPause = nil; + } + } + if(playbackStatus < 0) playbackStatus = lastPlaybackStatus; else { @@ -82,20 +142,20 @@ static NSString *getBadgeName(NSString *baseName, BOOL colorfulIcons) { if(drawIcon) { switch(playbackStatus) { case CogStatusPlaying: - badgeImage = [NSImage imageNamed:getBadgeName(@"Play", colorfulIcons)]; + badgeImage = useCustomDockIcons ? dockCustomPlay : [NSImage imageNamed:getBadgeName(@"Play", colorfulIcons)]; break; case CogStatusPaused: - badgeImage = [NSImage imageNamed:getBadgeName(@"Pause", colorfulIcons)]; + badgeImage = useCustomDockIcons ? dockCustomPause : [NSImage imageNamed:getBadgeName(@"Pause", colorfulIcons)]; break; default: - badgeImage = [NSImage imageNamed:getBadgeName(@"Stop", colorfulIcons)]; + badgeImage = useCustomDockIcons ? dockCustomStop : [NSImage imageNamed:getBadgeName(@"Stop", colorfulIcons)]; break; } NSSize badgeSize = [badgeImage size]; - NSImage *newDockImage = [dockImage copy]; + NSImage *newDockImage = (useCustomDockIcons && !useCustomDockIconsPlaque) ? [[NSImage alloc] initWithSize:NSMakeSize(1024, 1024)] : [dockImage copy]; [newDockImage lockFocus]; [badgeImage drawInRect:NSMakeRect(0, 0, 1024, 1024) @@ -186,7 +246,9 @@ static NSString *getBadgeName(NSString *baseName, BOOL colorfulIcons) { } [self refreshDockIcon:-1 withProgress:progressStatus]; - } else if([keyPath isEqualToString:@"values.colorfulDockIcons"]) { + } else if([keyPath isEqualToString:@"values.colorfulDockIcons"] || + [keyPath isEqualToString:@"values.customDockIcons"] || + [keyPath isEqualToString:@"values.customDockIconsPlaque"]) { [self refreshDockIcon:-1 withProgress:-10]; } else if([keyPath isEqualToString:@"fractionCompleted"]) { double progressStatus = [(NSProgress *)object fractionCompleted]; @@ -197,6 +259,12 @@ static NSString *getBadgeName(NSString *baseName, BOOL colorfulIcons) { } } +- (void)refreshDockIcons:(NSNotification *)notification { + lastDockCustom = NO; + dockCustomLoaded = NO; + [self refreshDockIcon:-1 withProgress:-10]; +} + - (void)awakeFromNib { dockImage = [[NSImage imageNamed:@"Plaque"] copy]; lastColorfulStatus = -1; diff --git a/Preferences/Preferences/AppearancePane.h b/Preferences/Preferences/AppearancePane.h new file mode 100644 index 000000000..95da5d9a3 --- /dev/null +++ b/Preferences/Preferences/AppearancePane.h @@ -0,0 +1,19 @@ +// +// AppearancePane.h +// General +// +// Created by Christopher Snowhill on 11/24/24. +// +// + +#import "GeneralPreferencePane.h" +#import + +@interface AppearancePane : GeneralPreferencePane { +} + +- (IBAction)setDockIconStop:(id)sender; +- (IBAction)setDockIconPlay:(id)sender; +- (IBAction)setDockIconPause:(id)sender; + +@end diff --git a/Preferences/Preferences/AppearancePane.m b/Preferences/Preferences/AppearancePane.m new file mode 100644 index 000000000..12a38d9d1 --- /dev/null +++ b/Preferences/Preferences/AppearancePane.m @@ -0,0 +1,90 @@ +// +// AppearancePane.m +// General +// +// Created by Christopher Snowhill on 11/24/24. +// +// + +#import "AppearancePane.h" + +static NSString *CogCustomDockIconsReloadNotification = @"CogCustomDockIconsReloadNotification"; + +@implementation AppearancePane + +- (NSString *)title { + return NSLocalizedPrefString(@"Appearance"); +} + +- (NSImage *)icon { + if(@available(macOS 11.0, *)) + return [NSImage imageWithSystemSymbolName:@"paintpalette.fill" accessibilityDescription:nil]; + return [[NSImage alloc] initWithContentsOfFile:[[NSBundle bundleForClass:[self class]] pathForImageResource:@"appearance"]]; +} + +- (void)setDockIcon:(NSString *)baseName { + NSArray *fileTypes = @[@"jpg", @"jpeg", @"png", @"gif", @"webp", @"avif", @"heic"]; + NSOpenPanel *panel = [NSOpenPanel openPanel]; + [panel setAllowsMultipleSelection:NO]; + [panel setCanChooseDirectories:NO]; + [panel setCanChooseFiles:YES]; + [panel setFloatingPanel:YES]; + [panel setAllowedFileTypes:fileTypes]; + NSInteger result = [panel runModal]; + if(result == NSModalResponseOK) { + NSError *error = nil; + NSData *iconData = [NSData dataWithContentsOfURL:[panel URL] options:NSDataReadingMappedIfSafe error:&error]; + if(iconData && !error) { + NSImage *icon = [[NSImage alloc] initWithData:iconData]; + if(icon) { + CGImageRef cgRef = [icon CGImageForProposedRect:NULL + context:nil + hints:nil]; + + if(cgRef) { + NSArray *paths = NSSearchPathForDirectoriesInDomains(NSApplicationSupportDirectory, NSUserDomainMask, YES); + NSString *basePath = [[paths firstObject] stringByAppendingPathComponent:@"Cog"]; + basePath = [basePath stringByAppendingPathComponent:@"Icons"]; + NSFileManager *fileManager = [NSFileManager defaultManager]; + BOOL isDirectory = NO; + if(![fileManager fileExistsAtPath:basePath isDirectory:&isDirectory] || !isDirectory) { + if(!isDirectory) { + [fileManager removeItemAtPath:basePath error:&error]; + } + [fileManager createDirectoryAtURL:[NSURL fileURLWithPath:basePath] withIntermediateDirectories:YES attributes:nil error:&error]; + } + + NSString *filePath = [basePath stringByAppendingPathComponent:baseName]; + filePath = [filePath stringByAppendingPathExtension:@"png"]; + + NSBitmapImageRep *newRep = + [[NSBitmapImageRep alloc] initWithCGImage:cgRef]; + NSData *pngData = [newRep + representationUsingType:NSBitmapImageFileTypePNG + properties:@{}]; + [pngData writeToURL:[NSURL fileURLWithPath:filePath] atomically:YES]; + + // Now to refresh the icons by a little trickery, if enabled + BOOL enabled = [[NSUserDefaults standardUserDefaults] boolForKey:@"customDockIcons"]; + if(enabled) { + [[NSNotificationCenter defaultCenter] postNotificationName:CogCustomDockIconsReloadNotification object:nil]; + } + } + } + } + } +} + +- (IBAction)setDockIconStop:(id)sender { + [self setDockIcon:@"Stop"]; +} + +- (IBAction)setDockIconPlay:(id)sender { + [self setDockIcon:@"Play"]; +} + +- (IBAction)setDockIconPause:(id)sender { + [self setDockIcon:@"Pause"]; +} + +@end diff --git a/Preferences/Preferences/Base.lproj/Preferences.xib b/Preferences/Preferences/Base.lproj/Preferences.xib index 6321cb34c..5ba60c05f 100644 --- a/Preferences/Preferences/Base.lproj/Preferences.xib +++ b/Preferences/Preferences/Base.lproj/Preferences.xib @@ -1,14 +1,14 @@ - + - + - + @@ -58,7 +58,7 @@ - + @@ -101,7 +101,7 @@ - + @@ -131,6 +131,11 @@ + + + + + @@ -293,7 +298,7 @@ - + @@ -323,7 +328,7 @@ - + @@ -568,11 +573,11 @@ - + + + + + @@ -716,7 +776,7 @@ - + @@ -746,7 +806,7 @@ - + @@ -776,7 +836,7 @@ - + diff --git a/Preferences/Preferences/GeneralPreferencesPlugin.h b/Preferences/Preferences/GeneralPreferencesPlugin.h index 91e49d217..9de6d4b32 100644 --- a/Preferences/Preferences/GeneralPreferencesPlugin.h +++ b/Preferences/Preferences/GeneralPreferencesPlugin.h @@ -14,16 +14,17 @@ #import "HotKeyPane.h" #import "MIDIPane.h" #import "OutputPane.h" +#import "AppearancePane.h" @interface GeneralPreferencesPlugin : NSObject { IBOutlet HotKeyPane *hotKeyPane; IBOutlet OutputPane *outputPane; IBOutlet MIDIPane *midiPane; IBOutlet GeneralPane *generalPane; + IBOutlet AppearancePane *appearancePane; IBOutlet NSView *playlistView; IBOutlet NSView *notificationsView; - IBOutlet NSView *appearanceView; __weak IBOutlet NSButton *iTunesStyleCheck; } diff --git a/Preferences/Preferences/GeneralPreferencesPlugin.m b/Preferences/Preferences/GeneralPreferencesPlugin.m index 2064e63ab..2ef9204c4 100644 --- a/Preferences/Preferences/GeneralPreferencesPlugin.m +++ b/Preferences/Preferences/GeneralPreferencesPlugin.m @@ -82,10 +82,7 @@ } - (GeneralPreferencePane *)appearancePane { - return [GeneralPreferencePane preferencePaneWithView:appearanceView - title:NSLocalizedPrefString(@"Appearance") - systemIconName:@"paintpalette.fill" - orOldIconNamed:@"appearance"]; + return appearancePane; } @end diff --git a/Preferences/Preferences/Preferences.xcodeproj/project.pbxproj b/Preferences/Preferences/Preferences.xcodeproj/project.pbxproj index eef5d27b7..7c9e59c51 100644 --- a/Preferences/Preferences/Preferences.xcodeproj/project.pbxproj +++ b/Preferences/Preferences/Preferences.xcodeproj/project.pbxproj @@ -25,6 +25,7 @@ 833A899F286FF3850022E036 /* TimeIntervalToStringTransformer.m in Sources */ = {isa = PBXBuildFile; fileRef = 833A899E286FF3850022E036 /* TimeIntervalToStringTransformer.m */; }; 83651DA527322C8700A2C097 /* MIDIFlavorBehaviorArrayController.m in Sources */ = {isa = PBXBuildFile; fileRef = 83651DA327322C8700A2C097 /* MIDIFlavorBehaviorArrayController.m */; }; 8372053718E3DEAF007EFAD4 /* ResamplerBehaviorArrayController.m in Sources */ = {isa = PBXBuildFile; fileRef = 8372053618E3DEAF007EFAD4 /* ResamplerBehaviorArrayController.m */; }; + 83726F022CF41B3200F15FBF /* AppearancePane.m in Sources */ = {isa = PBXBuildFile; fileRef = 83726F012CF41B3200F15FBF /* AppearancePane.m */; }; 837C0D401C50954000CAE18F /* MIDIPluginBehaviorArrayController.m in Sources */ = {isa = PBXBuildFile; fileRef = 837C0D3F1C50954000CAE18F /* MIDIPluginBehaviorArrayController.m */; }; 8384917718084D9F00E7332D /* appearance.png in Resources */ = {isa = PBXBuildFile; fileRef = 8384917518084D9F00E7332D /* appearance.png */; }; 8391EA06286F9D3200A37593 /* PathSuggester.xib in Resources */ = {isa = PBXBuildFile; fileRef = 83DAD9F0286EDBCD000FAA9A /* PathSuggester.xib */; }; @@ -119,6 +120,8 @@ 83651DA427322C8700A2C097 /* MIDIFlavorBehaviorArrayController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MIDIFlavorBehaviorArrayController.h; sourceTree = ""; }; 8372053518E3DEAF007EFAD4 /* ResamplerBehaviorArrayController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ResamplerBehaviorArrayController.h; sourceTree = ""; }; 8372053618E3DEAF007EFAD4 /* ResamplerBehaviorArrayController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ResamplerBehaviorArrayController.m; sourceTree = ""; }; + 83726F002CF41B3200F15FBF /* AppearancePane.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppearancePane.h; sourceTree = ""; }; + 83726F012CF41B3200F15FBF /* AppearancePane.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppearancePane.m; sourceTree = ""; }; 837C0D3E1C50954000CAE18F /* MIDIPluginBehaviorArrayController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MIDIPluginBehaviorArrayController.h; sourceTree = ""; }; 837C0D3F1C50954000CAE18F /* MIDIPluginBehaviorArrayController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MIDIPluginBehaviorArrayController.m; sourceTree = ""; }; 8384913618081ECB00E7332D /* Logging.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Logging.h; path = ../../Utils/Logging.h; sourceTree = ""; }; @@ -258,6 +261,8 @@ 17D5033F0ABDB1570022D1E8 /* Panes */ = { isa = PBXGroup; children = ( + 83726F002CF41B3200F15FBF /* AppearancePane.h */, + 83726F012CF41B3200F15FBF /* AppearancePane.m */, 8E07AA820AAC8EA200A4B32F /* GeneralPreferencePane.h */, 8E07AA830AAC8EA200A4B32F /* GeneralPreferencePane.m */, 8E07AA800AAC8EA200A4B32F /* HotKeyPane.h */, @@ -494,6 +499,7 @@ buildActionMask = 2147483647; files = ( 83AC573A2861A54D009D6F50 /* PathSuggester.m in Sources */, + 83726F022CF41B3200F15FBF /* AppearancePane.m in Sources */, 83651DA527322C8700A2C097 /* MIDIFlavorBehaviorArrayController.m in Sources */, 83B06729180D85B8008E3612 /* MIDIPane.m in Sources */, 8E07AA880AAC8EA200A4B32F /* HotKeyPane.m in Sources */, diff --git a/Preferences/Preferences/en.lproj/Preferences.strings b/Preferences/Preferences/en.lproj/Preferences.strings index 4fcf03f27..6d6121ef6 100644 --- a/Preferences/Preferences/en.lproj/Preferences.strings +++ b/Preferences/Preferences/en.lproj/Preferences.strings @@ -244,3 +244,9 @@ /* Class = "NSButtonCell"; title = "Reduce DSD volume level by 6 dB"; ObjectID = "Phw-hj-6tI"; */ "Phw-hj-6tI.title" = "Reduce DSD volume level by 6 dB"; + +/* Class = "NSButtonCell"; title = "Use custom dock icon set:"; ObjectID = "RwB-Tk-ufd"; */ +"RwB-Tk-ufd.title" = "Use custom dock icon set:"; + +/* Class = "NSButtonCell"; title = "Render over background plaque"; ObjectID = "KZd-iR-dXL"; */ +"KZd-iR-dXL.title" = "Render over background plaque"; diff --git a/Preferences/Preferences/es.lproj/Preferences.strings b/Preferences/Preferences/es.lproj/Preferences.strings index cd97ffa9e..537009622 100644 --- a/Preferences/Preferences/es.lproj/Preferences.strings +++ b/Preferences/Preferences/es.lproj/Preferences.strings @@ -243,3 +243,9 @@ /* Class = "NSButtonCell"; title = "Reduce DSD volume level by 6 dB"; ObjectID = "Phw-hj-6tI"; */ "Phw-hj-6tI.title" = "Reducir volumen de DSD en 6 dB"; + +/* Class = "NSButtonCell"; title = "Use custom dock icon set:"; ObjectID = "RwB-Tk-ufd"; */ +"RwB-Tk-ufd.title" = "Usar conjunto de iconos del dock personalizados:"; + +/* Class = "NSButtonCell"; title = "Render over background plaque"; ObjectID = "KZd-iR-dXL"; */ +"KZd-iR-dXL.title" = "Mostrar fondo del icono"; diff --git a/Preferences/Preferences/pl.lproj/Preferences.strings b/Preferences/Preferences/pl.lproj/Preferences.strings index f14cee53f..b5d0f5cf1 100644 --- a/Preferences/Preferences/pl.lproj/Preferences.strings +++ b/Preferences/Preferences/pl.lproj/Preferences.strings @@ -109,3 +109,9 @@ /* Class = "NSButtonCell"; title = "Reduce DSD volume level by 6 dB"; ObjectID = "Phw-hj-6tI"; */ "Phw-hj-6tI.title" = "Reduce DSD volume level by 6 dB"; + +/* Class = "NSButtonCell"; title = "Use custom dock icon set:"; ObjectID = "RwB-Tk-ufd"; */ +"RwB-Tk-ufd.title" = "własny zestaw ikon:"; + +/* Class = "NSButtonCell"; title = "Render over background plaque"; ObjectID = "KZd-iR-dXL"; */ +"KZd-iR-dXL.title" = "tarcza za ikoną"; diff --git a/Preferences/Preferences/ru.lproj/Preferences.strings b/Preferences/Preferences/ru.lproj/Preferences.strings index f0921a623..52c437142 100644 --- a/Preferences/Preferences/ru.lproj/Preferences.strings +++ b/Preferences/Preferences/ru.lproj/Preferences.strings @@ -205,3 +205,9 @@ /* Class = "NSButtonCell"; title = "Reduce DSD volume level by 6 dB"; ObjectID = "Phw-hj-6tI"; */ "Phw-hj-6tI.title" = "Reduce DSD volume level by 6 dB"; + +/* Class = "NSButtonCell"; title = "Use custom dock icon set:"; ObjectID = "RwB-Tk-ufd"; */ +"RwB-Tk-ufd.title" = "Используйте свой собственный набор икон:"; + +/* Class = "NSButtonCell"; title = "Render over background plaque"; ObjectID = "KZd-iR-dXL"; */ +"KZd-iR-dXL.title" = "Отображать икону над щитом"; diff --git a/Preferences/Preferences/tr.lproj/Preferences.strings b/Preferences/Preferences/tr.lproj/Preferences.strings index 8a09d3781..3b0c10078 100644 --- a/Preferences/Preferences/tr.lproj/Preferences.strings +++ b/Preferences/Preferences/tr.lproj/Preferences.strings @@ -244,3 +244,9 @@ /* Class = "NSButtonCell"; title = "Reduce DSD volume level by 6 dB"; ObjectID = "Phw-hj-6tI"; */ "Phw-hj-6tI.title" = "Reduce DSD volume level by 6 dB"; + +/* Class = "NSButtonCell"; title = "Use custom dock icon set:"; ObjectID = "RwB-Tk-ufd"; */ +"RwB-Tk-ufd.title" = "Sahip olduğunuz kendi ikon setini kullanın:"; + +/* Class = "NSButtonCell"; title = "Render over background plaque"; ObjectID = "KZd-iR-dXL"; */ +"KZd-iR-dXL.title" = "İkonun şaltırın üzerinde gösterilmesi"; diff --git a/en.lproj/Credits.html b/en.lproj/Credits.html index 2934edb70..1162483e6 100644 --- a/en.lproj/Credits.html +++ b/en.lproj/Credits.html @@ -31,7 +31,7 @@
Now with 92% more future!

Thanks to my patrons:
Alexander Pecheny, Electric Keet, Antti Aro, Fjölnir Ásgeirsson, Giampaolo Bellavite, Louis Martinez V, deef.xyz -

Additional code contributions by Dzmitry Neviadomski and Kevin López Brante. +

Additional code contributions by Dzmitry Neviadomski, Kevin López Brante and mpan.

This program has been made possible through contributions from users like you.

All Cog code is copyrighted by me, and is licensed under the GPL. Cog contains bits of other code from third parties that are under their own licenses. diff --git a/es.lproj/Credits.html b/es.lproj/Credits.html index cc8037bd3..65dbb67a0 100644 --- a/es.lproj/Credits.html +++ b/es.lproj/Credits.html @@ -31,7 +31,7 @@
¡Ahora con 92% más de futuro!

Gracias a mis patrocinadores:
Alexander Pecheny, Electric Keet, Antti Aro, Fjölnir Ásgeirsson, Giampaolo Bellavite, Louis Martinez V, deef.xyz -

Desarrollo adicional por Dzmitry Neviadomski and Kevin López Brante. +

Desarrollo adicional por Dzmitry Neviadomski, Kevin López Brante y mpan.
Traducido al español por Kevin López Brante.

Este programa ha sido posible gracias a las contribuciones de usuarios y usuarias como tú. diff --git a/pl.lproj/Credits.html b/pl.lproj/Credits.html index 2934edb70..1162483e6 100644 --- a/pl.lproj/Credits.html +++ b/pl.lproj/Credits.html @@ -31,7 +31,7 @@
Now with 92% more future!

Thanks to my patrons:
Alexander Pecheny, Electric Keet, Antti Aro, Fjölnir Ásgeirsson, Giampaolo Bellavite, Louis Martinez V, deef.xyz -

Additional code contributions by Dzmitry Neviadomski and Kevin López Brante. +

Additional code contributions by Dzmitry Neviadomski, Kevin López Brante and mpan.

This program has been made possible through contributions from users like you.

All Cog code is copyrighted by me, and is licensed under the GPL. Cog contains bits of other code from third parties that are under their own licenses. diff --git a/ru.lproj/Credits.html b/ru.lproj/Credits.html index e10393c78..2f2d000dd 100644 --- a/ru.lproj/Credits.html +++ b/ru.lproj/Credits.html @@ -31,7 +31,7 @@
Теперь на 92% больше функий!

Спасибо моим патронам:
Alexander Pecheny, Electric Keet, Antti Aro, Fjölnir Ásgeirsson, Giampaolo Bellavite, Louis Martinez V, deef.xyz -

Дополнительный вклад в разработку от Dzmitry Neviadomski и Kevin López Brante. +

Дополнительный вклад в разработку от Dzmitry Neviadomski, Kevin López Brante и mpan.

Создние этой программы стало возможным благодаря вкладу таких пользователей, как вы.

Весь код Cog защищен моим авторским правом и распространяется под лицензией GPL. Cog содержит фрагменты другого кода от третьих сторон, который находятся под их собственными лицензиями. diff --git a/tr.lproj/Credits.html b/tr.lproj/Credits.html index 2934edb70..1162483e6 100644 --- a/tr.lproj/Credits.html +++ b/tr.lproj/Credits.html @@ -31,7 +31,7 @@
Now with 92% more future!

Thanks to my patrons:
Alexander Pecheny, Electric Keet, Antti Aro, Fjölnir Ásgeirsson, Giampaolo Bellavite, Louis Martinez V, deef.xyz -

Additional code contributions by Dzmitry Neviadomski and Kevin López Brante. +

Additional code contributions by Dzmitry Neviadomski, Kevin López Brante and mpan.

This program has been made possible through contributions from users like you.

All Cog code is copyrighted by me, and is licensed under the GPL. Cog contains bits of other code from third parties that are under their own licenses.