Merge remote-tracking branch 'upstream/master' into windows

Conflicts:
	.gitignore
	SparkleShare/SparkleIntro.cs
	SparkleShare/SparkleShare.cs
	SparkleShare/SparkleUI.cs
This commit is contained in:
wimh 2011-07-19 23:20:21 +02:00
commit e11ba04bfb
106 changed files with 25460 additions and 5467 deletions

2
.gitignore vendored
View file

@ -44,5 +44,5 @@ SparkleShare/sparkleshare
po/sparkleshare.pot
SparkleShare/Nautilus/sparkleshare-nautilus-extension.py
gnome-doc-utils.make
sparkleshare-*
/sparkleshare-*
desktop.ini

View file

@ -24,6 +24,7 @@ Contributors:
Jakub Steiner <jimmac@redhat.com>
Kristi Tsukida <kristi.tsukida@gmail.com>
Lapo Calamandrei <calamandrei@gmail.com>
Lars Falk-Petersen <dev@falk-petersen.no>
Luis Cordova <cordoval@gmail.com>
Łukasz Jernaś <deejay1@srem.org>
Michael Monreal <michael.monreal@gmail.com>
@ -35,6 +36,7 @@ Contributors:
Sandy Armstrong <sanfordarmstrong@gmail.com>
Simon Pither <simon@pither.com>
Steven Harms <sharms@ubuntu.com>
Sven Mueller <thelightmaker@gmail.com>
Vincent Untz <vuntz@gnome.org>
Will Thompson <will@willthompson.co.uk>

View file

@ -1,11 +1,7 @@
SUBDIRS = \
build \
help \
SmartIrc4net \
SparkleLib \
SparkleShare \
data \
po
basedirs = build help SmartIrc4net SparkleLib data po
SUBDIRS = $(basedirs) $(GUISUBDIRS)
DIST_SUBDIRS = $(basedirs) SparkleShare
EXTRA_DIST = \
gnome-doc-utils.make \

14
NEWS
View file

@ -1,3 +1,17 @@
0.2.4 for Linux and Mac (Wed Jun 29, 2011):
Hylke: Fix crash when setting up with an empty Git repository.
0.2.3 for Linux and Mac (Tue Jun 28, 2011):
Hylke: Add the ability to add notes in the event logs. Fix some quirks
in the webkit view on Linux. Redid gravatar fetching parts to be more
efficient. Remove headless feature. Fix some small bugs and crashes.
SparkleShare will now also try to use your existing SSH keypair. Required
Git version is now 1.7.1 or later.
0.2.2 for Linux and Mac (Tue Jun 14, 2011):
Hylke: Fix crash on first run when ~/.ssh doesn't exist. Sync algorithm

2
README
View file

@ -28,7 +28,7 @@ Run on Linux:
SparkleShare currently requires:
- git >= 1.7
- git >= 1.7.1
- gtk-sharp2 >= 2.12.7
- mono-core >= 2.2
- ndesk-dbus >= 0.6

View file

@ -30,6 +30,12 @@ namespace SparkleLib {
{
remote_folder = remote_folder.Trim ("/".ToCharArray ());
if (server.StartsWith("http")) {
base.target_folder = target_folder;
base.remote_url = server;
return;
}
// Gitorious formatting
if (server.Contains ("gitorious.org")) {
server = "ssh://git@gitorious.org";
@ -102,6 +108,9 @@ namespace SparkleLib {
// Ignore permission changes
config = config.Replace ("filemode = true", "filemode = false");
config = config.Replace ("fetch = +refs/heads/*:refs/remotes/origin/*",
"fetch = +refs/heads/*:refs/remotes/origin/*" + Environment.NewLine +
"\tfetch = +refs/notes/*:refs/notes/*");
// Add user info
string n = Environment.NewLine;

View file

@ -20,6 +20,7 @@ using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Text.RegularExpressions;
using System.Xml;
namespace SparkleLib {
@ -49,6 +50,34 @@ namespace SparkleLib {
}
public override string [] UnsyncedFilePaths {
get {
List<string> file_paths = new List<string> ();
SparkleGit git = new SparkleGit (LocalPath, "status --porcelain");
git.Start ();
// Reading the standard output HAS to go before
// WaitForExit, or it will hang forever on output > 4096 bytes
string output = git.StandardOutput.ReadToEnd ().TrimEnd ();
git.WaitForExit ();
string [] lines = output.Split ("\n".ToCharArray ());
foreach (string line in lines) {
if (line [1].ToString ().Equals ("M") ||
line [1].ToString ().Equals ("?") ||
line [1].ToString ().Equals ("A")) {
string path = line.Substring (3);
path = path.Trim ("\"".ToCharArray ());
file_paths.Add (path);
}
}
return file_paths.ToArray ();
}
}
public override string CurrentRevision {
get {
@ -63,8 +92,9 @@ namespace SparkleLib {
git.WaitForExit ();
if (git.ExitCode == 0) {
string output = git.StandardOutput.ReadToEnd ();
string output = git.StandardOutput.ReadToEnd ();
return output.TrimEnd ();
} else {
return null;
}
@ -88,6 +118,7 @@ namespace SparkleLib {
if (!remote_revision.StartsWith (CurrentRevision)) {
SparkleHelpers.DebugInfo ("Git", "[" + Name + "] Remote changes found. (" + remote_revision + ")");
return true;
} else {
return false;
}
@ -102,7 +133,6 @@ namespace SparkleLib {
Commit (message);
SparkleGit git = new SparkleGit (LocalPath, "push origin master");
git.Start ();
git.WaitForExit ();
@ -115,14 +145,14 @@ namespace SparkleLib {
public override bool SyncDown ()
{
SparkleGit git = new SparkleGit (LocalPath, "fetch -v origin master");
SparkleGit git = new SparkleGit (LocalPath, "fetch -v");
git.Start ();
git.WaitForExit ();
if (git.ExitCode == 0) {
Rebase ();
return true;
} else {
return false;
}
@ -133,9 +163,12 @@ namespace SparkleLib {
get {
SparkleGit git = new SparkleGit (LocalPath, "status --porcelain");
git.Start ();
// Reading the standard output HAS to go before
// WaitForExit, or it will hang forever on output > 4096 bytes
string output = git.StandardOutput.ReadToEnd ().TrimEnd ();
git.WaitForExit ();
string output = git.StandardOutput.ReadToEnd ().TrimEnd ();
string [] lines = output.Split ("\n".ToCharArray ());
foreach (string line in lines) {
@ -265,9 +298,12 @@ namespace SparkleLib {
SparkleGit git_status = new SparkleGit (LocalPath, "status --porcelain");
git_status.Start ();
// Reading the standard output HAS to go before
// WaitForExit, or it will hang forever on output > 4096 bytes
string output = git_status.StandardOutput.ReadToEnd ().TrimEnd ();
git_status.WaitForExit ();
string output = git_status.StandardOutput.ReadToEnd ().TrimEnd ();
string [] lines = output.Split ("\n".ToCharArray ());
foreach (string line in lines) {
@ -339,7 +375,6 @@ namespace SparkleLib {
// Returns a list of the latest change sets
// TODO: Method needs to be made a lot faster
public override List <SparkleChangeSet> GetChangeSets (int count)
{
if (count < 1)
@ -393,7 +428,6 @@ namespace SparkleLib {
"([0-9]{2}):([0-9]{2}):([0-9]{2}) (.[0-9]{4})\n" +
"*", RegexOptions.Compiled);
// TODO: Need to optimise for speed
foreach (string log_entry in entries) {
Regex regex;
bool is_merge_commit = false;
@ -410,11 +444,11 @@ namespace SparkleLib {
if (match.Success) {
SparkleChangeSet change_set = new SparkleChangeSet ();
change_set.Folder = Name;
change_set.Revision = match.Groups [1].Value;
change_set.UserName = match.Groups [2].Value;
change_set.UserEmail = match.Groups [3].Value;
change_set.IsMerge = is_merge_commit;
change_set.Folder = Name;
change_set.Revision = match.Groups [1].Value;
change_set.UserName = match.Groups [2].Value;
change_set.UserEmail = match.Groups [3].Value;
change_set.IsMerge = is_merge_commit;
change_set.Timestamp = new DateTime (int.Parse (match.Groups [4].Value),
int.Parse (match.Groups [5].Value), int.Parse (match.Groups [6].Value),
@ -437,7 +471,7 @@ namespace SparkleLib {
string file_path = entry_line.Substring (39);
string to_file_path;
if (change_type.Equals ("A")) {
if (change_type.Equals ("A") && !file_path.Contains (".notes")) {
change_set.Added.Add (file_path);
} else if (change_type.Equals ("M")) {
@ -457,7 +491,13 @@ namespace SparkleLib {
}
}
change_sets.Add (change_set);
if ((change_set.Added.Count +
change_set.Edited.Count +
change_set.Deleted.Count) > 0) {
change_set.Notes.AddRange (GetNotes (change_set.Revision));
change_sets.Add (change_set);
}
}
}
@ -533,16 +573,6 @@ namespace SparkleLib {
}
public override void CreateInitialChangeSet ()
{
base.CreateInitialChangeSet ();
Add ();
string message = FormatCommitMessage ();
Commit (message);
}
public override bool UsesNotificationCenter
{
get {
@ -550,5 +580,12 @@ namespace SparkleLib {
return !File.Exists (file_path);
}
}
public override void CreateInitialChangeSet ()
{
base.CreateInitialChangeSet ();
SyncUp ();
}
}
}

View file

@ -185,7 +185,6 @@ namespace SparkleLib {
// Returns a list of the latest change sets
// TODO: Method needs to be made a lot faster
public override List<SparkleChangeSet> GetChangeSets (int count)
{
if (count < 1)
@ -224,7 +223,6 @@ namespace SparkleLib {
Regex regex = new Regex (@"([0-9]{4})-([0-9]{2})-([0-9]{2}).*([0-9]{2}):([0-9]{2}).*.([0-9]{4})" +
"(.+)<(.+)>.*.([a-z0-9]{12})", RegexOptions.Compiled);
// TODO: Need to optimise for speed
foreach (string log_entry in entries) {
bool is_merge_commit = false;

View file

@ -22,7 +22,7 @@ SOURCES = \
SparkleHelpers.cs \
SparkleListenerBase.cs \
SparkleListenerIrc.cs \
SparkleListenerTcp.cs \
SparkleListenerTcp.cs \
SparkleOptions.cs \
SparklePaths.cs \
SparkleRepoBase.cs \

View file

@ -24,15 +24,61 @@ namespace SparkleLib {
public string UserName;
public string UserEmail;
public string Folder;
public string Revision;
public DateTime Timestamp;
public bool IsMerge = false;
public bool IsMerge = false;
public List<string> Added = new List<string> ();
public List<string> Deleted = new List<string> ();
public List<string> Edited = new List<string> ();
public List<string> MovedFrom = new List<string> ();
public List<string> MovedTo = new List<string> ();
public List<SparkleNote> Notes = new List<SparkleNote> ();
public string RelativeTimestamp {
get {
TimeSpan time_span = DateTime.Now - Timestamp;
if (time_span <= TimeSpan.FromSeconds (60))
return "just now";
if (time_span <= TimeSpan.FromMinutes (60))
return time_span.Minutes > 1
? time_span.Minutes + " minutes ago"
: "a minute ago";
if (time_span <= TimeSpan.FromHours (24))
return time_span.Hours > 1
? time_span.Hours + " hours ago"
: "an hour ago";
if (time_span <= TimeSpan.FromDays (30))
return time_span.Days > 1
? time_span.Days + " days ago"
: "a day ago";
if (time_span <= TimeSpan.FromDays (365))
return time_span.Days > 30
? (time_span.Days / 30) + " months ago"
: "a month ago";
return time_span.Days > 365
? (time_span.Days / 365) + " years ago"
: "a year ago";
}
}
}
public class SparkleNote {
public string UserName;
public string UserEmail;
public DateTime Timestamp;
public string Body;
}
}

View file

@ -154,6 +154,21 @@ namespace SparkleLib {
Save ();
}
public bool SetFolderOptionalAttribute (string name, string key, string value)
{
XmlNode folder = this.GetFolder(name);
if (folder == null) return false;
if (folder[key] != null) {
folder[key].InnerText = value;
} else {
XmlNode new_node = CreateElement(key);
new_node.InnerText = value;
folder.AppendChild(new_node);
}
return true;
}
public void RemoveFolder (string name)
{
@ -168,51 +183,53 @@ namespace SparkleLib {
public bool FolderExists (string name)
{
foreach (XmlNode node_folder in SelectNodes ("/sparkleshare/folder")) {
if (node_folder ["name"].InnerText.Equals (name))
return true;
}
return false;
XmlNode folder = this.GetFolder(name);
return folder != null;
}
public string GetBackendForFolder (string name)
{
foreach (XmlNode node_folder in SelectNodes ("/sparkleshare/folder")) {
if (node_folder ["name"].InnerText.Equals (name))
return node_folder ["backend"].InnerText;
}
return null;
return this.GetFolderValue(name, "backend");
}
public string GetUrlForFolder (string name)
{
foreach (XmlNode node_folder in SelectNodes ("/sparkleshare/folder")) {
if (node_folder ["name"].InnerText.Equals (name))
return node_folder ["url"].InnerText;
}
return this.GetFolderValue(name, "url");
}
return null;
public List<string> Hosts {
get {
List<string> hosts = new List<string> ();
foreach (XmlNode node_folder in SelectNodes ("/sparkleshare/folder")) {
Uri uri = new Uri (node_folder ["url"].InnerText);
if (!hosts.Contains (uri.Host))
hosts.Add (uri.Host);
}
return hosts;
}
}
public string GetAnnouncementsForFolder (string name)
{
foreach (XmlNode node_folder in SelectNodes ("/sparkleshare/folder")) {
if (node_folder ["name"].InnerText.Equals (name) &&
node_folder ["announcements"] != null) {
return node_folder ["announcements"].InnerText;
}
}
return null;
return this.GetFolderValue(name, "announcements");
}
public string GetAnnouncementUrlForFolder (string name)
{
// examples?
// tcp://localhost:9999/
// xmpp:someuser@somexmppserver?canhavefunnybits
// irc://hbons/#somechatroom
return this.GetFolderValue(name, "announcements_url");
}
public string GetConfigOption (string name)
{
XmlNode node = SelectSingleNode ("/sparkleshare/" + name);
@ -252,6 +269,23 @@ namespace SparkleLib {
Save (Path);
SparkleHelpers.DebugInfo ("Config", "Updated \"" + Path + "\"");
}
private XmlNode GetFolder (string name)
{
return SelectSingleNode(String.Format("/sparkleshare/folder[name='{0}']", name));
}
private string GetFolderValue (string name, string key)
{
XmlNode folder = this.GetFolder(name);
if ((folder != null) && (folder[key] != null)) {
return folder[key].InnerText;
}
return null;
}
}

View file

@ -37,34 +37,43 @@ namespace SparkleLib {
public static class SparkleListenerFactory {
private static List<SparkleListenerBase> listeners;
private static List<SparkleListenerBase> listeners = new List<SparkleListenerBase> ();
public static SparkleListenerIrc CreateIrcListener (string server, string folder_identifier,
string announcements)
public static SparkleListenerBase CreateListener (string folder_name, string folder_identifier)
{
if (listeners == null)
listeners = new List<SparkleListenerBase> ();
string announce_uri = SparkleConfig.DefaultConfig.GetAnnouncementUrlForFolder (folder_name);
// This is SparkleShare's centralized notification service.
// Don't worry, we only use this server as a backup if you
// don't have your own. All data needed to connect is hashed and
// we don't store any personal information ever
if (announcements == null)
server = "204.62.14.135";
else
server = announcements;
if (announce_uri == null) {
// This is SparkleShare's centralized notification service.
// Don't worry, we only use this server as a backup if you
// don't have your own. All data needed to connect is hashed and
// we don't store any personal information ever
announce_uri = "irc://204.62.14.135/";
}
foreach (SparkleListenerBase listener in listeners) {
if (listener.Server.Equals (server)) {
SparkleHelpers.DebugInfo ("ListenerFactory", "Refered to existing listener for " + server);
if (listener.Server.Equals (announce_uri)) {
SparkleHelpers.DebugInfo ("ListenerFactory", "Refered to existing listener for " + announce_uri);
listener.AlsoListenTo (folder_identifier);
return (SparkleListenerIrc) listener;
return (SparkleListenerBase) listener;
}
}
SparkleHelpers.DebugInfo ("ListenerFactory", "Issued new listener for " + server);
listeners.Add (new SparkleListenerIrc (server, folder_identifier, announcements));
return (SparkleListenerIrc) listeners [listeners.Count - 1];
Uri listen_on = new Uri (announce_uri);
switch (listen_on.Scheme) {
case "tcp":
listeners.Add (new SparkleListenerTcp (listen_on, folder_identifier));
break;
case "irc":
default:
listeners.Add (new SparkleListenerIrc (listen_on, folder_identifier));
break;
}
SparkleHelpers.DebugInfo ("ListenerFactory", "Issued new listener for " + announce_uri);
return (SparkleListenerBase) listeners [listeners.Count - 1];
}
}
@ -97,16 +106,17 @@ namespace SparkleLib {
protected List<SparkleAnnouncement> queue_up = new List<SparkleAnnouncement> ();
protected List<SparkleAnnouncement> queue_down = new List<SparkleAnnouncement> ();
protected bool is_connecting;
protected string server;
protected Uri server;
protected Timer reconnect_timer = new Timer { Interval = 60 * 1000, Enabled = true };
public SparkleListenerBase (string server, string folder_identifier, string announcements) {
this.reconnect_timer.Elapsed += delegate {
public SparkleListenerBase (Uri server, string folder_identifier) {
this.reconnect_timer.Elapsed += delegate {
if (!IsConnected && !this.is_connecting)
Reconnect ();
};
};
this.reconnect_timer.Start ();
this.server = server;
this.reconnect_timer.Start ();
}
@ -185,7 +195,7 @@ namespace SparkleLib {
}
public string Server {
public Uri Server {
get {
return this.server;
}

View file

@ -31,11 +31,9 @@ namespace SparkleLib {
private string nick;
public SparkleListenerIrc (string server, string folder_identifier, string announcements) :
base (server, folder_identifier, announcements)
public SparkleListenerIrc (Uri server, string folder_identifier) :
base (server, folder_identifier)
{
base.server = server;
// Try to get a uniqueish nickname
this.nick = SHA1 (DateTime.Now.ToString ("ffffff") + "sparkles");
@ -90,9 +88,10 @@ namespace SparkleLib {
this.thread = new Thread (
new ThreadStart (delegate {
try {
// Connect, login, and join the channel
this.client.Connect (new string [] {base.server}, 6667);
int port = base.server.Port;
if (port < 0) port = 6667;
this.client.Connect (base.server.Host, port);
this.client.Login (this.nick, this.nick);
foreach (string channel in base.channels) {

View file

@ -16,52 +16,42 @@
using System;
using System.IO;
using System.Text;
using System.Threading;
using System.Net.Sockets;
using System.Security.Cryptography;
using System.Collections.Generic;
using System.Xml.Serialization;
namespace SparkleLib {
public class SparkleListenerTcp : SparkleListenerBase {
private Thread thread;
// these are shared
private readonly Object mutex = new Object();
private Socket socket;
private bool connected;
public SparkleListenerTcp (string server, string folder_identifier, string announcements) :
base (server, folder_identifier, announcements)
public SparkleListenerTcp (Uri server, string folder_identifier) :
base (server, folder_identifier)
{
base.server = server;
base.channels.Add (folder_identifier);
this.socket = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
/*
this.client.OnConnected += delegate {
base.is_connecting = false;
OnConnected ();
};
this.client.OnDisconnected += delegate {
base.is_connecting = false;
OnDisconnected ();
};
this.client.OnError += delegate {
base.is_connecting = false;
OnDisconnected ();
};
this..OnChannelMessage += delegate (object o, IrcEventArgs args) {
string message = args.Data.Message.Trim ();
string folder_id = args.Data.Channel.Substring (1); // remove the starting hash
OnAnnouncement (new SparkleAnnouncement (folder_id, message));
};*/
this.connected = false;
}
public override bool IsConnected {
get {
//return this.client.IsConnected;
return true;
//return this.client.IsConnected;
bool result = false;
lock (this.mutex) {
result = this.connected;
}
return result;
}
}
@ -69,43 +59,51 @@ namespace SparkleLib {
// Starts a new thread and listens to the channel
public override void Connect ()
{
SparkleHelpers.DebugInfo ("ListenerTcp", "Connecting to " + Server);
SparkleHelpers.DebugInfo ("ListenerTcp", "Connecting to " + Server.Host);
base.is_connecting = true;
this.thread = new Thread (
new ThreadStart (delegate {
try {
// Connect and subscribe to the channel
this.socket.Connect (Server, 9999);
base.is_connecting = false;
int port = Server.Port;
if (port < 0) port = 9999;
this.socket.Connect (Server.Host, port);
lock (this.mutex) {
base.is_connecting = false;
this.connected = true;
foreach (string channel in base.channels) {
SparkleHelpers.DebugInfo ("ListenerTcp", "Subscribing to channel " + channel);
byte [] message = Encoding.UTF8.GetBytes (
"{\"folder\": \"" + channel + "\", \"command\": \"subscribe\"}");
this.socket.Send (message);
foreach (string channel in base.channels) {
SparkleHelpers.DebugInfo ("ListenerTcp", "Subscribing to channel " + channel);
this.socket.Send (Encoding.UTF8.GetBytes ("subscribe " + channel + "\n"));
}
}
byte [] bytes = new byte [4096];
// List to the channels, this blocks the thread
while (this.socket.Connected) {
this.socket.Receive (bytes);
if (bytes != null && bytes.Length > 0) {
Console.WriteLine (Encoding.UTF8.GetString (bytes));
int bytes_read = this.socket.Receive (bytes);
if (bytes_read > 0) {
string received = Encoding.UTF8.GetString (bytes);
string folder_identifier = received.Substring (0, received.IndexOf ("!"));
string message = received.Substring (received.IndexOf ("!") + 1);
string received_message = bytes.ToString ().Trim ();
string folder_id = ""; // TODO: parse message, use XML
OnAnnouncement (new SparkleAnnouncement (folder_id, received_message));
OnAnnouncement (new SparkleAnnouncement (folder_identifier, message));
} else {
SparkleHelpers.DebugInfo ("ListenerTcp", "Error on socket");
lock (this.mutex) {
this.socket.Close();
this.connected = false;
}
}
}
// Disconnect when we time out
this.socket.Close ();
SparkleHelpers.DebugInfo ("ListenerTcp", "Disconnected from " + Server.Host);
// TODO: attempt to reconnect..?
} catch (SocketException e) {
SparkleHelpers.DebugInfo ("ListenerTcp", "Could not connect to " + Server + ": " + e.Message);
}
@ -125,9 +123,11 @@ namespace SparkleLib {
if (IsConnected) {
SparkleHelpers.DebugInfo ("ListenerTcp", "Subscribing to channel " + channel);
byte [] message = Encoding.UTF8.GetBytes (
"{\"folder\": \"" + channel + "\", \"command\": \"subscribe\"}");
this.socket.Send (message);
string to_send = "subscribe " + folder_identifier + "\n";
lock (this.mutex) {
this.socket.Send (Encoding.UTF8.GetBytes (to_send));
}
}
}
}
@ -135,13 +135,12 @@ namespace SparkleLib {
public override void Announce (SparkleAnnouncement announcement)
{
string channel = announcement.FolderIdentifier;
byte [] message = Encoding.UTF8.GetBytes (
"{\"folder\": \"" + channel + "\", \"command\": \"publish\"}");
this.socket.Send (message);
string to_send = "announce " + announcement.FolderIdentifier
+ " " + announcement.Message + "\n";
// Also announce to ourselves for debugging purposes
// base.OnAnnouncement (announcement);
lock (this.mutex) {
this.socket.Send (Encoding.UTF8.GetBytes (to_send));
}
}

View file

@ -18,6 +18,8 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Security.Cryptography;
using System.Text;
using System.Text.RegularExpressions;
using System.Timers;
using System.Xml;
@ -38,7 +40,6 @@ namespace SparkleLib {
private TimeSpan long_interval = new TimeSpan (0, 0, 10, 0);
private SparkleWatcher watcher;
private SparkleListenerBase listener;
private TimeSpan poll_interval;
private Timer local_timer = new Timer () { Interval = 0.25 * 1000 };
private Timer remote_timer = new Timer () { Interval = 10 * 1000 };
@ -47,6 +48,7 @@ namespace SparkleLib {
private bool has_changed = false;
private Object change_lock = new Object ();
protected SparkleListenerBase listener;
protected SyncStatus status;
protected bool is_buffering = false;
protected bool server_online = true;
@ -86,10 +88,8 @@ namespace SparkleLib {
this.status = status;
};
if (CurrentRevision == null) {
if (CurrentRevision == null)
CreateInitialChangeSet ();
HasUnsyncedChanges = true;
}
CreateWatcher ();
CreateListener ();
@ -115,9 +115,6 @@ namespace SparkleLib {
SyncUpBase ();
};
this.remote_timer.Start ();
this.local_timer.Start ();
// Sync up everything that changed
// since we've been offline
if (AnyDifferences) {
@ -128,6 +125,9 @@ namespace SparkleLib {
SyncUpBase ();
EnableWatching ();
}
this.remote_timer.Start ();
this.local_timer.Start ();
}
@ -145,6 +145,13 @@ namespace SparkleLib {
}
public virtual string [] UnsyncedFilePaths {
get {
return new string [0];
}
}
public string Domain {
get {
Regex regex = new Regex (@"(@|://)([a-z0-9\.-]+)(/|:)");
@ -218,10 +225,9 @@ namespace SparkleLib {
}
private void CreateListener ()
public void CreateListener ()
{
this.listener = SparkleListenerFactory.CreateIrcListener (Domain, Identifier,
SparkleConfig.DefaultConfig.GetAnnouncementsForFolder (Name));
this.listener = SparkleListenerFactory.CreateListener (Name, Identifier);
// Stop polling when the connection to the irc channel is succesful
this.listener.Connected += delegate {
@ -302,7 +308,8 @@ namespace SparkleLib {
if (!this.watcher.EnableRaisingEvents)
return;
if (args.FullPath.Contains (Path.DirectorySeparatorChar + "."))
if (args.FullPath.Contains (Path.DirectorySeparatorChar + ".") &&
!args.FullPath.Contains (Path.DirectorySeparatorChar + ".notes"))
return;
WatcherChangeTypes wct = args.ChangeType;
@ -329,6 +336,42 @@ namespace SparkleLib {
}
public List<SparkleNote> GetNotes (string revision) {
List<SparkleNote> notes = new List<SparkleNote> ();
string notes_path = Path.Combine (LocalPath, ".notes");
if (!Directory.Exists (notes_path))
Directory.CreateDirectory (notes_path);
Regex regex_notes = new Regex (@"<name>(.+)</name>.*" +
"<email>(.+)</email>.*" +
"<timestamp>([0-9]+)</timestamp>.*" +
"<body>(.+)</body>", RegexOptions.Compiled);
foreach (string file_path in Directory.GetFiles (notes_path)) {
if (Path.GetFileName (file_path).StartsWith (revision)) {
string note_xml = String.Join ("", File.ReadAllLines (file_path));
Match match_notes = regex_notes.Match (note_xml);
if (match_notes.Success) {
SparkleNote note = new SparkleNote () {
UserName = match_notes.Groups [1].Value,
UserEmail = match_notes.Groups [2].Value,
Timestamp = new DateTime (1970, 1, 1).AddSeconds (int.Parse (match_notes.Groups [3].Value)),
Body = match_notes.Groups [4].Value
};
notes.Add (note);
}
}
}
return notes;
}
private void SyncUpBase ()
{
try {
@ -393,8 +436,9 @@ namespace SparkleLib {
if (SyncStatusChanged != null)
SyncStatusChanged (SyncStatus.Idle);
if (NewChangeSet != null)
NewChangeSet (GetChangeSets (1) [0], LocalPath);
SparkleChangeSet change_set = GetChangeSets (1) [0];
if (NewChangeSet != null && change_set.Revision != CurrentRevision)
NewChangeSet (change_set, LocalPath);
// There could be changes from a
// resolved conflict. Tries only once,
@ -443,6 +487,44 @@ namespace SparkleLib {
}
public void AddNote (string revision, string note)
{
string notes_path = Path.Combine (LocalPath, ".notes");
if (!Directory.Exists (notes_path))
Directory.CreateDirectory (notes_path);
// Add a timestamp in seconds since unix epoch
int timestamp = (int) (DateTime.UtcNow - new DateTime (1970, 1, 1)).TotalSeconds;
string n = Environment.NewLine;
note = "<note>" + n +
" <user>" + n +
" <name>" + SparkleConfig.DefaultConfig.UserName + "</name>" + n +
" <email>" + SparkleConfig.DefaultConfig.UserEmail + "</email>" + n +
" </user>" + n +
" <timestamp>" + timestamp + "</timestamp>" + n +
" <body>" + note + "</body>" + n +
"</note>" + n;
string note_name = revision + SHA1 (timestamp.ToString () + note);
string note_path = Path.Combine (notes_path, note_name);
StreamWriter writer = new StreamWriter (note_path);
writer.Write (note);
writer.Close ();
// The watcher doesn't like .*/ so we need to trigger
// a change manually
FileSystemEventArgs args = new FileSystemEventArgs (WatcherChangeTypes.Changed,
notes_path, note_name);
OnFileActivity (args);
SparkleHelpers.DebugInfo ("Note", "Added note to " + revision);
}
// Recursively gets a folder's size in bytes
private double CalculateFolderSize (DirectoryInfo parent)
{
@ -456,7 +538,7 @@ namespace SparkleLib {
if (parent.Name.Equals ("rebase-apply"))
return 0;
foreach (FileInfo file in parent.GetFiles()) {
foreach (FileInfo file in parent.GetFiles ()) {
if (!file.Exists)
return 0;
@ -468,5 +550,15 @@ namespace SparkleLib {
return size;
}
// Creates a SHA-1 hash of input
private string SHA1 (string s)
{
SHA1 sha1 = new SHA1CryptoServiceProvider ();
Byte[] bytes = ASCIIEncoding.Default.GetBytes (s);
Byte[] encoded_bytes = sha1.ComputeHash (bytes);
return BitConverter.ToString (encoded_bytes).ToLower ().Replace ("-", "");
}
}
}

View file

@ -108,6 +108,7 @@
<Compile Include="..\SparkleChangeSet.cs" />
<Compile Include="..\SparkleListenerBase.cs" />
<Compile Include="..\SparkleListenerIrc.cs" />
<Compile Include="..\SparkleListenerTcp.cs" />
<Compile Include="..\SparkleBackend.cs" />
<Compile Include="GlobalAssemblyInfo.cs">
<AutoGen>True</AutoGen>
@ -165,4 +166,4 @@
<PropertyGroup>
<PreBuildEvent>$(ProjectDir)transform_tt.cmd</PreBuildEvent>
</PropertyGroup>
</Project>
</Project>

View file

@ -2,19 +2,15 @@
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>TicketVersion</key>
<integer>1</integer>
<key>AllNotifications</key>
<array>
<string>Start</string>
<string>Stop</string>
<string>Info</string>
</array>
<key>DefaultNotifications</key>
<array>
<string>Start</string>
<string>Stop</string>
<string>Info</string>
</array>
<key>TicketVersion</key>
<integer>1</integer>
<key>AllNotifications</key>
<array>
<string>Event</string>
</array>
<key>DefaultNotifications</key>
<array>
<string>Event</string>
</array>
</dict>
</plist>

View file

@ -24,14 +24,15 @@ using MonoMac.AppKit;
using MonoMac.ObjCRuntime;
using MonoMac.WebKit;
namespace SparkleShare {
public class SparkleAbout : NSWindow {
private NSButton WebsiteButton;
private NSButton CreditsButton;
private NSBox Box;
private NSTextField HeaderTextField;
public SparkleAboutController Controller = new SparkleAboutController ();
private NSImage AboutImage;
private NSImageView AboutImageView;
private NSTextField VersionTextField;
private NSTextField UpdatesTextField;
private NSTextField CreditsTextField;
@ -41,21 +42,22 @@ namespace SparkleShare {
public SparkleAbout () : base ()
{
SetFrame (new RectangleF (0, 0, 360, 288), true);
SetFrame (new RectangleF (0, 0, 640, 281), true);
Center ();
Delegate = new SparkleAboutDelegate ();
StyleMask = (NSWindowStyle.Closable | NSWindowStyle.Titled);
Title = "About SparkleShare";
MaxSize = new SizeF (360, 288);
MinSize = new SizeF (360, 288);
MaxSize = new SizeF (640, 281);
MinSize = new SizeF (640, 281);
HasShadow = true;
BackingType = NSBackingStore.Buffered;
CreateAbout ();
OrderFrontRegardless ();
MakeKeyAndOrderFront (this);
SparkleShare.Controller.NewVersionAvailable += delegate (string new_version) {
Controller.NewVersionEvent += delegate (string new_version) {
InvokeOnMainThread (delegate {
UpdatesTextField.StringValue = "A newer version (" + new_version + ") is available!";
UpdatesTextField.TextColor =
@ -63,7 +65,7 @@ namespace SparkleShare {
});
};
SparkleShare.Controller.VersionUpToDate += delegate {
Controller.VersionUpToDateEvent += delegate {
InvokeOnMainThread (delegate {
UpdatesTextField.StringValue = "You are running the latest version.";
UpdatesTextField.TextColor =
@ -71,103 +73,83 @@ namespace SparkleShare {
});
};
CheckForNewVersion ();
}
public void CheckForNewVersion ()
{
SparkleShare.Controller.CheckForNewVersion ();
Controller.CheckingForNewVersionEvent += delegate {
InvokeOnMainThread (delegate {
UpdatesTextField.StringValue = "Checking for updates...";
UpdatesTextField.TextColor = NSColor.DisabledControlText;
});
};
}
private void CreateAbout ()
{
Box = new NSBox () {
FillColor = NSColor.White,
Frame = new RectangleF (-1, Frame.Height - 105, Frame.Width + 2, 105),
BoxType = NSBoxType.NSBoxCustom
string about_image_path = Path.Combine (NSBundle.MainBundle.ResourcePath,
"Pixmaps", "about.png");
AboutImage = new NSImage (about_image_path) {
Size = new SizeF (640, 260)
};
HeaderTextField = new NSTextField () {
StringValue = "SparkleShare",
Frame = new RectangleF (22, Frame.Height - 89, 318, 48),
BackgroundColor = NSColor.White,
Bordered = false,
Editable = false,
Font = NSFontManager.SharedFontManager.FontWithFamily
("Lucida Grande", NSFontTraitMask.Condensed, 0, 24)
AboutImageView = new NSImageView () {
Image = AboutImage,
Frame = new RectangleF (0, 0, 640, 260)
};
VersionTextField = new NSTextField () {
StringValue = SparkleShare.Controller.Version,
Frame = new RectangleF (22, Frame.Height - 94, 318, 22),
StringValue = "version " + Controller.RunningVersion,
Frame = new RectangleF (295, 140, 318, 22),
BackgroundColor = NSColor.White,
Bordered = false,
Editable = false,
DrawsBackground = false,
TextColor = NSColor.White,
Font = NSFontManager.SharedFontManager.FontWithFamily
("Lucida Grande", NSFontTraitMask.Unbold, 0, 11),
TextColor = NSColor.DisabledControlText
("Lucida Grande", NSFontTraitMask.Unbold, 0, 11)
};
UpdatesTextField = new NSTextField () {
StringValue = "Checking for updates...",
Frame = new RectangleF (22, Frame.Height - 222, 318, 98),
BackgroundColor = NSColor.WindowBackground,
Frame = new RectangleF (295, Frame.Height - 232, 318, 98),
Bordered = false,
Editable = false,
DrawsBackground = false,
Font = NSFontManager.SharedFontManager.FontWithFamily
("Lucida Grande", NSFontTraitMask.Unbold, 0, 11),
TextColor = NSColor.DisabledControlText
};
CreditsTextField = new NSTextField () {
StringValue = @"Copyright © 2010" + DateTime.Now.Year + " Hylke Bons and others" +
StringValue = @"Copyright © 2010" + DateTime.Now.Year + " Hylke Bons and others." +
"\n" +
"\n" +
"SparkleShare is Free and Open Source Software. You are free to use, modify, and redistribute it " +
"under the GNU General Public License version 3 or later.",
Frame = new RectangleF (22, Frame.Height - 250, 318, 98),
BackgroundColor = NSColor.WindowBackground,
Frame = new RectangleF (295, Frame.Height - 260, 318, 98),
TextColor = NSColor.White,
DrawsBackground = false,
Bordered = false,
Editable = false,
Font = NSFontManager.SharedFontManager.FontWithFamily
("Lucida Grande", NSFontTraitMask.Unbold, 0, 11),
};
WebsiteButton = new NSButton () {
Frame = new RectangleF (12, 12, 120, 32),
Title = "Visit Website",
BezelStyle = NSBezelStyle.Rounded,
Font = SparkleUI.Font
};
// WebsiteButton.Activated += delegate {
// NSUrl url = new NSUrl ("http://www.sparkleshare.org/");
// NSWorkspace.SharedWorkspace.OpenUrl (url);
// };
WebsiteButton.Activated += delegate {
NSUrl url = new NSUrl ("http://www.sparkleshare.org/");
NSWorkspace.SharedWorkspace.OpenUrl (url);
};
// CreditsButton.Activated += delegate {
// NSUrl url = new NSUrl ("http://www.sparkleshare.org/credits/");
// NSWorkspace.SharedWorkspace.OpenUrl (url);
// };
CreditsButton = new NSButton () {
Frame = new RectangleF (Frame.Width - 12 - 120, 12, 120, 32),
Title = "Show Credits",
BezelStyle = NSBezelStyle.Rounded,
Font = SparkleUI.Font
};
ContentView.AddSubview (AboutImageView);
CreditsButton.Activated += delegate {
NSUrl url = new NSUrl ("http://www.sparkleshare.org/credits/");
NSWorkspace.SharedWorkspace.OpenUrl (url);
};
ContentView.AddSubview (Box);
ContentView.AddSubview (HeaderTextField);
ContentView.AddSubview (VersionTextField);
ContentView.AddSubview (UpdatesTextField);
ContentView.AddSubview (CreditsTextField);
ContentView.AddSubview (CreditsButton);
ContentView.AddSubview (WebsiteButton);
}
}

View file

@ -0,0 +1,91 @@
// SparkleShare, a collaboration and sharing tool.
// Copyright (C) 2010 Hylke Bons <hylkebons@gmail.com>
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
using System;
using System.Drawing;
using System.IO;
using System.Collections.Generic;
using MonoMac.AppKit;
using MonoMac.Foundation;
using MonoMac.Growl;
namespace SparkleShare {
public class SparkleBadger {
private Dictionary<string, NSImage> icons = new Dictionary<string, NSImage> ();
private int [] sizes = new int [] {16, 32, 48, 128, 256, 512};
private string [] paths;
public SparkleBadger (string [] paths)
{
this.paths = paths;
}
public void Badge ()
{
using (NSAutoreleasePool a = new NSAutoreleasePool ()) {
foreach (string path in this.paths) {
string extension = Path.GetExtension (path.ToLower ());
NSImage new_icon = new NSImage ();
if (!this.icons.ContainsKey (extension)) {
foreach (int size in this.sizes) {
NSImage file_icon = NSWorkspace.SharedWorkspace.IconForFileType (extension);
file_icon.Size = new SizeF (size, size);
// TODO: replace this with the sync icon
NSImage overlay_icon = NSWorkspace.SharedWorkspace.IconForFileType ("sln");
overlay_icon.Size = new SizeF (size / 2, size / 2);
file_icon.LockFocus ();
NSGraphicsContext.CurrentContext.ImageInterpolation = NSImageInterpolation.High;
overlay_icon.Draw (
new RectangleF (0, 0, file_icon.Size.Width / 3, file_icon.Size.Width / 3),
new RectangleF (), NSCompositingOperation.SourceOver, 1.0f);
file_icon.UnlockFocus ();
new_icon.AddRepresentation (file_icon.Representations () [0]);
}
this.icons.Add (extension, new_icon);
} else {
new_icon = this.icons [extension];
}
NSWorkspace.SharedWorkspace.SetIconforFile (new_icon, path, 0);
}
}
}
public void Clear ()
{
foreach (string path in this.paths) {
string extension = Path.GetExtension (path.ToLower ());
NSImage original_icon = NSWorkspace.SharedWorkspace.IconForFileType (extension);
NSWorkspace.SharedWorkspace.SetIconforFile (original_icon, path, 0);
}
}
}
}

View file

@ -1,58 +0,0 @@
// SparkleShare, a collaboration and sharing tool.
// Copyright (C) 2010 Hylke Bons <hylkebons@gmail.com>
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
using System;
using System.IO;
using MonoMac.AppKit;
using MonoMac.Foundation;
using MonoMac.Growl;
namespace SparkleShare {
public class SparkleBubble : NSObject {
public string ImagePath;
private string title;
private string subtext;
public SparkleBubble (string title, string subtext)
{
this.title = title;
this.subtext = subtext;
}
public void Show ()
{
InvokeOnMainThread (delegate {
if (ImagePath != null && File.Exists (ImagePath)) {
NSData image_data = NSData.FromFile (ImagePath);
GrowlApplicationBridge.Notify (this.title, this.subtext,
"Start", image_data, 0, false, null);
} else {
GrowlApplicationBridge.Notify (this.title, this.subtext,
"Start", null, 0, false, null);
}
});
}
}
}

View file

@ -0,0 +1,64 @@
// SparkleShare, a collaboration and sharing tool.
// Copyright (C) 2010 Hylke Bons <hylkebons@gmail.com>
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
using System;
using System.IO;
using MonoMac.AppKit;
using MonoMac.Foundation;
using MonoMac.Growl;
namespace SparkleShare {
public class SparkleBubbles : NSObject {
private SparkleBubblesController controller = new SparkleBubblesController ();
public SparkleBubbles ()
{
this.controller.ShowBubbleEvent += delegate (string title, string subtext, string image_path) {
InvokeOnMainThread (delegate {
if (!GrowlApplicationBridge.IsGrowlRunning ()) {
NSApplication.SharedApplication.RequestUserAttention (
NSRequestUserAttentionType.InformationalRequest);
return;
}
if (NSApplication.SharedApplication.DockTile.BadgeLabel == null) {
NSApplication.SharedApplication.DockTile.BadgeLabel = "1";
} else {
int events = int.Parse (NSApplication.SharedApplication.DockTile.BadgeLabel);
NSApplication.SharedApplication.DockTile.BadgeLabel = (events + 1).ToString ();
}
if (image_path != null && File.Exists (image_path)) {
NSData image_data = NSData.FromFile (image_path);
GrowlApplicationBridge.Notify (title, subtext,
"Event", image_data, 0, false, null);
} else {
GrowlApplicationBridge.Notify (title, subtext,
"Event", null, 0, false, null);
}
});
};
}
}
}

View file

@ -16,33 +16,38 @@
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Drawing;
using System.IO;
using System.Text.RegularExpressions;
using System.Threading;
using MonoMac.Foundation;
using MonoMac.AppKit;
using MonoMac.ObjCRuntime;
using MonoMac.WebKit;
using SparkleLib; // Only used for SparkleChangeSet
namespace SparkleShare {
public class SparkleEventLog : NSWindow {
private WebView WebView;
private NSBox Separator;
private string HTML;
private SparkleEventLogController controller = new SparkleEventLogController ();
private WebView web_view = new WebView (new RectangleF (0, 0, 480, 579), "", "") {
PolicyDelegate = new SparkleWebPolicyDelegate ()
};
private NSBox Separator = new NSBox (new RectangleF (0, 579, 480, 1)) {
BorderColor = NSColor.LightGray,
BoxType = NSBoxType.NSBoxCustom
};
private NSPopUpButton popup_button;
private NSProgressIndicator ProgressIndicator;
private List<SparkleChangeSet> change_sets;
private string selected_log = null;
private NSProgressIndicator progress_indicator;
public SparkleEventLog (IntPtr handle) : base (handle) { }
// TODO: Window needs to be made resizable
public SparkleEventLog () : base ()
{
Title = "Recent Events";
@ -60,39 +65,52 @@ namespace SparkleShare {
HasShadow = true;
BackingType = NSBackingStore.Buffered;
CreateEvents ();
UpdateEvents (false);
UpdateChooser ();
OrderFrontRegardless ();
}
private void CreateEvents ()
{
Separator = new NSBox (new RectangleF (0, 579, 480, 1)) {
BorderColor = NSColor.LightGray,
BoxType = NSBoxType.NSBoxCustom
};
ContentView.AddSubview (Separator);
WebView = new WebView (new RectangleF (0, 0, 480, 579), "", "") {
PolicyDelegate = new SparkleWebPolicyDelegate ()
};
ProgressIndicator = new NSProgressIndicator () {
this.progress_indicator = new NSProgressIndicator () {
Style = NSProgressIndicatorStyle.Spinning,
Frame = new RectangleF (WebView.Frame.Width / 2 - 10, WebView.Frame.Height / 2 + 10, 20, 20)
Frame = new RectangleF (this.web_view.Frame.Width / 2 - 10, this.web_view.Frame.Height / 2 + 10, 20, 20)
};
ProgressIndicator.StartAnimation (this);
Update ();
this.progress_indicator.StartAnimation (this);
ContentView.AddSubview (this.progress_indicator);
UpdateContent (null);
UpdateChooser (null);
OrderFrontRegardless ();
// Hook up the controller events
this.controller.UpdateChooserEvent += delegate (string [] folders) {
InvokeOnMainThread (delegate {
UpdateChooser (folders);
});
};
this.controller.UpdateContentEvent += delegate (string html) {
InvokeOnMainThread (delegate {
UpdateContent (html);
});
};
this.controller.ContentLoadingEvent += delegate {
InvokeOnMainThread (delegate {
if (this.web_view.Superview == ContentView)
this.web_view.RemoveFromSuperview ();
ContentView.AddSubview (this.progress_indicator);
});
};
}
public void UpdateChooser ()
public void UpdateChooser (string [] folders)
{
if (folders == null)
folders = this.controller.Folders;
if (this.popup_button != null)
this.popup_button.RemoveFromSuperview ();
@ -103,104 +121,61 @@ namespace SparkleShare {
this.popup_button.Cell.ControlSize = NSControlSize.Small;
this.popup_button.Font = NSFontManager.SharedFontManager.FontWithFamily
("Lucida Grande", NSFontTraitMask.Condensed, 0, NSFont.SmallSystemFontSize);
("Lucida Grande", NSFontTraitMask.Condensed, 0, NSFont.SmallSystemFontSize);
this.popup_button.AddItem ("All Folders");
this.popup_button.Menu.AddItem (NSMenuItem.SeparatorItem);
this.popup_button.AddItems (SparkleShare.Controller.Folders.ToArray ());
if (this.selected_log != null &&
!SparkleShare.Controller.Folders.Contains (this.selected_log)) {
this.selected_log = null;
}
this.popup_button.AddItems (folders);
this.popup_button.Activated += delegate {
if (this.popup_button.IndexOfSelectedItem == 0)
this.selected_log = null;
this.controller.SelectedFolder = null;
else
this.selected_log = this.popup_button.SelectedItem.Title;
UpdateEvents (false);
this.controller.SelectedFolder = this.popup_button.SelectedItem.Title;
};
ContentView.AddSubview (this.popup_button);
}
public void UpdateEvents ()
public void UpdateContent (string html)
{
UpdateEvents (true);
}
public void UpdateEvents (bool silent)
{
if (!silent) {
InvokeOnMainThread (delegate {
if (WebView.Superview == ContentView)
WebView.RemoveFromSuperview ();
using (NSAutoreleasePool pool = new NSAutoreleasePool ()) {
Thread thread = new Thread (new ThreadStart (delegate {
if (html == null)
html = this.controller.HTML;
ContentView.AddSubview (ProgressIndicator);
});
html = html.Replace ("<!-- $body-font-family -->", "Lucida Grande");
html = html.Replace ("<!-- $day-entry-header-font-size -->", "13.6px");
html = html.Replace ("<!-- $body-font-size -->", "13.4px");
html = html.Replace ("<!-- $secondary-font-color -->", "#bbb");
html = html.Replace ("<!-- $small-color -->", "#ddd");
html = html.Replace ("<!-- $day-entry-header-background-color -->", "#f5f5f5");
html = html.Replace ("<!-- $a-color -->", "#0085cf");
html = html.Replace ("<!-- $a-hover-color -->", "#009ff8");
html = html.Replace ("<!-- $no-buddy-icon-background-image -->",
"file://" + Path.Combine (NSBundle.MainBundle.ResourcePath, "Pixmaps", "avatar-default.png"));
html = html.Replace ("<!-- $document-added-background-image -->",
"file://" + Path.Combine (NSBundle.MainBundle.ResourcePath, "Pixmaps", "document-added-12.png"));
html = html.Replace ("<!-- $document-deleted-background-image -->",
"file://" + Path.Combine (NSBundle.MainBundle.ResourcePath, "Pixmaps", "document-deleted-12.png"));
html = html.Replace ("<!-- $document-edited-background-image -->",
"file://" + Path.Combine (NSBundle.MainBundle.ResourcePath, "Pixmaps", "document-edited-12.png"));
html = html.Replace ("<!-- $document-moved-background-image -->",
"file://" + Path.Combine (NSBundle.MainBundle.ResourcePath, "Pixmaps", "document-moved-12.png"));
InvokeOnMainThread (delegate {
if (this.progress_indicator.Superview == ContentView)
this.progress_indicator.RemoveFromSuperview ();
// TODO: still causes some flashes
this.web_view.MainFrame.LoadHtmlString (html, new NSUrl (""));
ContentView.AddSubview (this.web_view);
});
}));
thread.Start ();
}
Thread thread = new Thread (new ThreadStart (delegate {
using (NSAutoreleasePool pool = new NSAutoreleasePool ()) {
Stopwatch watch = new Stopwatch ();
watch.Start ();
this.change_sets = SparkleShare.Controller.GetLog (this.selected_log);
GenerateHTML ();
watch.Stop ();
// A short delay is less annoying than
// a flashing window
if (watch.ElapsedMilliseconds < 500 && !silent)
Thread.Sleep (500 - (int) watch.ElapsedMilliseconds);
AddHTML ();
}
}));
thread.Start ();
}
private void GenerateHTML ()
{
HTML = SparkleShare.Controller.GetHTMLLog (this.change_sets);
HTML = HTML.Replace ("<!-- $body-font-family -->", "Lucida Grande");
HTML = HTML.Replace ("<!-- $day-entry-header-font-size -->", "13.6px");
HTML = HTML.Replace ("<!-- $body-font-size -->", "13.4px");
HTML = HTML.Replace ("<!-- $secondary-font-color -->", "#bbb");
HTML = HTML.Replace ("<!-- $small-color -->", "#ddd");
HTML = HTML.Replace ("<!-- $day-entry-header-background-color -->", "#f5f5f5");
HTML = HTML.Replace ("<!-- $a-color -->", "#0085cf");
HTML = HTML.Replace ("<!-- $a-hover-color -->", "#009ff8");
HTML = HTML.Replace ("<!-- $no-buddy-icon-background-image -->",
"file://" + Path.Combine (NSBundle.MainBundle.ResourcePath, "Pixmaps", "avatar-default.png"));
HTML = HTML.Replace ("<!-- $document-added-background-image -->",
"file://" + Path.Combine (NSBundle.MainBundle.ResourcePath, "Pixmaps", "document-added-12.png"));
HTML = HTML.Replace ("<!-- $document-deleted-background-image -->",
"file://" + Path.Combine (NSBundle.MainBundle.ResourcePath, "Pixmaps", "document-deleted-12.png"));
HTML = HTML.Replace ("<!-- $document-edited-background-image -->",
"file://" + Path.Combine (NSBundle.MainBundle.ResourcePath, "Pixmaps", "document-edited-12.png"));
HTML = HTML.Replace ("<!-- $document-moved-background-image -->",
"file://" + Path.Combine (NSBundle.MainBundle.ResourcePath, "Pixmaps", "document-moved-12.png"));
}
private void AddHTML ()
{
InvokeOnMainThread (delegate {
if (ProgressIndicator.Superview == ContentView)
ProgressIndicator.RemoveFromSuperview ();
WebView.MainFrame.LoadHtmlString (HTML, new NSUrl (""));
ContentView.AddSubview (WebView);
Update ();
});
}
}
@ -220,10 +195,30 @@ namespace SparkleShare {
public override void DecidePolicyForNavigation (WebView web_view, NSDictionary action_info,
NSUrlRequest request, WebFrame frame, NSObject decision_token)
{
string file_path = request.Url.ToString ();
file_path = file_path.Replace ("%20", " ");
NSWorkspace.SharedWorkspace.OpenFile (file_path);
string url = request.Url.ToString ();
if (url.StartsWith (Path.VolumeSeparatorChar.ToString ())) {
string file_path = request.Url.ToString ();
file_path = file_path.Replace ("%20", " ");
NSWorkspace.SharedWorkspace.OpenFile (file_path);
} else {
Regex regex = new Regex (@"(.+)~(.+)~(.+)");
Match match = regex.Match (url);
if (match.Success) {
string folder_name = match.Groups [1].Value;
string revision = match.Groups [2].Value;
string note = match.Groups [3].Value.Replace ("%20", " ");
Thread thread = new Thread (new ThreadStart (delegate {
SparkleShare.Controller.AddNoteToFolder (folder_name, revision, note);
}));
thread.Start ();
}
}
}
}
}

View file

@ -1,445 +0,0 @@
// SparkleShare, a collaboration and sharing tool.
// Copyright (C) 2010 Hylke Bons <hylkebons@gmail.com>
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
using System;
using System.Drawing;
using System.IO;
using System.Timers;
using Mono.Unix;
using MonoMac.Foundation;
using MonoMac.AppKit;
using MonoMac.ObjCRuntime;
using MonoMac.WebKit;
namespace SparkleShare {
public class SparkleIntro : SparkleWindow {
private NSButton ContinueButton;
private NSButton SyncButton;
private NSButton TryAgainButton;
private NSButton CancelButton;
private NSButton SkipButton;
private NSButton OpenFolderButton;
private NSButton FinishButton;
private NSForm UserInfoForm;
private NSProgressIndicator ProgressIndicator;
private NSTextField AddressTextField;
private NSTextField FolderNameTextField;
private NSTextField ServerTypeLabel;
private NSTextField AddressLabel;
private NSTextField FolderNameLabel;
private NSTextField FolderNameHelpLabel;
private NSButtonCell ButtonCellProto;
private NSMatrix Matrix;
private int ServerType;
private bool ServerFormOnly;
public SparkleIntro () : base ()
{
ServerFormOnly = false;
}
public void ShowAccountForm ()
{
Reset ();
Header = "Welcome to SparkleShare!";
Description = "Before we can create a SparkleShare folder on this " +
"computer, we need some information from you.";
UserInfoForm = new NSForm (new RectangleF (250, 115, 350, 64));
UserInfoForm.AddEntry ("Full Name:");
UserInfoForm.AddEntry ("Email Address:");
UserInfoForm.CellSize = new SizeF (280, 22);
UserInfoForm.IntercellSpacing = new SizeF (4, 4);
UserInfoForm.Cells [0].LineBreakMode = NSLineBreakMode.TruncatingTail;
UserInfoForm.Cells [1].LineBreakMode = NSLineBreakMode.TruncatingTail;
UserInfoForm.Cells [0].StringValue = SparkleShare.Controller.UserName;
UserInfoForm.Cells [1].StringValue = SparkleShare.Controller.UserEmail;
ContinueButton = new NSButton () {
Title = "Continue",
Enabled = false
};
ContinueButton.Activated += delegate {
SparkleShare.Controller.UserName = UserInfoForm.Cells [0].StringValue.Trim ();
SparkleShare.Controller.UserEmail = UserInfoForm.Cells [1].StringValue.Trim ();
SparkleShare.Controller.GenerateKeyPair ();
SparkleUI.StatusIcon.CreateMenu ();
InvokeOnMainThread (delegate {
ShowServerForm ();
});
};
// TODO: Ugly hack, do properly with events
Timer timer = new Timer () {
Interval = 50
};
timer.Elapsed += delegate {
InvokeOnMainThread (delegate {
bool name_is_correct =
!UserInfoForm.Cells [0].StringValue.Trim ().Equals ("");
bool email_is_correct = SparkleShare.Controller.IsValidEmail (
UserInfoForm.Cells [1].StringValue.Trim ());
ContinueButton.Enabled = (name_is_correct && email_is_correct);
});
};
timer.Start ();
ContentView.AddSubview (UserInfoForm);
Buttons.Add (ContinueButton);
ShowAll ();
}
public void ShowServerForm (bool server_form_only)
{
ServerFormOnly = server_form_only;
ShowServerForm ();
}
public void ShowServerForm ()
{
Reset ();
Header = "Where is your remote folder?";
Description = "";
ServerTypeLabel = new NSTextField () {
Alignment = NSTextAlignment.Right,
BackgroundColor = NSColor.WindowBackground,
Bordered = false,
Editable = false,
Frame = new RectangleF (150, Frame.Height - 139 , 160, 17),
StringValue = "Server Type:",
Font = SparkleUI.Font
};
AddressLabel = new NSTextField () {
Alignment = NSTextAlignment.Right,
BackgroundColor = NSColor.WindowBackground,
Bordered = false,
Editable = false,
Frame = new RectangleF (150, Frame.Height - 237 , 160, 17),
StringValue = "Address:",
Font = SparkleUI.Font
};
FolderNameLabel = new NSTextField () {
Alignment = NSTextAlignment.Right,
BackgroundColor = NSColor.WindowBackground,
Bordered = false,
Editable = false,
Frame = new RectangleF (150, Frame.Height - 264 , 160, 17),
StringValue = "Folder Name:",
Font = SparkleUI.Font
};
AddressTextField = new NSTextField () {
Frame = new RectangleF (320, Frame.Height - 240 , 256, 22),
Font = SparkleUI.Font
};
AddressTextField.Cell.LineBreakMode = NSLineBreakMode.TruncatingTail;
FolderNameTextField = new NSTextField () {
Frame = new RectangleF (320, Frame.Height - (240 + 22 + 4) , 256, 22),
StringValue = ""
};
FolderNameTextField.Cell.LineBreakMode = NSLineBreakMode.TruncatingTail;
FolderNameHelpLabel = new NSTextField () {
BackgroundColor = NSColor.WindowBackground,
Bordered = false,
TextColor = NSColor.DisabledControlText,
Editable = false,
Frame = new RectangleF (320, Frame.Height - 285 , 200, 17),
StringValue = "e.g. rupert/website-design"
};
ServerType = 0;
ButtonCellProto = new NSButtonCell ();
ButtonCellProto.SetButtonType (NSButtonType.Radio) ;
Matrix = new NSMatrix (new RectangleF (315, 180, 256, 78),
NSMatrixMode.Radio, ButtonCellProto, 4, 1);
Matrix.CellSize = new SizeF (256, 18);
Matrix.Cells [0].Title = "My own server";
Matrix.Cells [1].Title = "Github";
Matrix.Cells [2].Title = "Gitorious";
Matrix.Cells [3].Title = "The GNOME Project";
foreach (NSCell cell in Matrix.Cells)
cell.Font = SparkleUI.Font;
// TODO: Ugly hack, do properly with events
Timer timer = new Timer () {
Interval = 50
};
timer.Elapsed += delegate {
InvokeOnMainThread (delegate {
if (Matrix.SelectedRow != ServerType) {
ServerType = Matrix.SelectedRow;
AddressTextField.Enabled = (ServerType == 0);
switch (ServerType) {
case 0:
AddressTextField.StringValue = "";
FolderNameHelpLabel.StringValue = "e.g. rupert/website-design";
break;
case 1:
AddressTextField.StringValue = "ssh://git@github.com/";
FolderNameHelpLabel.StringValue = "e.g. rupert/website-design";
break;
case 2:
AddressTextField.StringValue = "ssh://git@gitorious.org/";
FolderNameHelpLabel.StringValue = "e.g. project/website-design";
break;
case 3:
AddressTextField.StringValue = "ssh://git@gnome.org/git/";
FolderNameHelpLabel.StringValue = "e.g. gnome-icon-theme";
break;
}
}
if (ServerType == 0 && !AddressTextField.StringValue.Trim ().Equals ("")
&& !FolderNameTextField.StringValue.Trim ().Equals ("")) {
SyncButton.Enabled = true;
} else if (ServerType != 0 &&
!FolderNameTextField.StringValue.Trim ().Equals ("")) {
SyncButton.Enabled = true;
} else {
SyncButton.Enabled = false;
}
});
};
timer.Start ();
ContentView.AddSubview (ServerTypeLabel);
ContentView.AddSubview (Matrix);
ContentView.AddSubview (AddressLabel);
ContentView.AddSubview (AddressTextField);
ContentView.AddSubview (FolderNameLabel);
ContentView.AddSubview (FolderNameTextField);
ContentView.AddSubview (FolderNameHelpLabel);
SyncButton = new NSButton () {
Title = "Sync",
Enabled = false
};
SyncButton.Activated += delegate {
string folder_name = FolderNameTextField.StringValue;
string server = AddressTextField.StringValue;
string canonical_name = Path.GetFileNameWithoutExtension (folder_name);
ShowSyncingPage (canonical_name);
SparkleShare.Controller.FolderFetched += delegate {
InvokeOnMainThread (delegate {
ShowSuccessPage (canonical_name);
});
};
SparkleShare.Controller.FolderFetchError += delegate {
InvokeOnMainThread (delegate {
ShowErrorPage ();
});
};
SparkleShare.Controller.FetchFolder (server, folder_name);
};
Buttons.Add (SyncButton);
if (ServerFormOnly) {
CancelButton = new NSButton () {
Title = "Cancel"
};
CancelButton.Activated += delegate {
InvokeOnMainThread (delegate {
PerformClose (this);
});
};
Buttons.Add (CancelButton);
} else {
SkipButton = new NSButton () {
Title = "Skip"
};
SkipButton.Activated += delegate {
InvokeOnMainThread (delegate {
ShowCompletedPage ();
});
};
Buttons.Add (SkipButton);
}
ShowAll ();
}
public void ShowErrorPage ()
{
Reset ();
Header = "Something went wrong…";
Description = "";
TryAgainButton = new NSButton () {
Title = "Try again…"
};
TryAgainButton.Activated += delegate {
InvokeOnMainThread (delegate {
ShowServerForm ();
});
};
Buttons.Add (TryAgainButton);
ShowAll ();
}
private void ShowSyncingPage (string name)
{
Reset ();
Header = "Syncing folder " + name + "’…";
Description = "This may take a while.\n" +
"Are you sure its not coffee o'clock?";
ProgressIndicator = new NSProgressIndicator () {
Frame = new RectangleF (190, Frame.Height - 200, 640 - 150 - 80, 20),
Style = NSProgressIndicatorStyle.Bar
};
ProgressIndicator.StartAnimation (this);
ContentView.AddSubview (ProgressIndicator);
FinishButton = new NSButton () {
Title = "Finish",
Enabled = false
};
Buttons.Add (FinishButton);
ShowAll ();
}
public void ShowSuccessPage (string folder_name)
{
Reset ();
Header = "Folder synced succesfully!";
Description = "Now you can access the synced files from " + folder_name + " in " +
"your SparkleShare folder.";
FinishButton = new NSButton () {
Title = "Finish"
};
FinishButton.Activated += delegate {
InvokeOnMainThread (delegate {
SparkleUI.StatusIcon.CreateMenu ();
PerformClose (this);
});
};
OpenFolderButton = new NSButton () {
Title = "Open Folder"
};
OpenFolderButton.Activated += delegate {
SparkleShare.Controller.OpenSparkleShareFolder (folder_name);
};
Buttons.Add (FinishButton);
Buttons.Add (OpenFolderButton);
ShowAll ();
NSApplication.SharedApplication.RequestUserAttention
(NSRequestUserAttentionType.CriticalRequest);
}
private void ShowCompletedPage ()
{
Reset ();
Header = "SparkleShare is ready to go!";
Description = "Now you can start accepting invitations from others. " +
"Just click on invitations you get by email and " +
"we will take care of the rest.";
FinishButton = new NSButton () {
Title = "Finish"
};
FinishButton.Activated += delegate {
InvokeOnMainThread (delegate {
SparkleUI.StatusIcon.CreateMenu ();
PerformClose (this);
});
};
Buttons.Add (FinishButton);
ShowAll ();
}
}
}

View file

@ -138,8 +138,11 @@ namespace SparkleShare {
StreamReader reader = new StreamReader (html_path);
string html = reader.ReadToEnd ();
reader.Close ();
return html;
html = html.Replace ("<!-- $jquery-url -->", "file://" +
Path.Combine (NSBundle.MainBundle.ResourcePath, "HTML", "jquery.js"));
return html;
}
}
@ -177,6 +180,7 @@ namespace SparkleShare {
new public void Quit ()
{
this.watcher.Dispose ();
NSApplication.SharedApplication.Terminate (new NSObject ());
base.Quit ();
}
}

View file

@ -0,0 +1,368 @@
// SparkleShare, a collaboration and sharing tool.
// Copyright (C) 2010 Hylke Bons <hylkebons@gmail.com>
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
using System;
using System.Drawing;
using System.IO;
using System.Timers;
using Mono.Unix;
using MonoMac.Foundation;
using MonoMac.AppKit;
using MonoMac.ObjCRuntime;
using MonoMac.WebKit;
namespace SparkleShare {
public class SparkleSetup : SparkleSetupWindow {
public SparkleSetupController Controller = new SparkleSetupController ();
private NSButton ContinueButton;
private NSButton SyncButton;
private NSButton TryAgainButton;
private NSButton CancelButton;
private NSButton OpenFolderButton;
private NSButton FinishButton;
private NSForm UserInfoForm;
private NSProgressIndicator ProgressIndicator;
private NSTextField AddressTextField;
private NSTextField FolderNameTextField;
private NSTextField ServerTypeLabel;
private NSTextField AddressLabel;
private NSTextField FolderNameLabel;
private NSTextField FolderNameHelpLabel;
private NSButtonCell ButtonCellProto;
private NSMatrix Matrix;
private int ServerType;
private Timer timer;
public SparkleSetup () : base ()
{
Controller.ChangePageEvent += delegate (PageType type) {
InvokeOnMainThread (delegate {
Reset ();
switch (type) {
case PageType.Setup:
Header = "Welcome to SparkleShare!";
Description = "Before we can create a SparkleShare folder on this " +
"computer, we need some information from you.";
UserInfoForm = new NSForm (new RectangleF (250, 115, 350, 64));
UserInfoForm.AddEntry ("Full Name:");
UserInfoForm.AddEntry ("Email Address:");
UserInfoForm.CellSize = new SizeF (280, 22);
UserInfoForm.IntercellSpacing = new SizeF (4, 4);
UserInfoForm.Cells [0].LineBreakMode = NSLineBreakMode.TruncatingTail;
UserInfoForm.Cells [1].LineBreakMode = NSLineBreakMode.TruncatingTail;
UserInfoForm.Cells [0].StringValue = SparkleShare.Controller.UserName;
UserInfoForm.Cells [1].StringValue = SparkleShare.Controller.UserEmail;
// TODO: Ugly hack, do properly with events
timer = new Timer () {
Interval = 50
};
ContinueButton = new NSButton () {
Title = "Continue",
Enabled = false
};
ContinueButton.Activated += delegate {
timer.Stop ();
timer = null;
string full_name = UserInfoForm.Cells [0].StringValue.Trim ();
string email = UserInfoForm.Cells [1].StringValue.Trim ();
Controller.SetupPageCompleted (full_name, email);
};
timer.Elapsed += delegate {
InvokeOnMainThread (delegate {
bool name_is_valid = !UserInfoForm.Cells [0].StringValue.Trim ().Equals ("");
bool email_is_valid = SparkleShare.Controller.IsValidEmail (
UserInfoForm.Cells [1].StringValue.Trim ());
ContinueButton.Enabled = (name_is_valid && email_is_valid);
});
};
timer.Start ();
ContentView.AddSubview (UserInfoForm);
Buttons.Add (ContinueButton);
break;
case PageType.Add:
Header = "Where is your remote folder?";
Description = "";
ServerTypeLabel = new NSTextField () {
Alignment = NSTextAlignment.Right,
BackgroundColor = NSColor.WindowBackground,
Bordered = false,
Editable = false,
Frame = new RectangleF (150, Frame.Height - 139 , 160, 17),
StringValue = "Server Type:",
Font = SparkleUI.Font
};
AddressLabel = new NSTextField () {
Alignment = NSTextAlignment.Right,
BackgroundColor = NSColor.WindowBackground,
Bordered = false,
Editable = false,
Frame = new RectangleF (150, Frame.Height - 237 , 160, 17),
StringValue = "Address:",
Font = SparkleUI.Font
};
FolderNameLabel = new NSTextField () {
Alignment = NSTextAlignment.Right,
BackgroundColor = NSColor.WindowBackground,
Bordered = false,
Editable = false,
Frame = new RectangleF (150, Frame.Height - 264 , 160, 17),
StringValue = "Folder Name:",
Font = SparkleUI.Font
};
AddressTextField = new NSTextField () {
Frame = new RectangleF (320, Frame.Height - 240 , 256, 22),
Font = SparkleUI.Font,
StringValue = Controller.PreviousServer
};
AddressTextField.Cell.LineBreakMode = NSLineBreakMode.TruncatingTail;
FolderNameTextField = new NSTextField () {
Frame = new RectangleF (320, Frame.Height - (240 + 22 + 4) , 256, 22),
StringValue = Controller.PreviousFolder
};
FolderNameTextField.Cell.LineBreakMode = NSLineBreakMode.TruncatingTail;
FolderNameHelpLabel = new NSTextField () {
BackgroundColor = NSColor.WindowBackground,
Bordered = false,
TextColor = NSColor.DisabledControlText,
Editable = false,
Frame = new RectangleF (320, Frame.Height - 285 , 200, 17),
StringValue = "e.g. rupert/website-design"
};
ServerType = 0;
ButtonCellProto = new NSButtonCell ();
ButtonCellProto.SetButtonType (NSButtonType.Radio) ;
Matrix = new NSMatrix (new RectangleF (315, 180, 256, 78),
NSMatrixMode.Radio, ButtonCellProto, 4, 1);
Matrix.CellSize = new SizeF (256, 18);
Matrix.Cells [0].Title = "My own server";
Matrix.Cells [1].Title = "Github";
Matrix.Cells [2].Title = "Gitorious";
Matrix.Cells [3].Title = "The GNOME Project";
foreach (NSCell cell in Matrix.Cells)
cell.Font = SparkleUI.Font;
// TODO: Ugly hack, do properly with events
timer = new Timer () {
Interval = 50
};
timer.Elapsed += delegate {
InvokeOnMainThread (delegate {
if (Matrix.SelectedRow != ServerType) {
ServerType = Matrix.SelectedRow;
AddressTextField.Enabled = (ServerType == 0);
switch (ServerType) {
case 0:
AddressTextField.StringValue = "";
FolderNameHelpLabel.StringValue = "e.g. rupert/website-design";
break;
case 1:
AddressTextField.StringValue = "ssh://git@github.com/";
FolderNameHelpLabel.StringValue = "e.g. rupert/website-design";
break;
case 2:
AddressTextField.StringValue = "ssh://git@gitorious.org/";
FolderNameHelpLabel.StringValue = "e.g. project/website-design";
break;
case 3:
AddressTextField.StringValue = "ssh://git@gnome.org/git/";
FolderNameHelpLabel.StringValue = "e.g. gnome-icon-theme";
break;
}
}
if (ServerType == 0 && !AddressTextField.StringValue.Trim ().Equals ("")
&& !FolderNameTextField.StringValue.Trim ().Equals ("")) {
SyncButton.Enabled = true;
} else if (ServerType != 0 &&
!FolderNameTextField.StringValue.Trim ().Equals ("")) {
SyncButton.Enabled = true;
} else {
SyncButton.Enabled = false;
}
});
};
timer.Start ();
ContentView.AddSubview (ServerTypeLabel);
ContentView.AddSubview (Matrix);
ContentView.AddSubview (AddressLabel);
ContentView.AddSubview (AddressTextField);
ContentView.AddSubview (FolderNameLabel);
ContentView.AddSubview (FolderNameTextField);
ContentView.AddSubview (FolderNameHelpLabel);
SyncButton = new NSButton () {
Title = "Sync",
Enabled = false
};
SyncButton.Activated += delegate {
timer.Stop ();
timer = null;
string folder_name = FolderNameTextField.StringValue;
string server = AddressTextField.StringValue;
Controller.AddPageCompleted (server, folder_name);
};
Buttons.Add (SyncButton);
CancelButton = new NSButton () {
Title = "Cancel"
};
CancelButton.Activated += delegate {
InvokeOnMainThread (delegate {
PerformClose (this);
});
};
Buttons.Add (CancelButton);
break;
case PageType.Syncing:
Header = "Syncing folder " + Controller.SyncingFolder + "’…";
Description = "This may take a while.\n" +
"Are you sure its not coffee o'clock?";
ProgressIndicator = new NSProgressIndicator () {
Frame = new RectangleF (190, Frame.Height - 200, 640 - 150 - 80, 20),
Style = NSProgressIndicatorStyle.Bar
};
ProgressIndicator.StartAnimation (this);
ContentView.AddSubview (ProgressIndicator);
FinishButton = new NSButton () {
Title = "Finish",
Enabled = false
};
Buttons.Add (FinishButton);
break;
case PageType.Error:
Header = "Something went wrong…";
Description = "";
TryAgainButton = new NSButton () {
Title = "Try again…"
};
TryAgainButton.Activated += delegate {
Controller.ErrorPageCompleted ();
};
Buttons.Add (TryAgainButton);
break;
case PageType.Finished:
Header = "Folder synced succesfully!";
Description = "Now you can access the synced files from " +
"" + Controller.SyncingFolder + " in " +
"your SparkleShare folder.";
FinishButton = new NSButton () {
Title = "Finish"
};
FinishButton.Activated += delegate {
InvokeOnMainThread (delegate {
PerformClose (this);
});
};
OpenFolderButton = new NSButton () {
Title = "Open Folder"
};
OpenFolderButton.Activated += delegate {
SparkleShare.Controller.OpenSparkleShareFolder (Controller.SyncingFolder);
};
Buttons.Add (FinishButton);
Buttons.Add (OpenFolderButton);
NSApplication.SharedApplication.RequestUserAttention
(NSRequestUserAttentionType.CriticalRequest);
break;
}
ShowAll ();
});
};
}
}
}

View file

@ -28,7 +28,7 @@ using Mono.Unix;
namespace SparkleShare {
public class SparkleWindow : NSWindow {
public class SparkleSetupWindow : NSWindow {
public List <NSButton> Buttons;
public string Header;
@ -40,7 +40,7 @@ namespace SparkleShare {
private NSTextField DescriptionTextField;
public SparkleWindow () : base ()
public SparkleSetupWindow () : base ()
{
SetFrame (new RectangleF (0, 0, 640, 380), true);

View file

@ -62,7 +62,7 @@
<SpecificVersion>False</SpecificVersion>
<HintPath>..\..\bin\Meebey.SmartIrc4net.dll</HintPath>
</Reference>
<Reference Include="SparkleLib, Version=0.2.1.0, Culture=neutral, PublicKeyToken=null">
<Reference Include="SparkleLib, Version=0.2.4.0, Culture=neutral, PublicKeyToken=null">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\..\bin\SparkleLib.dll</HintPath>
</Reference>
@ -77,8 +77,6 @@
<Compile Include="..\SparkleController.cs">
<Link>SparkleController.cs</Link>
</Compile>
<Compile Include="SparkleWindow.cs" />
<Compile Include="SparkleIntro.cs" />
<Compile Include="SparkleMacController.cs" />
<Compile Include="SparkleStatusIcon.cs" />
<Compile Include="SparkleUI.cs" />
@ -87,9 +85,27 @@
</Compile>
<Compile Include="SparkleAbout.cs" />
<Compile Include="SparkleAlert.cs" />
<Compile Include="SparkleBubble.cs" />
<Compile Include="SparkleMacWatcher.cs" />
<Compile Include="SparkleEventLog.cs" />
<Compile Include="SparkleBadger.cs" />
<Compile Include="SparkleBubbles.cs" />
<Compile Include="SparkleSetup.cs" />
<Compile Include="SparkleSetupWindow.cs" />
<Compile Include="..\SparkleBubblesController.cs">
<Link>SparkleBubblesController.cs</Link>
</Compile>
<Compile Include="..\SparkleEventLogController.cs">
<Link>SparkleEventLogController.cs</Link>
</Compile>
<Compile Include="..\SparkleSetupController.cs">
<Link>SparkleSetupController.cs</Link>
</Compile>
<Compile Include="..\SparkleStatusIconController.cs">
<Link>SparkleStatusIconController.cs</Link>
</Compile>
<Compile Include="..\SparkleAboutController.cs">
<Link>SparkleAboutController.cs</Link>
</Compile>
</ItemGroup>
<ItemGroup>
<Page Include="MainMenu.xib" />
@ -170,9 +186,91 @@
<Content Include="..\..\data\icons\document-moved-12.png">
<Link>Pixmaps\document-moved-12.png</Link>
</Content>
<Content Include="..\..\po\ar.po">
<Link>Translations\ar.po</Link>
</Content>
<Content Include="..\..\po\bg.po">
<Link>Translations\bg.po</Link>
</Content>
<Content Include="..\..\po\ca.po">
<Link>Translations\ca.po</Link>
</Content>
<Content Include="..\..\po\cs_CZ.po">
<Link>Translations\cs_CZ.po</Link>
</Content>
<Content Include="..\..\po\da.po">
<Link>Translations\da.po</Link>
</Content>
<Content Include="..\..\po\de.po">
<Link>Translations\de.po</Link>
</Content>
<Content Include="..\..\po\el.po">
<Link>Translations\el.po</Link>
</Content>
<Content Include="..\..\po\eo.po">
<Link>Translations\eo.po</Link>
</Content>
<Content Include="..\..\po\es.po">
<Link>Translations\es.po</Link>
</Content>
<Content Include="..\..\po\fi.po">
<Link>Translations\fi.po</Link>
</Content>
<Content Include="..\..\po\fr.po">
<Link>Translations\fr.po</Link>
</Content>
<Content Include="..\..\po\he.po">
<Link>Translations\he.po</Link>
</Content>
<Content Include="..\..\po\hu.po">
<Link>Translations\hu.po</Link>
</Content>
<Content Include="..\..\po\it.po">
<Link>Translations\it.po</Link>
</Content>
<Content Include="..\..\po\ja.po">
<Link>Translations\ja.po</Link>
</Content>
<Content Include="..\..\po\nl.po">
<Link>Translations\nl.po</Link>
</Content>
<Content Include="..\..\po\no_NO.po">
<Link>Translations\no_NO.po</Link>
</Content>
<Content Include="..\..\po\pl.po">
<Link>Translations\pl.po</Link>
</Content>
<Content Include="..\..\po\pt_BR.po">
<Link>Translations\pt_BR.po</Link>
</Content>
<Content Include="..\..\po\ru.po">
<Link>Translations\ru.po</Link>
</Content>
<Content Include="..\..\po\sv.po">
<Link>Translations\sv.po</Link>
</Content>
<Content Include="..\..\po\te.po">
<Link>Translations\te.po</Link>
</Content>
<Content Include="..\..\po\uk.po">
<Link>Translations\uk.po</Link>
</Content>
<Content Include="..\..\po\zh_CN.po">
<Link>Translations\zh_CN.po</Link>
</Content>
<Content Include="..\..\po\zh_TW.po">
<Link>Translations\zh_TW.po</Link>
</Content>
<Content Include="..\..\data\about.png">
<Link>Pixmaps\about.png</Link>
</Content>
<Content Include="..\..\data\html\jquery.js">
<Link>HTML\jquery.js</Link>
</Content>
</ItemGroup>
<ItemGroup>
<Folder Include="Pixmaps\" />
<Folder Include="HTML\" />
<Folder Include="Translations\" />
</ItemGroup>
</Project>

View file

@ -31,6 +31,8 @@ namespace SparkleShare {
// user's notification area
public class SparkleStatusIcon : NSObject {
public SparkleStatusIconController Controller = new SparkleStatusIconController ();
private Timer Animation;
private int FrameNumber;
private string StateText;
@ -58,51 +60,232 @@ namespace SparkleShare {
public SparkleStatusIcon () : base ()
{
Animation = CreateAnimation ();
using (var a = new NSAutoreleasePool ()) {
Animation = CreateAnimation ();
StatusItem = NSStatusBar.SystemStatusBar.CreateStatusItem (28);
StatusItem.HighlightMode = true;
SetNormalState ();
CreateMenu ();
Menu.Delegate = new SparkleStatusIconMenuDelegate ();
StatusItem = NSStatusBar.SystemStatusBar.CreateStatusItem (28);
StatusItem.HighlightMode = true;
StateText = _("Up to date") + " (" + Controller.FolderSize + ")";
CreateMenu ();
Menu.Delegate = new SparkleStatusIconMenuDelegate ();
}
SparkleShare.Controller.FolderSizeChanged += delegate {
Controller.UpdateMenuEvent += delegate (IconState state) {
InvokeOnMainThread (delegate {
if (!Animation.Enabled)
SetNormalState ();
UpdateMenu ();
});
};
SparkleShare.Controller.FolderListChanged += delegate {
InvokeOnMainThread (delegate {
SetNormalState ();
CreateMenu ();
using (var a = new NSAutoreleasePool ()) {
switch (state) {
case IconState.Idle:
Animation.Stop ();
if (Controller.Folders.Length == 0)
StateText = _("Welcome to SparkleShare!");
else
StateText = _("Up to date") + " (" + Controller.FolderSize + ")";
StateMenuItem.Title = StateText;
CreateMenu ();
break;
case IconState.Syncing:
StateText = _("Syncing…");
StateMenuItem.Title = StateText;
if (!Animation.Enabled)
Animation.Start ();
break;
case IconState.Error:
StateText = _("Not everything is synced");
StateMenuItem.Title = StateText;
CreateMenu ();
InvokeOnMainThread (delegate {
StatusItem.Image = new NSImage (NSBundle.MainBundle.ResourcePath + "/Pixmaps/error.png");
StatusItem.AlternateImage = new NSImage (NSBundle.MainBundle.ResourcePath + "/Pixmaps/error-active.png");
StatusItem.Image.Size = new SizeF (16, 16);
StatusItem.AlternateImage.Size = new SizeF (16, 16);
});
break;
}
}
});
};
SparkleShare.Controller.OnIdle += delegate {
InvokeOnMainThread (delegate {
SetNormalState ();
CreateMenu ();
});
};
SparkleShare.Controller.OnSyncing += delegate {
InvokeOnMainThread (delegate {
SetAnimationState ();
UpdateMenu ();
});
};
SparkleShare.Controller.OnError += delegate {
InvokeOnMainThread (delegate {
SetNormalState (true);
CreateMenu ();
});
}
public void CreateMenu ()
{
using (NSAutoreleasePool a = new NSAutoreleasePool ()) {
StatusItem.Image = new NSImage (NSBundle.MainBundle.ResourcePath + "/Pixmaps/idle0.png");
StatusItem.AlternateImage = new NSImage (NSBundle.MainBundle.ResourcePath + "/Pixmaps/idle0-active.png");
StatusItem.Image.Size = new SizeF (16, 16);
StatusItem.AlternateImage.Size = new SizeF (16, 16);
Menu = new NSMenu ();
StateMenuItem = new NSMenuItem () {
Title = StateText
};
Menu.AddItem (StateMenuItem);
Menu.AddItem (NSMenuItem.SeparatorItem);
FolderMenuItem = new NSMenuItem () {
Title = "SparkleShare"
};
FolderMenuItem.Activated += delegate {
SparkleShare.Controller.OpenSparkleShareFolder ();
};
FolderMenuItem.Image = NSImage.ImageNamed ("sparkleshare-mac");
FolderMenuItem.Image.Size = new SizeF (16, 16);
Menu.AddItem (FolderMenuItem);
FolderMenuItems = new NSMenuItem [SparkleShare.Controller.Folders.Count];
if (Controller.Folders.Length > 0) {
Tasks = new EventHandler [SparkleShare.Controller.Folders.Count];
int i = 0;
foreach (string folder_name in SparkleShare.Controller.Folders) {
NSMenuItem item = new NSMenuItem ();
item.Title = folder_name;
if (SparkleShare.Controller.UnsyncedFolders.Contains (folder_name))
item.Image = NSImage.ImageNamed ("NSCaution");
else
item.Image = NSImage.ImageNamed ("NSFolder");
item.Image.Size = new SizeF (16, 16);
Tasks [i] = OpenFolderDelegate (folder_name);
FolderMenuItems [i] = item;
FolderMenuItems [i].Activated += Tasks [i];
i++;
};
} else {
FolderMenuItems = new NSMenuItem [1];
FolderMenuItems [0] = new NSMenuItem () {
Title = "No Remote Folders Yet"
};
}
foreach (NSMenuItem item in FolderMenuItems)
Menu.AddItem (item);
Menu.AddItem (NSMenuItem.SeparatorItem);
SyncMenuItem = new NSMenuItem () {
Title = "Add Remote Folder…"
};
if (!SparkleShare.Controller.FirstRun) {
SyncMenuItem.Activated += delegate {
InvokeOnMainThread (delegate {
NSApplication.SharedApplication.ActivateIgnoringOtherApps (true);
if (SparkleUI.Setup == null) {
SparkleUI.Setup = new SparkleSetup ();
SparkleUI.Setup.Controller.ShowAddPage ();
}
if (!SparkleUI.Setup.IsVisible)
SparkleUI.Setup.Controller.ShowAddPage ();
SparkleUI.Setup.OrderFrontRegardless ();
SparkleUI.Setup.MakeKeyAndOrderFront (this);
});
};
}
Menu.AddItem (SyncMenuItem);
Menu.AddItem (NSMenuItem.SeparatorItem);
RecentEventsMenuItem = new NSMenuItem () {
Title = "Show Recent Events"
};
if (Controller.Folders.Length > 0) {
RecentEventsMenuItem.Activated += delegate {
InvokeOnMainThread (delegate {
NSApplication.SharedApplication.ActivateIgnoringOtherApps (true);
if (SparkleUI.EventLog == null)
SparkleUI.EventLog = new SparkleEventLog ();
SparkleUI.EventLog.OrderFrontRegardless ();
SparkleUI.EventLog.MakeKeyAndOrderFront (this);
});
};
}
Menu.AddItem (RecentEventsMenuItem);
NotificationsMenuItem = new NSMenuItem ();
if (SparkleShare.Controller.NotificationsEnabled)
NotificationsMenuItem.Title = "Turn Notifications Off";
else
NotificationsMenuItem.Title = "Turn Notifications On";
NotificationsMenuItem.Activated += delegate {
SparkleShare.Controller.ToggleNotifications ();
InvokeOnMainThread (delegate {
if (SparkleShare.Controller.NotificationsEnabled)
NotificationsMenuItem.Title = "Turn Notifications Off";
else
NotificationsMenuItem.Title = "Turn Notifications On";
});
};
Menu.AddItem (NotificationsMenuItem);
Menu.AddItem (NSMenuItem.SeparatorItem);
AboutMenuItem = new NSMenuItem () {
Title = "About SparkleShare"
};
AboutMenuItem.Activated += delegate {
InvokeOnMainThread (delegate {
NSApplication.SharedApplication.ActivateIgnoringOtherApps (true);
if (SparkleUI.About == null)
SparkleUI.About = new SparkleAbout ();
});
};
Menu.AddItem (AboutMenuItem);
StatusItem.Menu = Menu;
StatusItem.Menu.Update ();
}
}
// A method reference that makes sure that opening the
// event log for each repository works correctly
private EventHandler OpenFolderDelegate (string name)
{
return delegate {
SparkleShare.Controller.OpenSparkleShareFolder (name);
};
}
@ -113,7 +296,7 @@ namespace SparkleShare {
FrameNumber = 0;
Timer Animation = new Timer () {
Interval = 35
Interval = 40
};
Animation.Elapsed += delegate {
@ -125,7 +308,7 @@ namespace SparkleShare {
InvokeOnMainThread (delegate {
string image_path = Path.Combine (NSBundle.MainBundle.ResourcePath,
"Pixmaps", "idle" + FrameNumber + ".png");
string alternate_image_path = Path.Combine (NSBundle.MainBundle.ResourcePath,
"Pixmaps", "idle" + FrameNumber + "-active.png");
@ -139,243 +322,6 @@ namespace SparkleShare {
return Animation;
}
// Creates the menu that is popped up when the
// user clicks the status icon
public void CreateMenu ()
{
Menu = new NSMenu ();
StateMenuItem = new NSMenuItem () {
Title = StateText
};
Menu.AddItem (StateMenuItem);
Menu.AddItem (NSMenuItem.SeparatorItem);
FolderMenuItem = new NSMenuItem () {
Title = "SparkleShare"
};
FolderMenuItem.Activated += delegate {
SparkleShare.Controller.OpenSparkleShareFolder ();
};
string folder_icon_path = Path.Combine (NSBundle.MainBundle.ResourcePath,
"sparkleshare-mac.icns");
FolderMenuItem.Image = new NSImage (folder_icon_path);
FolderMenuItem.Image.Size = new SizeF (16, 16);
Menu.AddItem (FolderMenuItem);
if (SparkleShare.Controller.Folders.Count > 0) {
FolderMenuItems = new NSMenuItem [SparkleShare.Controller.Folders.Count];
Tasks = new EventHandler [SparkleShare.Controller.Folders.Count];
int i = 0;
foreach (string folder_name in SparkleShare.Controller.Folders) {
NSMenuItem item = new NSMenuItem ();
item.Title = folder_name;
if (SparkleShare.Controller.UnsyncedFolders.Contains (folder_name))
item.Image = NSImage.ImageNamed ("NSCaution");
else
item.Image = NSImage.ImageNamed ("NSFolder");
item.Image.Size = new SizeF (16, 16);
Tasks [i] = OpenFolderDelegate (folder_name);
FolderMenuItems [i] = item;
FolderMenuItems [i].Activated += Tasks [i];
Menu.AddItem (FolderMenuItems [i]);
i++;
};
} else {
FolderMenuItems = new NSMenuItem [1];
FolderMenuItems [0] = new NSMenuItem () {
Title = "No Remote Folders Yet"
};
Menu.AddItem (FolderMenuItems [0]);
}
Menu.AddItem (NSMenuItem.SeparatorItem);
SyncMenuItem = new NSMenuItem () {
Title = "Add Remote Folder…"
};
if (!SparkleShare.Controller.FirstRun) {
SyncMenuItem.Activated += delegate {
InvokeOnMainThread (delegate {
NSApplication.SharedApplication.ActivateIgnoringOtherApps (true);
if (SparkleUI.Intro == null) {
SparkleUI.Intro = new SparkleIntro ();
SparkleUI.Intro.ShowServerForm (true);
}
if (!SparkleUI.Intro.IsVisible)
SparkleUI.Intro.ShowServerForm (true);
SparkleUI.Intro.OrderFrontRegardless ();
SparkleUI.Intro.MakeKeyAndOrderFront (this);
});
};
}
Menu.AddItem (SyncMenuItem);
Menu.AddItem (NSMenuItem.SeparatorItem);
RecentEventsMenuItem = new NSMenuItem () {
Title = "Show Recent Events"
};
if (SparkleShare.Controller.Folders.Count > 0) {
RecentEventsMenuItem.Activated += delegate {
InvokeOnMainThread (delegate {
NSApplication.SharedApplication.ActivateIgnoringOtherApps (true);
if (SparkleUI.EventLog == null)
SparkleUI.EventLog = new SparkleEventLog ();
SparkleUI.EventLog.OrderFrontRegardless ();
SparkleUI.EventLog.MakeKeyAndOrderFront (this);
});
};
}
Menu.AddItem (RecentEventsMenuItem);
NotificationsMenuItem = new NSMenuItem ();
if (SparkleShare.Controller.NotificationsEnabled)
NotificationsMenuItem.Title = "Turn Notifications Off";
else
NotificationsMenuItem.Title = "Turn Notifications On";
NotificationsMenuItem.Activated += delegate {
SparkleShare.Controller.ToggleNotifications ();
InvokeOnMainThread (delegate {
if (SparkleShare.Controller.NotificationsEnabled)
NotificationsMenuItem.Title = "Turn Notifications Off";
else
NotificationsMenuItem.Title = "Turn Notifications On";
});
};
Menu.AddItem (NotificationsMenuItem);
Menu.AddItem (NSMenuItem.SeparatorItem);
AboutMenuItem = new NSMenuItem () {
Title = "About SparkleShare"
};
AboutMenuItem.Activated += delegate {
InvokeOnMainThread (delegate {
NSApplication.SharedApplication.ActivateIgnoringOtherApps (true);
if (SparkleUI.About == null)
SparkleUI.About = new SparkleAbout ();
SparkleUI.About.OrderFrontRegardless ();
SparkleUI.About.MakeKeyAndOrderFront (this);
SparkleUI.About.CheckForNewVersion ();
});
};
Menu.AddItem (AboutMenuItem);
StatusItem.Menu = Menu;
StatusItem.Menu.Update ();
}
// A method reference that makes sure that opening the
// event log for each repository works correctly
private EventHandler OpenFolderDelegate (string name)
{
return delegate {
SparkleShare.Controller.OpenSparkleShareFolder (name);
};
}
public void UpdateMenu ()
{
StateMenuItem.Title = StateText;
}
// The state when there's nothing going on
private void SetNormalState ()
{
if (SparkleShare.Controller.UnsyncedFolders.Count > 0)
SetNormalState (true);
else
SetNormalState (false);
}
// The state when there's nothing going on
private void SetNormalState (bool error)
{
Animation.Stop ();
if (SparkleShare.Controller.Folders.Count == 0) {
StateText = _("Welcome to SparkleShare!");
InvokeOnMainThread (delegate {
StatusItem.Image = new NSImage (NSBundle.MainBundle.ResourcePath + "/Pixmaps/idle0.png");
StatusItem.AlternateImage = new NSImage (NSBundle.MainBundle.ResourcePath + "/Pixmaps/idle0-active.png");
StatusItem.Image.Size = new SizeF (16, 16);
StatusItem.AlternateImage.Size = new SizeF (16, 16);
});
} else {
if (error) {
StateText = _("Not everything is synced");
InvokeOnMainThread (delegate {
StatusItem.Image = new NSImage (NSBundle.MainBundle.ResourcePath + "/Pixmaps/error.png");
StatusItem.AlternateImage = new NSImage (NSBundle.MainBundle.ResourcePath + "/Pixmaps/error-active.png");
StatusItem.Image.Size = new SizeF (16, 16);
StatusItem.AlternateImage.Size = new SizeF (16, 16);
});
} else {
StateText = _("Up to date") + " (" + SparkleShare.Controller.FolderSize + ")";
InvokeOnMainThread (delegate {
StatusItem.Image = new NSImage (NSBundle.MainBundle.ResourcePath + "/Pixmaps/idle0.png");
StatusItem.AlternateImage = new NSImage (NSBundle.MainBundle.ResourcePath + "/Pixmaps/idle0-active.png");
StatusItem.Image.Size = new SizeF (16, 16);
StatusItem.AlternateImage.Size = new SizeF (16, 16);
});
}
}
}
// The state when animating
private void SetAnimationState ()
{
StateText = _("Syncing…");
if (!Animation.Enabled)
Animation.Start ();
}
}

View file

@ -14,13 +14,14 @@
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
using System;
using System.Collections.Generic;
using System.Drawing;
using System.IO;
using System.Timers;
using Mono.Unix;
using MonoMac.Foundation;
using MonoMac.AppKit;
using MonoMac.ObjCRuntime;
@ -28,39 +29,20 @@ using MonoMac.Growl;
namespace SparkleShare {
public partial class AppDelegate : NSApplicationDelegate {
public class SparkleUI : AppDelegate {
public override void WillBecomeActive (NSNotification notification)
{
NSApplication.SharedApplication.DockTile.BadgeLabel = null;
}
public override void OrderFrontStandardAboutPanel (NSObject sender)
{
// FIXME: Doesn't work
new SparkleAbout ();
}
public override void WillTerminate (NSNotification notification)
{
SparkleShare.Controller.Quit ();
}
}
public class SparkleUI : AppDelegate {
public static SparkleStatusIcon StatusIcon;
public static SparkleEventLog EventLog;
public static SparkleIntro Intro;
public static SparkleStatusIcon StatusIcon;
public static SparkleEventLog EventLog;
public static SparkleSetup Setup;
public static SparkleBubbles Bubbles;
public static SparkleAbout About;
public static NSFont Font;
public static NSFont Font;
private NSAlert alert;
public SparkleUI ()
{
public SparkleUI ()
{
string content_path = Directory.GetParent (
System.AppDomain.CurrentDomain.BaseDirectory).ToString ();
@ -71,6 +53,10 @@ namespace SparkleShare {
Dlfcn.dlopen (growl_path, 0);
NSApplication.Init ();
// Use translations
Catalog.Init ("sparkleshare",
Path.Combine (NSBundle.MainBundle.ResourcePath, "Translations"));
using (NSAutoreleasePool pool = new NSAutoreleasePool ()) {
// Needed for Growl
@ -79,106 +65,44 @@ namespace SparkleShare {
NSApplication.SharedApplication.ApplicationIconImage
= NSImage.ImageNamed ("sparkleshare.icns");
SetFolderIcon ();
if (!SparkleShare.Controller.BackendIsPresent) {
this.alert = new SparkleAlert ();
this.alert.RunModal ();
return;
}
SetFolderIcon ();
Font = NSFontManager.SharedFontManager.FontWithFamily
("Lucida Grande", NSFontTraitMask.Condensed, 0, 13);
StatusIcon = new SparkleStatusIcon ();
Bubbles = new SparkleBubbles ();
if (SparkleShare.Controller.FirstRun) {
Setup = new SparkleSetup ();
Setup.Controller.ShowSetupPage ();
}
}
}
SparkleShare.Controller.NotificationRaised += delegate (string user_name, string user_email,
string message, string repository_path) {
InvokeOnMainThread (delegate {
if (EventLog != null)
EventLog.UpdateEvents ();
public void SetFolderIcon ()
{
string folder_icon_path = Path.Combine (NSBundle.MainBundle.ResourcePath,
"sparkleshare-mac.icns");
if (SparkleShare.Controller.NotificationsEnabled) {
if (NSApplication.SharedApplication.DockTile.BadgeLabel == null)
NSApplication.SharedApplication.DockTile.BadgeLabel = "1";
else
NSApplication.SharedApplication.DockTile.BadgeLabel =
(int.Parse (NSApplication.SharedApplication.DockTile.BadgeLabel) + 1).ToString ();
if (GrowlApplicationBridge.IsGrowlRunning ()) {
SparkleBubble bubble = new SparkleBubble (user_name, message) {
ImagePath = SparkleShare.Controller.GetAvatar (user_email, 36)
};
bubble.Show ();
} else {
NSApplication.SharedApplication.RequestUserAttention
(NSRequestUserAttentionType.InformationalRequest);
}
}
});
};
SparkleShare.Controller.ConflictNotificationRaised += delegate {
string title = "Ouch! Mid-air collision!";
string subtext = "Don't worry, SparkleShare made a copy of each conflicting file.";
new SparkleBubble (title, subtext).Show ();
};
NSImage folder_icon = new NSImage (folder_icon_path);
NSWorkspace.SharedWorkspace.SetIconforFile (folder_icon,
SparkleShare.Controller.SparklePath, 0);
}
SparkleShare.Controller.AvatarFetched += delegate {
InvokeOnMainThread (delegate {
if (EventLog != null)
EventLog.UpdateEvents ();
});
};
SparkleShare.Controller.OnIdle += delegate {
InvokeOnMainThread (delegate {
if (EventLog != null)
EventLog.UpdateEvents ();
});
};
SparkleShare.Controller.FolderListChanged += delegate {
InvokeOnMainThread (delegate {
if (EventLog != null) {
EventLog.UpdateChooser ();
EventLog.UpdateEvents ();
}
});
};
if (SparkleShare.Controller.FirstRun) {
Intro = new SparkleIntro ();
Intro.ShowAccountForm ();
}
}
public void SetFolderIcon ()
{
string folder_icon_path = Path.Combine (NSBundle.MainBundle.ResourcePath,
"sparkleshare-mac.icns");
NSImage folder_icon = new NSImage (folder_icon_path);
NSWorkspace.SharedWorkspace.SetIconforFile (folder_icon,
SparkleShare.Controller.SparklePath, 0);
}
public void Run ()
{
public void Run ()
{
NSApplication.Main (new string [0]);
}
}
[Export("registrationDictionaryForGrowl")]
@ -188,4 +112,18 @@ namespace SparkleShare {
return NSDictionary.FromFile (path);
}
}
public partial class AppDelegate : NSApplicationDelegate {
public override void WillBecomeActive (NSNotification notification)
{
NSApplication.SharedApplication.DockTile.BadgeLabel = null;
}
public override void WillTerminate (NSNotification notification)
{
SparkleShare.Controller.Quit ();
}
}
}

View file

@ -13,19 +13,39 @@ endif
SOURCES = \
SparkleAbout.cs \
SparkleBubble.cs \
SparkleAboutController.cs \
SparkleBubbles.cs \
SparkleBubblesController.cs \
SparkleController.cs \
SparkleEntry.cs \
SparkleInfobar.cs \
SparkleIntro.cs \
SparkleLinController.cs \
SparkleEventLog.cs \
SparkleEventLogController.cs \
SparkleLinController.cs \
SparkleSetup.cs \
SparkleSetupController.cs \
SparkleSetupWindow.cs \
SparkleShare.cs \
SparkleSpinner.cs \
SparkleStatusIcon.cs \
SparkleStatusIconController.cs \
SparkleUI.cs \
SparkleUIHelpers.cs \
SparkleWindow.cs
SparkleUIHelpers.cs
SparkleBubbles.cs \
SparkleBubblesController.cs \
SparkleController.cs \
SparkleEntry.cs \
SparkleEventLog.cs \
SparkleEventLogController.cs \
SparkleLinController.cs \
SparkleSetup.cs \
SparkleSetupController.cs \
SparkleSetupWindow.cs \
SparkleShare.cs \
SparkleSpinner.cs \
SparkleStatusIcon.cs \
SparkleStatusIconController.cs \
SparkleUI.cs \
SparkleUIHelpers.cs
include $(top_srcdir)/build/build.mk

View file

@ -26,7 +26,9 @@ namespace SparkleShare {
public class SparkleAbout : Window {
private Label version;
public SparkleAboutController Controller = new SparkleAboutController ();
private Label updates;
// Short alias for the translations
@ -38,30 +40,54 @@ namespace SparkleShare {
public SparkleAbout () : base ("")
{
DefaultSize = new Gdk.Size (360, 260);
DeleteEvent += delegate (object o, DeleteEventArgs args) {
HideAll ();
args.RetVal = true;
};
DefaultSize = new Gdk.Size (600, 260);
Resizable = false;
BorderWidth = 0;
IconName = "folder-sparkleshare";
WindowPosition = WindowPosition.Center;
Title = _("About SparkleShare");
Resizable = false;
AppPaintable = true;
// TODO: Should be able to do without referencing SparkleLib...
//string image_path = SparkleLib.SparkleHelpers.CombineMore (SparkleLib.Defines.DATAROOTDIR,
// "sparkleshare", "pixmaps", "about.png");
Realize ();
//Gdk.Pixbuf buf = new Gdk.Pixbuf (image_path);
//Gdk.Pixmap map, map2;
//buf.RenderPixmapAndMask (out map, out map2, 255);
//GdkWindow.SetBackPixmap (map, false);
CreateAbout ();
SparkleShare.Controller.NewVersionAvailable += delegate (string new_version) {
Controller.NewVersionEvent += delegate (string new_version) {
Application.Invoke (delegate {
this.version.Markup = String.Format ("<small><span fgcolor='#f57900'>{0}: {1}</span></small>", _("A newer version is available"), new_version);
this.version.ShowAll ();
this.updates.Markup = String.Format ("<span font_size='small' fgcolor='#f57900'>{0}</span>",
String.Format (_("A newer version ({0}) is available!"), new_version));
this.updates.ShowAll ();
});
};
SparkleShare.Controller.VersionUpToDate += delegate {
Controller.VersionUpToDateEvent += delegate {
Application.Invoke (delegate {
this.version.Markup = String.Format ("<small><span fgcolor='#4e9a06'>{0}</span></small>", _("You are running the latest version."));
this.version.ShowAll ();
this.updates.Markup = String.Format ("<span font_size='small' fgcolor='#4e9a06'>{0}</span>",
_("You are running the latest version."));
this.updates.ShowAll ();
});
};
SparkleShare.Controller.CheckForNewVersion ();
Controller.CheckingForNewVersionEvent += delegate {
Application.Invoke (delegate {
this.updates.Markup = String.Format ("<span font_size='small' fgcolor='#4e9a06'>{0}</span>",
_("Checking for updates..."));
this.updates.ShowAll ();
});
};
}
@ -70,84 +96,58 @@ namespace SparkleShare {
Gdk.Color color = Style.Foreground (StateType.Insensitive);
string secondary_text_color = SparkleUIHelpers.GdkColorToHex (color);
EventBox box = new EventBox ();
box.ModifyBg (StateType.Normal, new TreeView ().Style.Base (StateType.Normal));
Label header = new Label () {
Markup = "<span font_size='xx-large'>SparkleShare</span>\n<span fgcolor='" + secondary_text_color + "'><small>" + SparkleShare.Controller.Version + "</small></span>",
Xalign = 0,
Xpad = 18,
Ypad = 18
};
box.Add (header);
this.version = new Label () {
Markup = String.Format ("<small>{0}</small>", _("Checking for updates...")),
Label version = new Label () {
Markup = "<span font_size='small' fgcolor='white'>" +
"version " + Controller.RunningVersion +
"</span>",
Xalign = 0,
Xpad = 18,
Ypad = 22,
Xpad = 300
};
this.updates = new Label () {
Markup = "<span font_size='small' fgcolor='" + secondary_text_color + "'>" +
_("Checking for updates...") +
"</span>",
Xalign = 0,
Xpad = 300
};
Label copyright = new Label () {
Markup = "<span font_size='small' fgcolor='white'>" +
"Copyright © 2010" + DateTime.Now.Year + " " +
"Hylke Bons and others." +
"</span>",
Xalign = 0,
Xpad = 300
};
Label license = new Label () {
Xalign = 0,
Xpad = 18,
Ypad = 0,
LineWrap = true,
Wrap = true,
LineWrapMode = Pango.WrapMode.Word,
Markup = "<small>Copyright © 2010" + DateTime.Now.Year + " Hylke Bons and others\n" +
"\n" +
"SparkleShare is Free and Open Source Software. " +
"You are free to use, modify, and redistribute it " +
"under the terms of the GNU General Public License version 3 or later.</small>"
Markup = "<span font_size='small' fgcolor='white'>" +
"SparkleShare is Free and Open Source Software. You are free to use, modify, " +
"and redistribute it under the GNU General Public License version 3 or later." +
"</span>",
WidthRequest = 330,
Wrap = true,
Xalign = 0,
Xpad = 300,
};
VBox vbox = new VBox (false, 0) {
BorderWidth = 0
VBox layout_horizontal = new VBox (false, 0) {
BorderWidth = 0,
HeightRequest = 260,
WidthRequest = 640
};
HButtonBox button_bar = new HButtonBox () {
BorderWidth = 12
};
layout_horizontal.PackStart (new Label (""), false, false, 42);
layout_horizontal.PackStart (version, false, false, 0);
layout_horizontal.PackStart (this.updates, false, false, 0);
layout_horizontal.PackStart (copyright, false, false, 9);
layout_horizontal.PackStart (license, false, false, 0);
layout_horizontal.PackStart (new Label (""), false, false, 0);
Button credits_button = new Button (_("_Show Credits")) {
UseUnderline = true
};
credits_button.Clicked += delegate {
Process process = new Process ();
process.StartInfo.FileName = "xdg-open";
process.StartInfo.Arguments = "http://www.sparkleshare.org/credits";
process.Start ();
};
Button website_button = new Button (_("_Visit Website")) {
UseUnderline = true
};
website_button.Clicked += delegate {
Process process = new Process ();
process.StartInfo.FileName = "xdg-open";
process.StartInfo.Arguments = "http://www.sparkleshare.org/";
process.Start ();
};
button_bar.Add (website_button);
button_bar.Add (credits_button);
vbox.PackStart (box, true, true, 0);
vbox.PackStart (this.version, false, false, 0);
vbox.PackStart (license, true, true, 0);
vbox.PackStart (new Label (""), true, true, 0);
vbox.PackStart (button_bar, false, false, 0);
Add (vbox);
Add (layout_horizontal);
}
}
}

View file

@ -0,0 +1,95 @@
// SparkleShare, a collaboration and sharing tool.
// Copyright (C) 2010 Hylke Bons <hylkebons@gmail.com>
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
using System;
using System.Net;
using System.Threading;
using System.Timers;
using SparkleLib;
namespace SparkleShare {
public class SparkleAboutController {
public event NewVersionEventHandler NewVersionEvent;
public delegate void NewVersionEventHandler (string new_version);
public event VersionUpToDateEventHandler VersionUpToDateEvent;
public delegate void VersionUpToDateEventHandler ();
public event CheckingForNewVersionEventHandler CheckingForNewVersionEvent;
public delegate void CheckingForNewVersionEventHandler ();
public string RunningVersion {
get {
return SparkleBackend.Version;
}
}
// Check for a new version once a day
private System.Timers.Timer version_checker = new System.Timers.Timer () {
Enabled = true,
Interval = 24 * 60 * 60 * 1000
};
public SparkleAboutController ()
{
CheckForNewVersion ();
this.version_checker.Elapsed += delegate {
CheckForNewVersion ();
};
}
public void CheckForNewVersion ()
{
this.version_checker.Stop ();
if (CheckingForNewVersionEvent != null)
CheckingForNewVersionEvent ();
WebClient web_client = new WebClient ();
Uri uri = new Uri ("http://www.sparkleshare.org/version");
web_client.DownloadStringCompleted += delegate (object o, DownloadStringCompletedEventArgs args) {
if (args.Error != null)
return;
string new_version = args.Result.Trim ();
// Add a little delay, making it seems we're
// actually doing hard work
Thread.Sleep (2 * 1000);
if (RunningVersion.Equals (new_version)) {
if (VersionUpToDateEvent != null)
VersionUpToDateEvent ();
} else {
if (NewVersionEvent != null)
NewVersionEvent (new_version);
}
this.version_checker.Start ();
};
web_client.DownloadStringAsync (uri);
}
}
}

View file

@ -16,26 +16,41 @@
using System;
using Gtk;
using Notifications;
namespace SparkleShare {
public class SparkleBubble : Notification {
public class SparkleBubbles {
public SparkleBubble (string title, string subtext) : base (title, subtext)
public SparkleBubblesController Controller = new SparkleBubblesController ();
public SparkleBubbles ()
{
IconName = "folder-sparkleshare";
Timeout = 4500;
Urgency = Urgency.Low;
Controller.ShowBubbleEvent += delegate (string title, string subtext, string image_path) {
Notification notification = new Notification () {
Timeout = 5 * 1000,
Urgency = Urgency.Low
};
if (image_path != null)
notification.Icon = new Gdk.Pixbuf (image_path);
else
notification.IconName = "folder-sparkleshare";
notification.Show ();
};
}
// Checks whether the system allows adding buttons to a notification,
// prevents error messages in Ubuntu.
new public void AddAction (string action, string label, ActionHandler handler)
{
if (Array.IndexOf (Notifications.Global.Capabilities, "actions") > -1)
base.AddAction (action, label, handler);
}
// new public void AddAction (string action, string label, ActionHandler handler)
// {
// if (Array.IndexOf (Notifications.Global.Capabilities, "actions") > -1)
// base.AddAction (action, label, handler);
// }
}
}

View file

@ -0,0 +1,45 @@
// SparkleShare, a collaboration and sharing tool.
// Copyright (C) 2010 Hylke Bons <hylkebons@gmail.com>
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
using System;
namespace SparkleShare {
public class SparkleBubblesController {
public event ShowBubbleEventHandler ShowBubbleEvent;
public delegate void ShowBubbleEventHandler (string title, string subtext, string image_path);
public SparkleBubblesController ()
{
SparkleShare.Controller.ConflictNotificationRaised += delegate {
if (ShowBubbleEvent != null && SparkleShare.Controller.NotificationsEnabled)
ShowBubbleEvent ("Ouch! Mid-air collision!",
"Don't worry, SparkleShare made a copy of each conflicting file.", null);
};
SparkleShare.Controller.NotificationRaised += delegate (string user_name, string user_email,
string message, string folder_path) {
if (ShowBubbleEvent != null && SparkleShare.Controller.NotificationsEnabled)
ShowBubbleEvent (user_name, message,
SparkleShare.Controller.GetAvatar (user_email, 36));
};
}
}
}

View file

@ -74,12 +74,6 @@ namespace SparkleShare {
public delegate void NotificationRaisedEventHandler (string user_name, string user_email,
string message, string repository_path);
public event NewVersionAvailableEventHandler NewVersionAvailable;
public delegate void NewVersionAvailableEventHandler (string new_version);
public event VersionUpToDateEventHandler VersionUpToDate;
public delegate void VersionUpToDateEventHandler ();
// Short alias for the translations
public static string _ (string s)
@ -285,6 +279,7 @@ namespace SparkleShare {
public string GetHTMLLog (List<SparkleChangeSet> change_sets)
{
List <ActivityDay> activity_days = new List <ActivityDay> ();
List<string> emails = new List<string> ();
change_sets.Sort ((x, y) => (x.Timestamp.CompareTo (y.Timestamp)));
change_sets.Reverse ();
@ -293,7 +288,8 @@ namespace SparkleShare {
return null;
foreach (SparkleChangeSet change_set in change_sets) {
GetAvatar (change_set.UserEmail, 36);
if (!emails.Contains (change_set.UserEmail))
emails.Add (change_set.UserEmail);
bool change_set_inserted = false;
foreach (ActivityDay stored_activity_day in activity_days) {
@ -314,6 +310,10 @@ namespace SparkleShare {
}
}
new Thread (new ThreadStart (delegate {
FetchAvatars (emails, 48);
})).Start ();
string event_log_html = EventLogHTML;
string day_entry_html = DayEntryHTML;
string event_entry_html = EventEntryHTML;
@ -324,7 +324,7 @@ namespace SparkleShare {
foreach (SparkleChangeSet change_set in activity_day) {
string event_entry = "<dl>";
if (change_set.IsMerge) {
event_entry += "<dd>Did something magical</dd>";
@ -335,9 +335,9 @@ namespace SparkleShare {
change_set.Folder, file_path);
if (File.Exists (absolute_file_path))
event_entry += "<dd class='document-edited'><a href='" + absolute_file_path + "'>" + file_path + "</a></dd>";
event_entry += "<dd class='document edited'><a href='" + absolute_file_path + "'>" + file_path + "</a></dd>";
else
event_entry += "<dd class='document-edited'>" + file_path + "</dd>";
event_entry += "<dd class='document edited'>" + file_path + "</dd>";
}
}
@ -347,9 +347,9 @@ namespace SparkleShare {
change_set.Folder, file_path);
if (File.Exists (absolute_file_path))
event_entry += "<dd class='document-added'><a href='" + absolute_file_path + "'>" + file_path + "</a></dd>";
event_entry += "<dd class='document added'><a href='" + absolute_file_path + "'>" + file_path + "</a></dd>";
else
event_entry += "<dd class='document-added'>" + file_path + "</dd>";
event_entry += "<dd class='document added'>" + file_path + "</dd>";
}
}
@ -359,9 +359,9 @@ namespace SparkleShare {
change_set.Folder, file_path);
if (File.Exists (absolute_file_path))
event_entry += "<dd class='document-deleted'><a href='" + absolute_file_path + "'>" + file_path + "</a></dd>";
event_entry += "<dd class='document deleted'><a href='" + absolute_file_path + "'>" + file_path + "</a></dd>";
else
event_entry += "<dd class='document-deleted'>" + file_path + "</dd>";
event_entry += "<dd class='document deleted'>" + file_path + "</dd>";
}
}
@ -375,9 +375,9 @@ namespace SparkleShare {
change_set.Folder, to_file_path);
if (File.Exists (absolute_file_path))
event_entry += "<dd class='document-moved'><a href='" + absolute_file_path + "'>" + file_path + "</a><br/>";
event_entry += "<dd class='document moved'><a href='" + absolute_file_path + "'>" + file_path + "</a><br/>";
else
event_entry += "<dd class='document-moved'>" + file_path + "<br/>";
event_entry += "<dd class='document moved'>" + file_path + "<br/>";
if (File.Exists (absolute_to_file_path))
event_entry += "<a href='" + absolute_to_file_path + "'>" + to_file_path + "</a></dd>";
@ -388,14 +388,38 @@ namespace SparkleShare {
}
}
}
string comments = "";
comments = "<div class=\"comments\">";
if (change_set.Notes != null) {
change_set.Notes.Sort ((x, y) => (x.Timestamp.CompareTo (y.Timestamp)));
foreach (SparkleNote note in change_set.Notes) {
comments += "<div class=\"comment-text\">" +
"<p class=\"comment-author\"" +
" style=\"background-image: url('file://" + GetAvatar (note.UserEmail, 48) + "');\">" +
note.UserName + "</p>" +
note.Body +
"</div>";
}
}
comments += "</div>";
string avatar_email = "";
if (File.Exists (GetAvatar (change_set.UserEmail, 48)))
avatar_email = change_set.UserEmail;
event_entry += "</dl>";
event_entries += event_entry_html.Replace ("<!-- $event-entry-content -->", event_entry)
.Replace ("<!-- $event-user-name -->", change_set.UserName)
.Replace ("<!-- $event-avatar-url -->", "file://" + GetAvatar (change_set.UserEmail, 36))
.Replace ("<!-- $event-avatar-url -->", "file://" + GetAvatar (avatar_email, 48))
.Replace ("<!-- $event-time -->", change_set.Timestamp.ToString ("H:mm"))
.Replace ("<!-- $event-folder -->", change_set.Folder)
.Replace ("<!-- $event-folder-color -->", AssignColor (change_set.Folder));
.Replace ("<!-- $event-revision -->", change_set.Revision)
.Replace ("<!-- $event-folder-color -->", AssignColor (change_set.Folder))
.Replace ("<!-- $event-comments -->", comments);
}
string day_entry = "";
@ -406,31 +430,35 @@ namespace SparkleShare {
today.Month == activity_day.DateTime.Month &&
today.Year == activity_day.DateTime.Year) {
day_entry = day_entry_html.Replace ("<!-- $day-entry-header -->", "<b>Today</b>");
day_entry = day_entry_html.Replace ("<!-- $day-entry-header -->", "Today");
} else if (yesterday.Day == activity_day.DateTime.Day &&
yesterday.Month == activity_day.DateTime.Month &&
yesterday.Year == activity_day.DateTime.Year) {
day_entry = day_entry_html.Replace ("<!-- $day-entry-header -->", "<b>Yesterday</b>");
day_entry = day_entry_html.Replace ("<!-- $day-entry-header -->", "Yesterday");
} else {
if (activity_day.DateTime.Year != DateTime.Now.Year) {
// TRANSLATORS: This is the date in the event logs
day_entry = day_entry_html.Replace ("<!-- $day-entry-header -->",
"<b>" + activity_day.DateTime.ToString (_("ddd MMM d, yyyy")) + "</b>");
activity_day.DateTime.ToString (_("dddd, MMMM d, yyyy")));
} else {
// TRANSLATORS: This is the date in the event logs, without the year
day_entry = day_entry_html.Replace ("<!-- $day-entry-header -->",
"<b>" + activity_day.DateTime.ToString (_("ddd MMM d")) + "</b>");
activity_day.DateTime.ToString (_("dddd, MMMM d")));
}
}
event_log += day_entry.Replace ("<!-- $day-entry-content -->", event_entries);
}
return event_log_html.Replace ("<!-- $event-log-content -->", event_log);
string html = event_log_html.Replace ("<!-- $event-log-content -->", event_log)
.Replace ("<!-- $username -->", UserName)
.Replace ("<!-- $user-avatar-url -->", "file://" + GetAvatar (UserEmail, 48));
return html;
}
@ -454,7 +482,7 @@ namespace SparkleShare {
// Fires events for the current syncing state
private void UpdateState ()
public void UpdateState ()
{
foreach (SparkleRepoBase repo in Repositories) {
if (repo.Status == SyncStatus.SyncDown ||
@ -495,7 +523,6 @@ namespace SparkleShare {
if (backend == null)
return;
SparkleRepoBase repo = null;
@ -508,7 +535,6 @@ namespace SparkleShare {
else
repo = new SparkleRepoGit (folder_path, SparkleBackend.DefaultBackend);
repo.NewChangeSet += delegate (SparkleChangeSet change_set, string repository_path) {
string message = FormatMessage (change_set);
@ -522,6 +548,11 @@ namespace SparkleShare {
};
repo.SyncStatusChanged += delegate (SyncStatus status) {
/* if (status == SyncStatus.SyncUp) {
foreach (string path in repo.UnsyncedFilePaths)
Console.WriteLine (path);
}
*/
if (status == SyncStatus.Idle ||
status == SyncStatus.SyncUp ||
status == SyncStatus.SyncDown ||
@ -814,68 +845,77 @@ namespace SparkleShare {
// Gets the avatar for a specific email address and size
public string GetAvatar (string email, int size)
public void FetchAvatars (List<string> emails, int size)
{
string avatar_path = SparkleHelpers.CombineMore (SparklePaths.SparkleLocalIconPath,
size + "x" + size, "status");
List<string> old_avatars = new List<string> ();
bool avatar_fetched = false;
string avatar_path = SparkleHelpers.CombineMore (
SparklePaths.SparkleLocalIconPath, size + "x" + size, "status");
string avatar_file_path = Path.Combine (avatar_path, "avatar-" + email);
if (!Directory.Exists (avatar_path)) {
Directory.CreateDirectory (avatar_path);
SparkleHelpers.DebugInfo ("Config", "Created '" + avatar_path + "'");
}
if (File.Exists (avatar_file_path)) {
FileInfo avatar_info = new FileInfo (avatar_file_path);
foreach (string email in emails) {
string avatar_file_path = Path.Combine (avatar_path, "avatar-" + email);
// Delete avatars older than a month and get a new one
if (avatar_info.CreationTime < DateTime.Now.AddMonths (-1)) {
avatar_info.Delete ();
return GetAvatar (email, size);
if (File.Exists (avatar_file_path)) {
FileInfo avatar_info = new FileInfo (avatar_file_path);
// Delete avatars older than a month
if (avatar_info.CreationTime < DateTime.Now.AddMonths (-1)) {
avatar_info.Delete ();
old_avatars.Add (email);
}
} else {
return avatar_file_path;
}
WebClient client = new WebClient ();
string url = "http://gravatar.com/avatar/" + GetMD5 (email) +
".jpg?s=" + size + "&d=404";
} else {
if (!Directory.Exists (avatar_path)) {
Directory.CreateDirectory (avatar_path);
SparkleHelpers.DebugInfo ("Config", "Created '" + avatar_path + "'");
}
try {
// Fetch the avatar
byte [] buffer = client.DownloadData (url);
// Let's try to get the person's gravatar for next time
WebClient web_client = new WebClient ();
Uri uri = new Uri ("https://secure.gravatar.com/avatar/" + GetMD5 (email) +
".jpg?s=" + size + "&d=404");
// Write the avatar data to a
// if not empty
if (buffer.Length > 255) {
avatar_fetched = true;
File.WriteAllBytes (avatar_file_path, buffer);
SparkleHelpers.DebugInfo ("Controller", "Fetched gravatar for " + email);
}
string tmp_file_path = SparkleHelpers.CombineMore (SparklePaths.SparkleTmpPath, email + size);
if (!File.Exists (tmp_file_path)) {
web_client.DownloadFileAsync (uri, tmp_file_path);
web_client.DownloadFileCompleted += delegate {
if (File.Exists (avatar_file_path))
File.Delete (avatar_file_path);
FileInfo tmp_file_info = new FileInfo (tmp_file_path);
if (tmp_file_info.Length > 255)
File.Move (tmp_file_path, avatar_file_path);
SparkleHelpers.DebugInfo ("Controller", "Fetched gravatar: " + email);
if (AvatarFetched != null)
AvatarFetched ();
};
}
// Fall back to a generic icon if there is no gravatar
if (File.Exists (avatar_file_path))
return avatar_file_path;
else
return null;
} catch (WebException) {
SparkleHelpers.DebugInfo ("Controller", "Failed fetching gravatar for " + email);
}
}
}
// Fetch new versions of the avatars that we
// deleted because they were too old
if (old_avatars.Count > 0)
FetchAvatars (old_avatars, size);
if (AvatarFetched != null && avatar_fetched)
AvatarFetched ();
}
public string GetAvatar (string email, int size)
{
string avatar_file_path = SparkleHelpers.CombineMore (
SparklePaths.SparkleLocalIconPath, size + "x" + size, "status", "avatar-" + email);
return avatar_file_path;
}
public void FetchFolder (string server, string remote_folder)
{
server = server.Trim ();
remote_folder = remote_folder.Trim ();
if (!Directory.Exists (SparklePaths.SparkleTmpPath))
Directory.CreateDirectory (SparklePaths.SparkleTmpPath);
@ -950,7 +990,6 @@ namespace SparkleShare {
fetcher.Failed += delegate {
if (FolderFetchError != null)
FolderFetchError ();
@ -1012,36 +1051,17 @@ namespace SparkleShare {
}
public string Version {
get {
return SparkleBackend.Version;
public void AddNoteToFolder (string folder_name, string revision, string note)
{
foreach (SparkleRepoBase repo in Repositories) {
if (repo.Name.Equals (folder_name))
repo.AddNote (revision, note);
}
}
public void CheckForNewVersion ()
{
WebClient web_client = new WebClient ();
Uri uri = new Uri ("http://www.sparkleshare.org/version");
web_client.DownloadStringCompleted += delegate (object o, DownloadStringCompletedEventArgs args) {
if (args.Error != null)
return;
string new_version = args.Result.Trim ();
if (Version.Equals (new_version)) {
if (VersionUpToDate != null)
VersionUpToDate ();
} else {
if (NewVersionAvailable != null)
NewVersionAvailable (new_version);
}
};
web_client.DownloadStringAsync (uri);
}
private string [] tango_palette = new string [] {"#eaab00", "#e37222",

View file

@ -17,6 +17,7 @@
using Gtk;
// TODO: Remove with Gtk3
namespace SparkleShare {
public class SparkleEntry : Entry {
@ -33,7 +34,6 @@ namespace SparkleShare {
ClipboardPasted += delegate { OnEntered (); };
FocusOutEvent += delegate {
if (Text.Equals ("") || Text == null)
ExampleTextActive = true;

View file

@ -84,7 +84,6 @@ namespace SparkleShare {
LinkStatus = args.Link;
};
// FIXME: Use the right event, waiting for newer webkit bindings: NavigationPolicyDecisionRequested
WebView.NavigationRequested += delegate (object o, WebKit.NavigationRequestedArgs args) {
if (args.Request.Uri == LinkStatus) {
Process process = new Process ();
@ -92,9 +91,26 @@ namespace SparkleShare {
process.StartInfo.Arguments = args.Request.Uri.Replace (" ", "\\ "); // Escape space-characters
process.Start ();
// Don't follow HREFs (as this would cause a page refresh)
args.RetVal = 1;
} else {
Regex regex = new Regex (@"(.+)~(.+)~(.+)");
Match match = regex.Match (args.Request.Uri);
if (match.Success) {
string folder_name = match.Groups [1].Value;
string revision = match.Groups [2].Value;
string note = match.Groups [3].Value.Replace ("%20", " ");
Thread thread = new Thread (new ThreadStart (delegate {
SparkleShare.Controller.AddNoteToFolder (folder_name, revision, note);
}));
thread.Start ();
}
}
// Don't follow HREFs (as this would cause a page refresh)
if (!args.Request.Uri.Equals ("file:"))
args.RetVal = 1;
};
ScrolledWindow.Add (WebView);
@ -142,6 +158,12 @@ namespace SparkleShare {
return (item == "---");
};
if (this.selected_log != null &&
!SparkleShare.Controller.Folders.Contains (this.selected_log)) {
this.selected_log = null;
}
this.combo_box.Changed += delegate {
TreeIter iter;
this.combo_box.GetActiveIter (out iter);

View file

@ -0,0 +1,119 @@
// SparkleShare, a collaboration and sharing tool.
// Copyright (C) 2010 Hylke Bons <hylkebons@gmail.com>
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Threading;
using SparkleLib;
namespace SparkleShare {
public class SparkleEventLogController {
public event UpdateContentEventEventHandler UpdateContentEvent;
public delegate void UpdateContentEventEventHandler (string html);
public event UpdateChooserEventHandler UpdateChooserEvent;
public delegate void UpdateChooserEventHandler (string [] folders);
public event ContentLoadingEventHandler ContentLoadingEvent;
public delegate void ContentLoadingEventHandler ();
public string SelectedFolder {
get {
return this.selected_folder;
}
set {
this.selected_folder = value;
if (ContentLoadingEvent != null)
ContentLoadingEvent ();
Stopwatch watch = new Stopwatch ();
watch.Start ();
Thread thread = new Thread (new ThreadStart (delegate {
string html = HTML;
watch.Stop ();
// A short delay is less annoying than
// a flashing window
if (watch.ElapsedMilliseconds < 500)
Thread.Sleep (500 - (int) watch.ElapsedMilliseconds);
if (UpdateContentEvent != null)
UpdateContentEvent (html);
}));
thread.Start ();
}
}
public string HTML {
get {
List<SparkleChangeSet> change_sets = SparkleShare.Controller.GetLog (this.selected_folder);
return SparkleShare.Controller.GetHTMLLog (change_sets);
}
}
public string [] Folders {
get {
return SparkleShare.Controller.Folders.ToArray ();
}
}
private string selected_folder;
public SparkleEventLogController ()
{
SparkleShare.Controller.AvatarFetched += delegate {
if (UpdateContentEvent != null)
UpdateContentEvent (HTML);
};
SparkleShare.Controller.OnIdle += delegate {
if (UpdateContentEvent != null)
UpdateContentEvent (HTML);
};
SparkleShare.Controller.FolderListChanged += delegate {
if (this.selected_folder != null &&
!SparkleShare.Controller.Folders.Contains (this.selected_folder)) {
this.selected_folder = null;
}
if (UpdateChooserEvent != null)
UpdateChooserEvent (Folders);
if (UpdateContentEvent != null)
UpdateContentEvent (HTML);
};
SparkleShare.Controller.NotificationRaised += delegate {
if (UpdateContentEvent != null)
UpdateContentEvent (HTML);
};
}
}
}

View file

@ -1,50 +0,0 @@
// SparkleShare, a collaboration and sharing tool.
// Copyright (C) 2010 Hylke Bons <hylkebons@gmail.com>
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
using Gtk;
namespace SparkleShare {
// An infobar
public class SparkleInfobar : EventBox {
public SparkleInfobar (string icon_name, string title, string text)
{
Window window = new Window (WindowType.Popup) {
Name = "gtk-tooltip"
};
window.EnsureStyle ();
Style = window.Style;
Label label = new Label () {
Markup = "<b>" + title + "</b>\n" + text
};
HBox hbox = new HBox (false, 12) {
BorderWidth = 12
};
hbox.PackStart (new Image (SparkleUIHelpers.GetIcon (icon_name, 24)),
false, false, 0);
hbox.PackStart (label, false, false, 0);
Add (hbox);
}
}
}

View file

@ -1,667 +0,0 @@
// SparkleShare, a collaboration and sharing tool.
// Copyright (C) 2010 Hylke Bons <hylkebons@gmail.com>
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General private License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General private License for more details.
//
// You should have received a copy of the GNU General private License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
using System;
using System.Diagnostics;
using System.IO;
using System.Text.RegularExpressions;
using System.Timers;
using Gtk;
using Notifications;
namespace SparkleShare {
public class SparkleIntro : SparkleWindow {
private Entry NameEntry;
private Entry EmailEntry;
private SparkleEntry ServerEntry;
private SparkleEntry FolderEntry;
private Button NextButton;
private Button SyncButton;
private bool ServerFormOnly;
private string SecondaryTextColor;
private ProgressBar progress_bar = new ProgressBar () { PulseStep = 0.01 };
private Timer progress_bar_pulse_timer = new Timer () { Interval = 25, Enabled = true };
// Short alias for the translations
public static string _ (string s)
{
return s;
}
public SparkleIntro () : base ()
{
ServerFormOnly = false;
SecondaryTextColor = SparkleUIHelpers.GdkColorToHex (Style.Foreground (StateType.Insensitive));
}
public void ShowAccountForm ()
{
Reset ();
VBox layout_vertical = new VBox (false, 0);
Deletable = false;
Label header = new Label ("<span size='large'><b>" +
_("Welcome to SparkleShare!") +
"</b></span>") {
UseMarkup = true,
Xalign = 0
};
Label information = new Label (_("Before we can create a SparkleShare folder on this " +
"computer, we need a few bits of information from you.")) {
Xalign = 0,
Wrap = true
};
Table table = new Table (4, 2, true) {
RowSpacing = 6
};
Label name_label = new Label ("<b>" + _("Full Name:") + "</b>") {
UseMarkup = true,
Xalign = 0
};
NameEntry = new Entry (SparkleShare.Controller.UserName);
NameEntry.Changed += delegate {
CheckAccountForm ();
};
EmailEntry = new Entry ();
EmailEntry.Changed += delegate {
CheckAccountForm ();
};
Label email_label = new Label ("<b>" + _("Email:") + "</b>") {
UseMarkup = true,
Xalign = 0
};
table.Attach (name_label, 0, 1, 0, 1);
table.Attach (NameEntry, 1, 2, 0, 1);
table.Attach (email_label, 0, 1, 1, 2);
table.Attach (EmailEntry, 1, 2, 1, 2);
NextButton = new Button (_("Next")) {
Sensitive = false
};
NextButton.Clicked += delegate (object o, EventArgs args) {
NextButton.Remove (NextButton.Child);
NextButton.Add (new Label (_("Configuring…")));
NextButton.Sensitive = false;
table.Sensitive = false;
NextButton.ShowAll ();
SparkleShare.Controller.UserName = NameEntry.Text;
SparkleShare.Controller.UserEmail = EmailEntry.Text;
SparkleShare.Controller.GenerateKeyPair ();
SparkleShare.Controller.AddKey ();
SparkleUI.StatusIcon.CreateMenu ();
Deletable = true;
ShowServerForm ();
};
AddButton (NextButton);
layout_vertical.PackStart (header, false, false, 0);
layout_vertical.PackStart (information, false, false, 21);
layout_vertical.PackStart (new Label (""), false, false, 0);
layout_vertical.PackStart (table, false, false, 0);
Add (layout_vertical);
CheckAccountForm ();
ShowAll ();
}
public void ShowServerForm (bool server_form_only)
{
ServerFormOnly = server_form_only;
ShowServerForm ();
}
public void ShowServerForm ()
{
Reset ();
VBox layout_vertical = new VBox (false, 0);
Label header = new Label ("<span size='large'><b>" +
_("Where is your remote folder?") +
"</b></span>") {
UseMarkup = true,
Xalign = 0
};
Table table = new Table (7, 2, false) {
RowSpacing = 12
};
HBox layout_server = new HBox (true, 0);
ServerEntry = new SparkleEntry () {
ExampleText = _("address-to-server.com")
};
ServerEntry.Changed += CheckServerForm;
RadioButton radio_button = new RadioButton ("<b>" + _("On my own server:") + "</b>");
layout_server.Add (radio_button);
layout_server.Add (ServerEntry);
string github_text = "<b>" + "Github" + "</b>\n" +
"<span fgcolor='" + SecondaryTextColor + "' size='small'>" +
_("Free hosting for Free and Open Source Software projects.") + "\n" +
_("Also has paid accounts for extra private space and bandwidth.") +
"</span>";
RadioButton radio_button_github = new RadioButton (radio_button, github_text);
(radio_button_github.Child as Label).UseMarkup = true;
(radio_button_github.Child as Label).Wrap = true;
string gnome_text = "<b>" + _("The GNOME Project") + "</b>\n" +
"<span fgcolor='" + SecondaryTextColor + "' size='small'>" +
_("GNOME is an easy to understand interface to your computer.") + "\n" +
_("Select this option if youre a developer or designer working on GNOME.") +
"</span>";
RadioButton radio_button_gnome = new RadioButton (radio_button, gnome_text);
(radio_button_gnome.Child as Label).UseMarkup = true;
(radio_button_gnome.Child as Label).Wrap = true;
string gitorious_text = "<b>" + _("Gitorious") + "</b>\n" +
"<span fgcolor='" + SecondaryTextColor + "' size='small'>" +
_("Completely Free as in Freedom infrastructure.") + "\n" +
_("Free accounts for Free and Open Source projects.") +
"</span>";
RadioButton radio_button_gitorious = new RadioButton (radio_button, gitorious_text) {
Xalign = 0
};
(radio_button_gitorious.Child as Label).UseMarkup = true;
(radio_button_gitorious.Child as Label).Wrap = true;
radio_button_github.Toggled += delegate {
if (radio_button_github.Active)
FolderEntry.ExampleText = _("Username/Folder");
};
radio_button_gitorious.Toggled += delegate {
if (radio_button_gitorious.Active)
FolderEntry.ExampleText = _("Project/Folder");
};
radio_button_gnome.Toggled += delegate {
if (radio_button_gnome.Active)
FolderEntry.ExampleText = _("Project");
};
radio_button.Toggled += delegate {
if (radio_button.Active) {
FolderEntry.ExampleText = _("Folder");
ServerEntry.Sensitive = true;
CheckServerForm ();
} else {
ServerEntry.Sensitive = false;
CheckServerForm ();
}
ShowAll ();
};
table.Attach (layout_server, 0, 2, 1, 2);
table.Attach (radio_button_github, 0, 2, 2, 3);
table.Attach (radio_button_gitorious, 0, 2, 3, 4);
table.Attach (radio_button_gnome, 0, 2, 4, 5);
HBox layout_folder = new HBox (true, 0);
FolderEntry = new SparkleEntry () {
ExampleText = _("Folder")
};
FolderEntry.Changed += CheckServerForm;
Label folder_label = new Label (_("Folder Name:")) {
UseMarkup = true,
Xalign = 1
};
(radio_button.Child as Label).UseMarkup = true;
layout_folder.PackStart (folder_label, true, true, 12);
layout_folder.PackStart (FolderEntry, true, true, 0);
SyncButton = new Button (_("Sync"));
SyncButton.Clicked += delegate {
string folder_name = FolderEntry.Text;
string server = ServerEntry.Text;
string canonical_name = System.IO.Path.GetFileNameWithoutExtension (folder_name);
if (radio_button_gitorious.Active)
server = "gitorious.org";
if (radio_button_github.Active)
server = "github.com";
if (radio_button_gnome.Active)
server = "gnome.org";
Application.Invoke (delegate {
Deletable = false;
ShowSyncingPage (canonical_name);
});
SparkleShare.Controller.FolderFetched += delegate {
Application.Invoke (delegate {
this.progress_bar_pulse_timer.Stop ();
Deletable = true;
UrgencyHint = true;
ShowSuccessPage (canonical_name);
});
};
SparkleShare.Controller.FolderFetchError += delegate {
Application.Invoke (delegate {
this.progress_bar_pulse_timer.Stop ();
Deletable = true;
ShowErrorPage ();
});
};
SparkleShare.Controller.FetchFolder (server, folder_name);
};
if (ServerFormOnly) {
Button cancel_button = new Button (_("Cancel"));
cancel_button.Clicked += delegate {
Close ();
};
AddButton (cancel_button);
} else {
Button skip_button = new Button (_("Skip"));
skip_button.Clicked += delegate {
ShowCompletedPage ();
};
AddButton (skip_button);
}
AddButton (SyncButton);
layout_vertical.PackStart (header, false, false, 0);
layout_vertical.PackStart (new Label (""), false, false, 3);
layout_vertical.PackStart (table, false, false, 0);
layout_vertical.PackStart (layout_folder, false, false, 6);
Add (layout_vertical);
CheckServerForm ();
ShowAll ();
}
public void ShowInvitationPage (string server, string folder, string token)
{
VBox layout_vertical = new VBox (false, 0);
Label header = new Label ("<span size='large'><b>" +
_("Invitation received!") +
"</b></span>") {
UseMarkup = true,
Xalign = 0
};
Label information = new Label (_("You've received an invitation to join a shared folder.\n" +
"We're ready to hook you up immediately if you wish.")) {
Xalign = 0,
Wrap = true
};
Label question = new Label (_("Do you accept this invitation?")) {
Xalign = 0,
Wrap = true
};
Table table = new Table (2, 2, false) {
RowSpacing = 6
};
Label server_label = new Label (_("Server Address:")) {
Xalign = 0
};
Label server_text = new Label ("<b>" + server + "</b>") {
UseMarkup = true,
Xalign = 0
};
Label folder_label = new Label (_("Folder Name:")) {
Xalign = 0
};
Label folder_text = new Label ("<b>" + folder + "</b>") {
UseMarkup = true,
Xalign = 0
};
table.Attach (folder_label, 0, 1, 0, 1);
table.Attach (folder_text, 1, 2, 0, 1);
table.Attach (server_label, 0, 1, 1, 2);
table.Attach (server_text, 1, 2, 1, 2);
Button reject_button = new Button (_("Reject"));
Button accept_button = new Button (_("Accept and Sync"));
reject_button.Clicked += delegate {
Close ();
};
accept_button.Clicked += delegate {
string url = "ssh://git@" + server + "/" + folder;
SparkleShare.Controller.FolderFetched += delegate {
Application.Invoke (delegate {
this.progress_bar_pulse_timer.Stop ();
ShowSuccessPage (folder);
});
};
SparkleShare.Controller.FolderFetchError += delegate {
Application.Invoke (delegate {
this.progress_bar_pulse_timer.Stop ();
ShowErrorPage ();
});
};
SparkleShare.Controller.FetchFolder (url, folder);
};
AddButton (reject_button);
AddButton (accept_button);
layout_vertical.PackStart (header, false, false, 0);
layout_vertical.PackStart (information, false, false, 21);
layout_vertical.PackStart (new Label (""), false, false, 0);
layout_vertical.PackStart (table, false, false, 0);
layout_vertical.PackStart (new Label (""), false, false, 0);
layout_vertical.PackStart (question, false, false, 21);
Add (layout_vertical);
ShowAll ();
}
// The page shown when syncing has failed
private void ShowErrorPage ()
{
Reset ();
VBox layout_vertical = new VBox (false, 0);
Label header = new Label ("<span size='large'><b>" +
_("Something went wrong…") +
"</b></span>\n") {
UseMarkup = true,
Xalign = 0
};
Button try_again_button = new Button (_("Try Again")) {
Sensitive = true
};
try_again_button.Clicked += delegate (object o, EventArgs args) {
ShowServerForm ();
};
AddButton (try_again_button);
layout_vertical.PackStart (header, false, false, 0);
Add (layout_vertical);
ShowAll ();
}
// The page shown when syncing has succeeded
private void ShowSuccessPage (string folder_name)
{
Reset ();
UrgencyHint = true;
if (!HasToplevelFocus) {
string title = String.Format (_("{0} has been successfully added"), folder_name);
string subtext = _("");
new SparkleBubble (title, subtext).Show ();
}
VBox layout_vertical = new VBox (false, 0);
Label header = new Label ("<span size='large'><b>" +
_("Folder synced successfully!") +
"</b></span>") {
UseMarkup = true,
Xalign = 0
};
Label information = new Label (
String.Format (_("Now you can access the synced files from {0} in your SparkleShare folder."),
folder_name)) {
Xalign = 0,
Wrap = true,
UseMarkup = true
};
// A button that opens the synced folder
Button open_folder_button = new Button (_("Open Folder"));
open_folder_button.Clicked += delegate {
SparkleShare.Controller.OpenSparkleShareFolder (folder_name);
};
Button finish_button = new Button (_("Finish"));
finish_button.Clicked += delegate (object o, EventArgs args) {
Close ();
};
AddButton (open_folder_button);
AddButton (finish_button);
layout_vertical.PackStart (header, false, false, 0);
layout_vertical.PackStart (information, false, false, 21);
Add (layout_vertical);
ShowAll ();
}
// The page shown whilst syncing
private void ShowSyncingPage (string name)
{
Reset ();
VBox layout_vertical = new VBox (false, 0);
Label header = new Label ("<span size='large'><b>" +
String.Format (_("Syncing folder {0}’…"), name) +
"</b></span>") {
UseMarkup = true,
Xalign = 0,
Wrap = true
};
Label information = new Label (_("This may take a while.\n") +
_("Are you sure its not coffee o'clock?")) {
UseMarkup = true,
Xalign = 0
};
Button button = new Button () {
Sensitive = false,
Label = _("Finish")
};
button.Clicked += delegate {
Close ();
};
AddButton (button);
layout_vertical.PackStart (header, false, false, 0);
layout_vertical.PackStart (information, false, false, 21);
this.progress_bar_pulse_timer.Elapsed += delegate {
Application.Invoke (delegate {
progress_bar.Pulse ();
});
};
if (this.progress_bar.Parent != null)
layout_vertical.Reparent(this.progress_bar);
layout_vertical.PackStart (this.progress_bar, false, false, 54);
Add (layout_vertical);
ShowAll ();
}
// The page shown when the setup has been completed
private void ShowCompletedPage ()
{
Reset ();
VBox layout_vertical = new VBox (false, 0);
Label header = new Label ("<span size='large'><b>" +
_("SparkleShare is ready to go!") +
"</b></span>") {
UseMarkup = true,
Xalign = 0
};
Label information = new Label (_("Now you can start accepting invitations from others. " + "\n" +
"Just click on invitations you get by email and " +
"we will take care of the rest.")) {
UseMarkup = true,
Wrap = true,
Xalign = 0
};
HBox link_wrapper = new HBox (false, 0);
LinkButton link = new LinkButton ("http://www.sparkleshare.org/",
_("Learn how to host your own SparkleServer"));
link_wrapper.PackStart (link, false, false, 0);
layout_vertical.PackStart (header, false, false, 0);
layout_vertical.PackStart (information, false, false, 21);
layout_vertical.PackStart (link_wrapper, false, false, 0);
Button finish_button = new Button (_("Finish"));
finish_button.Clicked += delegate (object o, EventArgs args) {
Close ();
};
AddButton (finish_button);
Add (layout_vertical);
ShowAll ();
}
// Enables or disables the 'Next' button depending on the
// entries filled in by the user
private void CheckAccountForm ()
{
if (NameEntry.Text.Length > 0 &&
IsValidEmail (EmailEntry.Text)) {
NextButton.Sensitive = true;
} else {
NextButton.Sensitive = false;
}
}
// Enables the Add button when the fields are
// filled in correctly
public void CheckServerForm (object o, EventArgs args)
{
CheckServerForm ();
}
// Enables the Add button when the fields are
// filled in correctly
public void CheckServerForm ()
{
SyncButton.Sensitive = false;
if (FolderEntry.ExampleTextActive ||
(ServerEntry.Sensitive && ServerEntry.ExampleTextActive))
return;
bool IsFolder = !FolderEntry.Text.Trim ().Equals ("");
bool IsServer = !ServerEntry.Text.Trim ().Equals ("");
if (ServerEntry.Sensitive == true) {
if (IsServer && IsFolder)
SyncButton.Sensitive = true;
} else if (IsFolder) {
SyncButton.Sensitive = true;
}
}
// Checks to see if an email address is valid
private bool IsValidEmail (string email)
{
Regex regex = new Regex (@"^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$", RegexOptions.IgnoreCase);
return regex.IsMatch (email);
}
}
}

View file

@ -1,5 +0,0 @@

View file

@ -166,8 +166,13 @@ namespace SparkleShare {
get {
string path = SparkleHelpers.CombineMore (Defines.PREFIX,
"share", "sparkleshare", "html", "event-log.html");
string html = String.Join (Environment.NewLine, File.ReadAllLines (path));
html = html.Replace ("<!-- $jquery-url -->", "file://" +
SparkleHelpers.CombineMore (Defines.PREFIX, "share", "sparkleshare", "html", "jquery.js"));
return String.Join (Environment.NewLine, File.ReadAllLines (path));
return html;
}
}

View file

@ -0,0 +1,432 @@
// SparkleShare, a collaboration and sharing tool.
// Copyright (C) 2010 Hylke Bons <hylkebons@gmail.com>
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General private License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General private License for more details.
//
// You should have received a copy of the GNU General private License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
using System;
using System.Diagnostics;
using System.IO;
using System.Text.RegularExpressions;
using System.Timers;
using System.Collections.Generic;
using Gtk;
using Mono.Unix;
namespace SparkleShare {
public class SparkleSetup : SparkleSetupWindow {
public SparkleSetupController Controller = new SparkleSetupController ();
private string SecondaryTextColor;
private Entry NameEntry;
private Entry EmailEntry;
private SparkleEntry ServerEntry;
private SparkleEntry FolderEntry;
private Button NextButton;
private Button SyncButton;
private Table Table;
private ProgressBar progress_bar = new ProgressBar () { PulseStep = 0.01 };
private Timer progress_bar_pulse_timer = new Timer () { Interval = 25, Enabled = true };
// Short alias for the translations
public static string _ (string s)
{
return Catalog.GetString (s);
}
public SparkleSetup () : base ()
{
SecondaryTextColor = SparkleUIHelpers.GdkColorToHex (Style.Foreground (StateType.Insensitive));
Controller.ChangePageEvent += delegate (PageType type) {
Application.Invoke (delegate {
Reset ();
switch (type) {
case PageType.Setup:
Header = _("Welcome to SparkleShare!");
Description = _("Before we can create a SparkleShare folder on this " +
"computer, we need a few bits of information from you.");
Table = new Table (4, 2, true) {
RowSpacing = 6
};
Label name_label = new Label ("<b>" + _("Full Name:") + "</b>") {
UseMarkup = true,
Xalign = 0
};
NameEntry = new Entry (SparkleShare.Controller.UserName);
NameEntry.Changed += delegate {
CheckSetupPage ();
};
EmailEntry = new Entry ();
EmailEntry.Changed += delegate {
CheckSetupPage ();
};
Label email_label = new Label ("<b>" + _("Email:") + "</b>") {
UseMarkup = true,
Xalign = 0
};
Table.Attach (name_label, 0, 1, 0, 1);
Table.Attach (NameEntry, 1, 2, 0, 1);
Table.Attach (email_label, 0, 1, 1, 2);
Table.Attach (EmailEntry, 1, 2, 1, 2);
NextButton = new Button (_("Next")) {
Sensitive = false
};
NextButton.Clicked += delegate (object o, EventArgs args) {
string full_name = NameEntry.Text;
string email = EmailEntry.Text;
Controller.SetupPageCompleted (full_name, email);
};
AddButton (NextButton);
Add (Table);
CheckSetupPage ();
break;
case PageType.Add:
Header = _("Where is your remote folder?");
Table = new Table (6, 2, false) {
RowSpacing = 12
};
HBox layout_server = new HBox (true, 0);
// Own server radiobutton
RadioButton radio_button = new RadioButton ("<b>" + _("On my own server:") + "</b>");
(radio_button.Child as Label).UseMarkup = true;
radio_button.Toggled += delegate {
if (radio_button.Active) {
FolderEntry.ExampleText = _("Folder");
ServerEntry.Sensitive = true;
CheckAddPage ();
} else {
ServerEntry.Sensitive = false;
CheckAddPage ();
}
ShowAll ();
};
// Own server entry
ServerEntry = new SparkleEntry () { };
ServerEntry.Completion = new EntryCompletion();
ListStore server_store = new ListStore (typeof (string));
//TODO foreach (string host in SparkleShare.Controller.PreviousHosts)
// server_store.AppendValues (host);
ServerEntry.Completion.Model = server_store;
ServerEntry.Completion.TextColumn = 0;
if (!string.IsNullOrEmpty (Controller.PreviousServer)) {
ServerEntry.Text = Controller.PreviousServer;
ServerEntry.ExampleTextActive = false;
} else {
ServerEntry.ExampleText = _("address-to-server.com");
}
ServerEntry.Changed += delegate {
CheckAddPage ();
};
layout_server.Add (radio_button);
layout_server.Add (ServerEntry);
Table.Attach (layout_server, 0, 2, 1, 2);
// Github radiobutton
string github_text = "<b>" + "Github" + "</b>\n" +
"<span fgcolor='" + SecondaryTextColor + "' size='small'>" +
_("Free hosting for Free and Open Source Software projects.") + "\n" +
_("Also has paid accounts for extra private space and bandwidth.") +
"</span>";
RadioButton radio_button_github = new RadioButton (radio_button, github_text);
(radio_button_github.Child as Label).UseMarkup = true;
(radio_button_github.Child as Label).Wrap = true;
radio_button_github.Toggled += delegate {
if (radio_button_github.Active)
FolderEntry.ExampleText = _("Username/Folder");
};
// Gitorious radiobutton
string gitorious_text = "<b>" + _("Gitorious") + "</b>\n" +
"<span fgcolor='" + SecondaryTextColor + "' size='small'>" +
_("Completely Free as in Freedom infrastructure.") + "\n" +
_("Free accounts for Free and Open Source projects.") +
"</span>";
RadioButton radio_button_gitorious = new RadioButton (radio_button, gitorious_text);
(radio_button_gitorious.Child as Label).UseMarkup = true;
(radio_button_gitorious.Child as Label).Wrap = true;
radio_button_gitorious.Toggled += delegate {
if (radio_button_gitorious.Active)
FolderEntry.ExampleText = _("Project/Folder");
};
// GNOME radiobutton
string gnome_text = "<b>" + _("The GNOME Project") + "</b>\n"+
"<span fgcolor='" + SecondaryTextColor + "' size='small'>" +
_("GNOME is an easy to understand interface to your computer.") + "\n" +
_("Select this option if youre a developer or designer working on GNOME.") +
"</span>";
RadioButton radio_button_gnome = new RadioButton (radio_button, gnome_text);
(radio_button_gnome.Child as Label).UseMarkup = true;
(radio_button_gnome.Child as Label).Wrap = true;
radio_button_gnome.Toggled += delegate {
if (radio_button_gnome.Active)
FolderEntry.ExampleText = _("Project");
};
Table.Attach (radio_button_github, 0, 2, 2, 3);
Table.Attach (radio_button_gitorious, 0, 2, 3, 4);
Table.Attach (radio_button_gnome, 0, 2, 4, 5);
// Folder label and entry
HBox layout_folder = new HBox (true, 0);
Label folder_label = new Label (_("Folder Name:")) {
UseMarkup = true,
Xalign = 1
};
FolderEntry = new SparkleEntry ();
FolderEntry.ExampleText = _("Folder");
FolderEntry.Changed += delegate {
CheckAddPage ();
};
layout_folder.PackStart (folder_label, true, true, 12);
layout_folder.PackStart (FolderEntry, true, true, 0);
Table.Attach (layout_folder, 0, 2, 5, 6);
Add (Table);
// Cancel button
Button cancel_button = new Button (_("Cancel"));
cancel_button.Clicked += delegate {
Close ();
};
// Sync button
SyncButton = new Button (_("Sync"));
SyncButton.Clicked += delegate {
string server = ServerEntry.Text;
string folder_name = FolderEntry.Text;
if (radio_button_gitorious.Active)
server = "gitorious.org";
if (radio_button_github.Active)
server = "github.com";
if (radio_button_gnome.Active)
server = "gnome.org";
Controller.AddPageCompleted (server, folder_name);
};
AddButton (cancel_button);
AddButton (SyncButton);
CheckAddPage ();
break;
case PageType.Syncing:
Header = String.Format (_("Syncing folder {0}’…"), Controller.SyncingFolder);
Description = _("This may take a while." + Environment.NewLine) +
_("Are you sure its not coffee o'clock?");
Button button = new Button () {
Sensitive = false,
Label = _("Finish")
};
button.Clicked += delegate {
Close ();
};
AddButton (button);
this.progress_bar_pulse_timer.Elapsed += delegate {
Application.Invoke (delegate {
progress_bar.Pulse ();
});
};
if (this.progress_bar.Parent != null)
(this.progress_bar.Parent as Container).Remove (this.progress_bar);
VBox bar_wrapper = new VBox (false , 0);
bar_wrapper.PackStart (this.progress_bar, false, false, 0);
Add (bar_wrapper);
break;
case PageType.Error:
string n = Environment.NewLine;
Header = _("Something went wrong") + "…";
Description = "We don't know exactly what the problem is, " +
"but we can try to help you pinpoint it.";
Label l = new Label (
"First, have you tried turning it off and on again?" + n +
n +
Controller.SyncingFolder +" is the address we've compiled from the information " +
"you entered. Does this look correct?" + n +
n +
"The host needs to know who you are. Have you uploaded the key that sits in your SparkleShare folder?");
l.Xpad = 12;
l.Wrap = true;
Button try_again_button = new Button (_("Try Again")) {
Sensitive = true
};
try_again_button.Clicked += delegate {
Controller.ErrorPageCompleted ();
};
AddButton (try_again_button);
Add (l);
break;
case PageType.Finished:
UrgencyHint = true;
if (!HasToplevelFocus) {
string title = String.Format (_("{0} has been successfully added"), Controller.SyncingFolder);
string subtext = _("");
//TODO new SparkleBubble (title, subtext).Show ();
}
Header = _("Folder synced successfully!");
Description = _("Access the synced files from your SparkleShare folder.");
// A button that opens the synced folder
Button open_folder_button = new Button (_("Open Folder"));
open_folder_button.Clicked += delegate {
SparkleShare.Controller.OpenSparkleShareFolder (Controller.SyncingFolder);
};
Button finish_button = new Button (_("Finish"));
finish_button.Clicked += delegate {
Close ();
};
Add (null);
AddButton (open_folder_button);
AddButton (finish_button);
break;
}
ShowAll ();
});
};
}
// Enables or disables the 'Next' button depending on the
// entries filled in by the user
private void CheckSetupPage ()
{
if (NameEntry.Text.Length > 0 &&
SparkleShare.Controller.IsValidEmail (EmailEntry.Text)) {
NextButton.Sensitive = true;
} else {
NextButton.Sensitive = false;
}
}
// Enables or disables the 'Next' button depending on the
// entries filled in by the user
public void CheckAddPage ()
{
SyncButton.Sensitive = false;
if (FolderEntry.ExampleTextActive ||
(ServerEntry.Sensitive && ServerEntry.ExampleTextActive))
return;
bool IsFolder = !FolderEntry.Text.Trim ().Equals ("");
bool IsServer = !ServerEntry.Text.Trim ().Equals ("");
if (ServerEntry.Sensitive == true) {
if (IsServer && IsFolder)
SyncButton.Sensitive = true;
} else if (IsFolder) {
SyncButton.Sensitive = true;
}
}
}
}

View file

@ -0,0 +1,142 @@
// SparkleShare, a collaboration and sharing tool.
// Copyright (C) 2010 Hylke Bons <hylkebons@gmail.com>
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
using System;
using System.IO;
namespace SparkleShare {
public enum PageType {
Setup,
Add,
Syncing,
Error,
Finished
}
public class SparkleSetupController {
public event ChangePageEventHandler ChangePageEvent;
public delegate void ChangePageEventHandler (PageType page);
public string PreviousServer {
get {
return this.previous_server;
}
}
public string PreviousFolder {
get {
return this.previous_folder;
}
}
public string SyncingFolder {
get {
return this.syncing_folder;
}
}
public PageType PreviousPage {
get {
return this.previous_page;
}
}
private string previous_server = "";
private string previous_folder = "";
private string syncing_folder = "";
private PageType previous_page;
public SparkleSetupController ()
{
ChangePageEvent += delegate (PageType page) {
this.previous_page = page;
};
}
public void ShowAddPage ()
{
if (ChangePageEvent != null)
ChangePageEvent (PageType.Add);
}
public void ShowSetupPage ()
{
if (ChangePageEvent != null)
ChangePageEvent (PageType.Setup);
}
public void SetupPageCompleted (string full_name, string email)
{
SparkleShare.Controller.UserName = full_name;
SparkleShare.Controller.UserEmail = email;
SparkleShare.Controller.GenerateKeyPair ();
SparkleShare.Controller.UpdateState ();
if (ChangePageEvent != null)
ChangePageEvent (PageType.Add);
}
public void AddPageCompleted (string server, string folder_name)
{
this.syncing_folder = Path.GetFileNameWithoutExtension (folder_name);
this.previous_server = server;
this.previous_folder = folder_name;
if (ChangePageEvent != null)
ChangePageEvent (PageType.Syncing);
SparkleShare.Controller.FolderFetched += delegate {
if (ChangePageEvent != null)
ChangePageEvent (PageType.Finished);
this.syncing_folder = "";
};
SparkleShare.Controller.FolderFetchError += delegate {
if (ChangePageEvent != null)
ChangePageEvent (PageType.Error);
this.syncing_folder = "";
};
SparkleShare.Controller.FetchFolder (server, this.syncing_folder);
}
public void ErrorPageCompleted ()
{
if (ChangePageEvent != null)
ChangePageEvent (PageType.Add);
}
public void FinishedPageCompleted ()
{
this.previous_server = "";
this.previous_folder = "";
SparkleShare.Controller.UpdateState ();
}
}
}

View file

@ -27,21 +27,26 @@ using SparkleLib;
namespace SparkleShare {
public class SparkleWindow : Window {
public class SparkleSetupWindow : Window {
private HBox HBox;
private VBox VBox;
private VBox Wrapper;
private HButtonBox Buttons;
public string Header;
public string Description;
public SparkleWindow () : base ("")
public Container Content;
public SparkleSetupWindow () : base ("")
{
Title = "SparkleShare Setup";
BorderWidth = 0;
IconName = "folder-sparkleshare";
Resizable = false;
WindowPosition = WindowPosition.Center;
Deletable = false;
SetSizeRequest (680, 440);
@ -103,13 +108,35 @@ namespace SparkleShare {
new public void Add (Widget widget)
{
Wrapper.PackStart (widget, true, true, 0);
Label header = new Label ("<span size='large'><b>" + Header + "</b></span>") {
UseMarkup = true,
Xalign = 0
};
Label description = new Label (Description) {
Xalign = 0,
Wrap = true
};
VBox layout_vertical = new VBox (false, 0);
layout_vertical.PackStart (header, false, false, 0);
if (!string.IsNullOrEmpty (Description))
layout_vertical.PackStart (description, false, false, 21);
if (widget != null)
layout_vertical.PackStart (widget, true, true, 21);
Wrapper.PackStart (layout_vertical, true, true, 0);
ShowAll ();
}
public void Reset ()
{
Header = "";
Description = "";
if (Wrapper.Children.Length > 0)
Wrapper.Remove (Wrapper.Children [0]);
@ -121,7 +148,9 @@ namespace SparkleShare {
new public void ShowAll ()
{
Present ();
Present ();
base.ShowAll ();
}

View file

@ -43,11 +43,6 @@ namespace SparkleShare {
public static void Main (string [] args)
{
// Use translations
if ((SparkleBackend.Platform == PlatformID.Unix ||
SparkleBackend.Platform == PlatformID.MacOSX))
Mono.Unix.Catalog.Init (Defines.GETTEXT_PACKAGE, Defines.LOCALE_DIR);
// Don't allow running as root on Linux or Mac
if ((SparkleBackend.Platform == PlatformID.Unix ||
SparkleBackend.Platform == PlatformID.MacOSX) &&
@ -59,17 +54,14 @@ namespace SparkleShare {
}
// Parse the command line options
bool hide_ui = false;
bool show_help = false;
var p = new OptionSet () {
{ "d|disable-gui", _("Don't show the notification icon"), v => hide_ui = v != null },
bool show_help = false;
OptionSet option_set = new OptionSet () {
{ "v|version", _("Print version information"), v => { PrintVersion (); } },
{ "h|help", _("Show this help text"), v => show_help = v != null }
};
try {
p.Parse (args);
option_set.Parse (args);
} catch (OptionException e) {
Console.Write ("SparkleShare: ");
@ -78,7 +70,7 @@ namespace SparkleShare {
}
if (show_help)
ShowHelp (p);
ShowHelp (option_set);
// Load the right controller for the OS
string controller_name = "Lin";
@ -101,7 +93,7 @@ namespace SparkleShare {
Controller.Initialize ();
if (Controller != null && !hide_ui) {
if (Controller != null) {
UI = new SparkleUI ();
UI.Run ();
}

View file

@ -37,22 +37,6 @@
<Reference Include="System" />
<Reference Include="Mono.Posix" />
</ItemGroup>
<ItemGroup>
<Compile Include="SparkleBubble.cs" />
<Compile Include="SparkleIntro.cs" />
<Compile Include="SparkleShare.cs" />
<Compile Include="SparkleSpinner.cs" />
<Compile Include="SparkleStatusIcon.cs" />
<Compile Include="SparkleUI.cs" />
<Compile Include="SparkleWindow.cs" />
<Compile Include="SparkleEntry.cs" />
<Compile Include="SparkleEventLog.cs" />
<Compile Include="SparkleUIHelpers.cs" />
<Compile Include="SparkleInfobar.cs" />
<Compile Include="SparkleController.cs" />
<Compile Include="SparkleAbout.cs" />
<Compile Include="SparkleLinController.cs" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\SparkleLib\SparkleLib.csproj">
<Project>{2C914413-B31C-4362-93C7-1AE34F09112A}</Project>
@ -74,4 +58,24 @@
</Properties>
</MonoDevelop>
</ProjectExtensions>
<ItemGroup>
<Compile Include="SparkleBubbles.cs" />
<Compile Include="SparkleBubblesController.cs" />
<Compile Include="SparkleController.cs" />
<Compile Include="SparkleEntry.cs" />
<Compile Include="SparkleLinController.cs" />
<Compile Include="SparkleSetup.cs" />
<Compile Include="SparkleSetupController.cs" />
<Compile Include="SparkleSetupWindow.cs" />
<Compile Include="SparkleShare.cs" />
<Compile Include="SparkleSpinner.cs" />
<Compile Include="SparkleStatusIcon.cs" />
<Compile Include="SparkleStatusIconController.cs" />
<Compile Include="SparkleUI.cs" />
<Compile Include="SparkleUIHelpers.cs" />
<Compile Include="SparkleEventLogController.cs" />
<Compile Include="SparkleEventLog.cs" />
<Compile Include="SparkleAboutController.cs" />
<Compile Include="SparkleAbout.cs" />
</ItemGroup>
</Project>

View file

@ -223,16 +223,16 @@ namespace SparkleShare {
sync_item.Activated += delegate {
Application.Invoke (delegate {
if (SparkleUI.Intro == null) {
SparkleUI.Intro = new SparkleIntro ();
SparkleUI.Intro.ShowServerForm (true);
if (SparkleUI.Setup == null) {
SparkleUI.Setup = new SparkleSetup ();
SparkleUI.Setup.Controller.ShowAddPage ();
}
if (!SparkleUI.Intro.Visible)
SparkleUI.Intro.ShowServerForm (true);
if (!SparkleUI.Setup.Visible)
SparkleUI.Setup.Controller.ShowAddPage ();
SparkleUI.Intro.ShowAll ();
SparkleUI.Intro.Present ();
//SparkleUI.Intro.ShowAll ();
//SparkleUI.Intro.Present ();
});
};
@ -275,8 +275,13 @@ namespace SparkleShare {
MenuItem about_item = new MenuItem (_("About SparkleShare"));
about_item.Activated += delegate {
SparkleAbout about = new SparkleAbout ();
about.ShowAll ();
Application.Invoke (delegate {
if (SparkleUI.About == null)
SparkleUI.About = new SparkleAbout ();
SparkleUI.About.ShowAll ();
SparkleUI.About.Present ();
});
};
Menu.Add (about_item);

View file

@ -0,0 +1,86 @@
// SparkleShare, a collaboration and sharing tool.
// Copyright (C) 2010 Hylke Bons <hylkebons@gmail.com>
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
using System;
using System.IO;
namespace SparkleShare {
public enum IconState {
Idle,
Syncing,
Error
}
public class SparkleStatusIconController {
public delegate void UpdateStatusLineEventHandler ();
public event UpdateMenuEventHandler UpdateMenuEvent;
public delegate void UpdateMenuEventHandler (IconState state);
public IconState CurrentState = IconState.Idle;
public string [] Folders {
get {
return SparkleShare.Controller.Folders.ToArray ();
}
}
public string FolderSize {
get {
return SparkleShare.Controller.FolderSize;
}
}
public SparkleStatusIconController ()
{
SparkleShare.Controller.FolderSizeChanged += delegate {
if (UpdateMenuEvent != null)
UpdateMenuEvent (CurrentState);
};
SparkleShare.Controller.FolderListChanged += delegate {
if (UpdateMenuEvent != null)
UpdateMenuEvent (CurrentState);
};
SparkleShare.Controller.OnIdle += delegate {
if (CurrentState != IconState.Error)
CurrentState = IconState.Idle;
if (UpdateMenuEvent != null)
UpdateMenuEvent (CurrentState);
};
SparkleShare.Controller.OnSyncing += delegate {
CurrentState = IconState.Syncing;
if (UpdateMenuEvent != null)
UpdateMenuEvent (IconState.Syncing);
};
SparkleShare.Controller.OnError += delegate {
CurrentState = IconState.Error;
if (UpdateMenuEvent != null)
UpdateMenuEvent (IconState.Error);
};
}
}
}

View file

@ -32,7 +32,8 @@ namespace SparkleShare {
public static SparkleStatusIcon StatusIcon;
public static SparkleEventLog EventLog;
public static SparkleIntro Intro;
public static SparkleSetup Setup;
public static SparkleAbout About;
// Short alias for the translations
@ -72,76 +73,14 @@ namespace SparkleShare {
StatusIcon = new SparkleStatusIcon ();
if (SparkleShare.Controller.FirstRun) {
Intro = new SparkleIntro ();
Intro.ShowAccountForm ();
Setup = new SparkleSetup ();
Setup.Controller.ShowSetupPage ();
}
SparkleShare.Controller.OnQuitWhileSyncing += delegate {
// TODO: Pop up a warning when quitting whilst syncing
};
SparkleShare.Controller.OnInvitation += delegate (string server, string folder, string token) {
Application.Invoke (delegate {
SparkleIntro intro = new SparkleIntro ();
intro.ShowInvitationPage (server, folder, token);
});
};
// Show a bubble when there are new changes
SparkleShare.Controller.NotificationRaised += delegate (string user_name, string user_email,
string message, string repository_path) {
Application.Invoke (delegate {
if (EventLog != null)
EventLog.UpdateEvents ();
if (!SparkleShare.Controller.NotificationsEnabled)
return;
SparkleBubble bubble = new SparkleBubble (user_name, message);
string avatar_file_path = SparkleShare.Controller.GetAvatar (user_email, 32);
if (avatar_file_path != null)
bubble.Icon = new Gdk.Pixbuf (avatar_file_path);
else
bubble.Icon = SparkleUIHelpers.GetIcon ("avatar-default", 32);
bubble.Show ();
});
};
// Show a bubble when there was a conflict
SparkleShare.Controller.ConflictNotificationRaised += delegate {
Application.Invoke (delegate {
string title = _("Ouch! Mid-air collision!");
string subtext = _("Don't worry, SparkleShare made a copy of each conflicting file.");
new SparkleBubble (title, subtext).Show ();
});
};
SparkleShare.Controller.AvatarFetched += delegate {
Application.Invoke (delegate {
if (EventLog != null)
EventLog.UpdateEvents ();
});
};
SparkleShare.Controller.OnIdle += delegate {
Application.Invoke (delegate {
if (EventLog != null)
EventLog.UpdateEvents ();
});
};
SparkleShare.Controller.FolderListChanged += delegate {
Application.Invoke (delegate {
if (EventLog != null) {
EventLog.UpdateChooser ();
EventLog.UpdateEvents ();
}
});
};
}
}
// Runs the application
public void Run ()

View file

@ -156,39 +156,21 @@
</data>
<data name="error" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\..\data\icons\error.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="folder_sparkleshare_16_mist" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\..\data\icons\folder-sparkleshare-16-mist.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="folder_sparkleshare_16" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\..\data\icons\folder-sparkleshare-16.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="folder_sparkleshare_22_mist" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\..\data\icons\folder-sparkleshare-22-mist.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="folder_sparkleshare_22" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\..\data\icons\folder-sparkleshare-22.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="folder_sparkleshare_24_mist" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\..\data\icons\folder-sparkleshare-24-mist.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="folder_sparkleshare_24" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\..\data\icons\folder-sparkleshare-24.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="folder_sparkleshare_256_mist" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\..\data\icons\folder-sparkleshare-256-mist.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="folder_sparkleshare_256" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\..\data\icons\folder-sparkleshare-256.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="folder_sparkleshare_32_mist" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\..\data\icons\folder-sparkleshare-32-mist.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="folder_sparkleshare_32" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\..\data\icons\folder-sparkleshare-32.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="folder_sparkleshare_48_mist" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\..\data\icons\folder-sparkleshare-48-mist.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="folder_sparkleshare_48" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\..\data\icons\folder-sparkleshare-48.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
@ -222,9 +204,6 @@
</data>
<data name="idle4" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\..\data\icons\idle4.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="process_syncing_sparkleshare_24_mist" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\..\data\icons\process-syncing-sparkleshare-24-mist.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="process_syncing_sparkleshare_24" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\..\data\icons\process-syncing-sparkleshare-24.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>

View file

@ -89,17 +89,18 @@
<Compile Include="SparkleBubble.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="..\SparkleIntro.cs" />
<Compile Include="..\SparkleSetup.cs" />
<Compile Include="..\SparkleSetupController.cs" />
<Compile Include="..\SparkleSetupWindow.cs" />
<Compile Include="..\SparkleShare.cs" />
<Compile Include="..\SparkleSpinner.cs" />
<Compile Include="..\SparkleStatusIcon.cs" />
<Compile Include="..\SparkleUI.cs" />
<Compile Include="..\SparkleWindow.cs" />
<Compile Include="..\SparkleEntry.cs" />
<Compile Include="..\SparkleUIHelpers.cs" />
<Compile Include="..\SparkleInfobar.cs" />
<Compile Include="..\SparkleController.cs" />
<Compile Include="..\SparkleAbout.cs" />
<Compile Include="..\SparkleAboutController.cs" />
<Compile Include="SparkleEventLog.cs" />
<Compile Include="SparkleWinController.cs" />
</ItemGroup>
@ -179,4 +180,4 @@
<ItemGroup>
<None Include="Resources\sparkleshare.ico" />
</ItemGroup>
</Project>
</Project>

View file

@ -19,7 +19,11 @@ start() {
fi
echo -n "Starting SparkleShare... "
ssh-agent mono "@expanded_libdir@/@PACKAGE@/SparkleShare.exe" $2 &
if [ -n "${SSH_AGENT_PID}" -o -n "${SSH_AUTH_SOCK}" ] ; then
mono "@expanded_libdir@/@PACKAGE@/SparkleShare.exe" $2 &
else
ssh-agent mono "@expanded_libdir@/@PACKAGE@/SparkleShare.exe" $2 &
fi
( umask 066; echo $! > ${pidfile} )
echo "Done."
}

View file

@ -1,9 +1,9 @@
dnl Process this file with autoconf to produce a configure script.
m4_define([sparkleshare_version],
[0.2.2])
[0.2.4])
m4_define([sparkleshare_asm_version],
[0.2.2])
[0.2.4])
AC_PREREQ([2.54])
AC_INIT([SparkleShare], sparkleshare_version)
@ -38,13 +38,21 @@ AC_PROG_INSTALL
dnl Mono and gmcs
SHAMROCK_CHECK_MONO_MODULE(2.2)
SHAMROCK_FIND_MONO_2_0_COMPILER
SHAMROCK_FIND_MONO_RUNTIME
PKG_CHECK_EXISTS([mono >= 2.8],
[SHAMROCK_FIND_MONO_4_0_COMPILER
SHAMROCK_CHECK_MONO_4_0_GAC_ASSEMBLIES([
System
System.Security
Mono.Posix
])],
[SHAMROCK_FIND_MONO_2_0_COMPILER
SHAMROCK_CHECK_MONO_2_0_GAC_ASSEMBLIES([
System
System.Security
Mono.Posix
])
])])
SPARKLESHARE_CHECK_NOTIFY_SHARP
@ -91,42 +99,64 @@ PKG_CHECK_MODULES([SMARTIRC4NET], [smartirc4net],
)
AM_CONDITIONAL([HAVE_SMARTIRC4NET], test x$SPARKLE_SMARTIRC4NETDIR = x)
dnl check for webkit-sharp
PKG_CHECK_MODULES(WEBKIT_SHARP, webkit-sharp-1.0, have_webkit_sharp=yes, have_webkit_sharp=no)
AC_SUBST(WEBKIT_SHARP_LIBS)
SHAMROCK_CHECK_NUNIT
APPINDICATOR_REQUIRED=0.0.7
AC_ARG_ENABLE(gtkui,
AS_HELP_STRING([--disable-gtkui], [Do not build the Gtk+ user interface]),
[ enable_gtkui=no ], [ enable_gtkui=yes ])
AC_ARG_ENABLE(appindicator,
AS_HELP_STRING([--enable-appindicator[=@<:@no/auto/yes@:>@]],[Build support for application indicators ]),
[enable_appindicator=$enableval],
[enable_appindicator="auto"])
AS_HELP_STRING([--enable-appindicator[=@<:@no/auto/yes@:>@]],[Build support for application indicators ]),
[enable_appindicator=$enableval],
[enable_appindicator="auto"])
if test x$enable_appindicator = xauto ; then
PKG_CHECK_EXISTS([appindicator-sharp-0.1 >= $APPINDICATOR_REQUIRED],
enable_appindicator="yes",
enable_appindicator="no")
AM_CONDITIONAL(ENABLE_GTKUI, test x$enable_gtkui = xyes)
if test "x$enable_gtkui" = "xyes" ; then
dnl check for webkit-sharp
PKG_CHECK_MODULES(WEBKIT_SHARP, webkit-sharp-1.0, have_webkit_sharp=yes, have_webkit_sharp=no)
if test "x$have_webkit_sharp" = "xno" ; then
AC_ERROR("webkit-sharp is a required dependency: you need to install the appropriate devel package before you can compile")
fi
AC_SUBST(WEBKIT_SHARP_LIBS)
dnl check for notify-sharp
PKG_CHECK_MODULES(NOTIFY_SHARP, notify-sharp, have_notify_sharp=yes, have_notify_sharp=no)
if test "x$have_notify_sharp" = "xno" ; then
AC_ERROR("notify-sharp is a required dependency: you need to install the appropriate devel package before you can compile")
fi
AC_SUBST(NOTIFY_SHARP_LIBS)
APPINDICATOR_REQUIRED=0.0.7
if test x$enable_appindicator = xauto ; then
PKG_CHECK_EXISTS([appindicator-sharp-0.1 >= $APPINDICATOR_REQUIRED],
enable_appindicator="yes",
enable_appindicator="no")
fi
if test x$enable_appindicator = xyes ; then
PKG_CHECK_EXISTS([appindicator-sharp-0.1 >= $APPINDICATOR_REQUIRED],,
AC_MSG_ERROR([appindicator-sharp-0.1 is not installed]))
PKG_CHECK_MODULES(APP_INDICATOR,
appindicator-sharp-0.1 >= $APPINDICATOR_REQUIRED)
AC_SUBST(APP_INDICATOR_CFLAGS)
AC_SUBST(APP_INDICATOR_LIBS)
AC_DEFINE(HAVE_APP_INDICATOR, 1, [Have AppIndicator])
fi
GUISUBDIRS=SparkleShare
else
GUISUBDIRS=
fi
if test x$enable_appindicator = xyes ; then
PKG_CHECK_EXISTS([appindicator-sharp-0.1 >= $APPINDICATOR_REQUIRED],,
AC_MSG_ERROR([appindicator-sharp-0.1 is not installed]))
PKG_CHECK_MODULES(APP_INDICATOR,
appindicator-sharp-0.1 >= $APPINDICATOR_REQUIRED)
AC_SUBST(APP_INDICATOR_CFLAGS)
AC_SUBST(APP_INDICATOR_LIBS)
AC_DEFINE(HAVE_APP_INDICATOR, 1, [Have AppIndicator])
fi
AM_CONDITIONAL(HAVE_APP_INDICATOR, test x"$enable_appindicator" = xyes)
AC_SUBST([GUISUBDIRS])
SHAMROCK_CHECK_NUNIT
dnl Get nautilus extensions directory
SPARKLESHARE_NAUTILUS_PYTHON
SHAVE_INIT([build/m4/shave], [enable])
AC_OUTPUT([
build/Makefile
build/m4/Makefile
@ -153,6 +183,7 @@ SparkleShare ${VERSION}
Configuration:
Prefix : ${prefix}
Build Gtk+ UI : ${enable_gtkui}
Nautilus plugin : ${have_nautilus_python}
User Help : ${enable_user_help} (requires gnome-doc-utils >= 0.17.3)

View file

@ -3,9 +3,8 @@ SUBDIRS = \
html
dist_pixmaps_DATA = \
sparkleshare-gnome.svg \
sparkleshare-mist.svg \
side-splash.png
side-splash.png \
about.png
pixmapsdir = $(pkgdatadir)/pixmaps/

BIN
data/about.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

File diff suppressed because it is too large Load diff

Before

Width:  |  Height:  |  Size: 64 KiB

View file

@ -1,9 +0,0 @@
<?xml version="1.0" encoding="UTF-8" ?>
<sparkleshare_invitation>
<server>git.gnome.org</server>
<folder>gnome-design</folder>
<token>a22bc6f4b9ffe8e5acd4be0838d41aa10a1187dd</token>
</sparkleshare_invitation>

View file

@ -1,7 +1,8 @@
dist_html_DATA = \
day-entry.html \
event-entry.html \
event-log.html
event-log.html \
jquery.js
htmldir = $(pkgdatadir)/html/

View file

@ -1,16 +1,22 @@
<div class='event-entry'>
<div class='event-entry-content'>
<div class='event-info'>
<div class='wrapper'>
<div class='no-buddy-icon'>
<div class='buddy-icon' style='background-image: url("<!-- $event-avatar-url -->");'></div>
</div>
<b><!-- $event-user-name --></b><br/>
<small><!-- $event-time --></small>
</div>
<div class='event-time' style='background-color: <!-- $event-folder-color -->'><!-- $event-folder --></div>
</div>
<!-- $event-entry-content -->
<div class='event-entry' style='background-image: url("<!-- $event-avatar-url -->");'>
<div class='event-user-name'><!-- $event-user-name --></div>
<div class='event-folder'><!-- $event-folder --></div>
<!-- $event-entry-content -->
<div class="clearer"></div>
<div class="event-timestamp"><!-- $event-time --></div>
<div class="action note">Add note</div>
<div class="action show">Show all</div>
<div class="clearer"></div>
<div class="comments-section">
<!-- $event-comments -->
<textarea class="comment-textarea"></textarea>
<input class="comment-button" type="button" value="Add note"
id="<!-- $event-folder -->~<!-- $event-revision -->">
<div style='clear: both'></div>
</div>
<div class="clearer"></div>
</div>

View file

@ -2,9 +2,81 @@
<html>
<head>
<title>SparkleShare Event Log</title>
<script type="text/javascript" src="<!-- $jquery-url -->"></script>
<script type="text/javascript">
$(document).ready(function () {
$('.comments-section').each (function () {
if ($(this).find ('.comments').children ().size () < 1) {
$(this).hide ();
}
});
$('.buddy-icon').each (function () {
if ($(this).css('backgroundImage').indexOf ('@') != -1) {
$(this).css ('backgroundColor', '#fff');
}
});
// Show the form when 'Add note' is clicked
$('.note').click(function () {
$(this).parent ().find ('.comments-section').show ();
});
// Hide the 'Show all' link when there are less than 10 events
$('.show').each (function () {
var entries = $(this).parent ().find ('dl').children ().length;
if (entries <= 10) {
$(this).hide ();
} else {
// Append the number of entries
$(this).html ('Show all ' + entries);
}
});
// When 'Show all' is clicked, show all collapsed events
$('.show').click(function () {
$(this).parent ().find ('dl').children ().show ();
$(this).hide ();
});
$("input").click(function () {
textarea = $(this).parent ().find ('textarea');
text = textarea.val ();
if (text == '')
return;
// Clear the textarea
textarea.val ('');
table = $(this).parent ().find (".comments");
comments = table.html ();
// Add the note to the html
comments += '<div class="comment-text">' +
'<p class="comment-author"' +
' style="background-image: url(\'<!-- $user-avatar-url -->\');">' +
'<!-- $username --></p>' +
text +
'</div>';
table.html (comments);
// Feed the note to the backend
location = this.id + '~' + text;
});
});
</script>
<style>
* {
box-sizing: border-box;
-webkit-box-sizing: border-box;
}
body {
background-color: #dedede;
background-color: #fff;
color: <!-- $body-color -->;
font-size: <!-- $body-font-size -->;
font-family: <!-- $body-font-family -->;
@ -22,15 +94,26 @@
color: <!-- $secondary-font-color -->;
}
.day-entry-header {
font-size: <!-- $day-entry-header-font-size -->;
color: #444;
padding: 18px;
padding-top: 9px;
margin-left: auto;
margin-right: auto;
.comment-text {
font-size: 90%;
padding: 12px;
background-color: #FFF4DB;
margin-bottom: 2px;
}
.day-entry-header {
color: #aaa;
margin-left: auto;
margin-right: auto;
display: block;
text-align: center;
margin-bottom: 36px;
font-weight: bold;
}
.day-entry-content .event-entry:last-child {
border: none;
}
a {
color: <!-- $a-color -->;
@ -41,92 +124,182 @@
color: <!-- $a-hover-color -->;
}
.event-time {
margin: 15px;
opacity: 0.8;
font-size: 80%;
color: #fff;
float: right;
padding: 3px 15px;
font-weight: bold;
-webkit-border-radius: 100px;
}
.event-entry-content {
display: block;
background-color: #f0f0f0;
margin-bottom: 12px;
padding: 0px;
padding-bottom: 6px;
border: #ccc 1px solid;
}
.wrapper {
margin: 15px;
.event-timestamp {
float: left;
font-size: 80%;
color: <!-- $secondary-font-color -->;
}
.event-user-name {
float: left;
font-weight: bold;
}
.event-folder {
float: right;
color: <!-- $secondary-font-color -->;
}
.event-entry {
margin-bottom: 24px;
padding-bottom: 24px;
border-bottom: 1px <!-- $secondary-font-color --> solid;
width: 90%;
margin-left: auto;
margin-right: auto;
padding-left: 72px;
padding-right: 12px;
background-repeat: no-repeat;
background-position: 12px top;
display: block;
}
.action {
font-size: 80%;
margin-left: 15px;
float: right;
margin-bottom: 9px;
color: <!-- $a-color -->;
}
.action:hover {
color: <!-- $a-hover-color -->;
cursor: pointer;
}
.clearer {
clear: both;
backround-color: blue;
margin: 0;
padding: 0;
height: 0;
}
.separator {
clear: both;
border-bottom: 1px #ccc solid;
margin-top: 24px;
margin-bottom: 24px;
}
dl {
padding : 0;
margin: 0;
margin-bottom: 12px;
padding-top: 6px;
clear: both;
}
dd {
width: 90%;
overflow: hidden;
text-overflow: ellipsis;
padding: 0;
padding-top: 2px;
padding-bottom: 4px;
padding-left: 22px;
margin: 0;
margin-bottom: 2px;
margin-left: 12px;
border-bottom: 1px solid #ddd;
background-repeat: no-repeat;
display: none;
overflow: hidden;
text-overflow: ellipsis;
width: 90%;
padding: 0;
padding-top: 2px;
padding-bottom: 2px;
padding-left: 20px;
margin: 0;
margin-bottom: 1px;
background-repeat: no-repeat;
background-position: center left;
}
dd:last-child {
border: none;
dl dd:nth-child(-n+10) {
display: block;
}
.document-added {
.document {
text-overflow: ellipsis;
width: 100%;
white-space: nowrap;
}
.added {
background-image: url('<!-- $document-added-background-image -->');
}
.document-deleted {
.deleted {
background-image: url('<!-- $document-deleted-background-image -->');
}
.document-edited {
.edited {
background-image: url('<!-- $document-edited-background-image -->');
}
.document-moved {
.moved {
background-image: url('<!-- $document-moved-background-image -->');
}
.no-buddy-icon {
position: relative;
top: 0;
left: 0;
float: left;
margin-right: 12px;
width: 36px;
width: 48px;
background-image: url('<!-- $no-buddy-icon-background-image -->');
background-repeat: no-repeat;
background-position: top center;
}
.buddy-icon {
width: 36px;
height: 36px;
width: 48px;
height: 48px;
}
.event-info {
float: left;
margin-bottom: 8px;
.comments {
width: 100%;
background-color: #fff;
border-bottom: 1px #ccc solid;
font-size: 90%;
margin-bottom: 9px;
}
.comment-author {
font-size: 90%;
font-weight: bold;
margin: 0;
margin-bottom: 9px;
background-repeat: no-repeat;
background-position: bottom left;
background-size: 24px;
height: 24px;
padding-left: 30px;
line-height: 24px;
}
.comment-timestamp {
color: <!-- $secondary-font-color -->;
text-align: right;
}
.comment-button {
float:right;
margin-top: 6px;
}
.comment-textarea {
box-sizing: border-box;
-webkit-box-sizing: border-box;
width: 100%;
height: 3em;
padding-bottom: 6px;
}
.comments-section {
box-sizing: border-box;
-webkit-box-sizing: border-box;
width: 100%;
}
.comments-wrapper {
box-sizing: border-box;
-webkit-box-sizing: border-box;
width: 100%;
margin-top: 12px;
}
.comment-text {
padding-bottom: 15px;
}
</style>
</head>

18
data/html/jquery.js vendored Normal file

File diff suppressed because one or more lines are too long

Binary file not shown.

Before

Width:  |  Height:  |  Size: 459 B

After

Width:  |  Height:  |  Size: 498 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 333 B

After

Width:  |  Height:  |  Size: 314 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 618 B

After

Width:  |  Height:  |  Size: 665 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.1 KiB

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 971 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 978 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 869 B

View file

@ -1,28 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>English</string>
<key>CFBundleExecutable</key>
<string>sparkleshare</string>
<key>CFBundleIconFile</key>
<string>sparkleshare.icns</string>
<key>CFBundleIdentifier</key>
<string>org.sparkleshare.sparkleshare</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>SparkleShare</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>0.2</string>
<key>CFBundleSignature</key>
<string>xmmd</string>
<key>CFBundleVersion</key>
<string>0.2</string>
<key>NSAppleScriptEnabled</key>
<string>NO</string>
</dict>
</plist>

21204
data/src/actions.svg Normal file

File diff suppressed because it is too large Load diff

After

Width:  |  Height:  |  Size: 682 KiB

View file

Before

Width:  |  Height:  |  Size: 841 KiB

After

Width:  |  Height:  |  Size: 841 KiB

View file

@ -16,7 +16,7 @@
inkscape:export-xdpi="90.000000"
inkscape:export-ydpi="90.000000"
inkscape:output_extension="org.inkscape.output.svg.inkscape"
inkscape:version="0.48.0 r9654"
inkscape:version="0.48.1 r9760"
sodipodi:docname="sparkleshare-gnome.svg"
sodipodi:version="0.32"
style="display:inline;enable-background:new"
@ -31,20 +31,20 @@
height="300px"
id="base"
inkscape:current-layer="layer20"
inkscape:cx="464.56664"
inkscape:cy="123.20561"
inkscape:cx="489.3933"
inkscape:cy="158.04102"
inkscape:document-units="px"
inkscape:grid-bbox="true"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:showpageshadow="false"
inkscape:snap-bbox="true"
inkscape:snap-bbox="false"
inkscape:snap-nodes="false"
inkscape:window-height="756"
inkscape:window-width="1280"
inkscape:window-height="852"
inkscape:window-width="1440"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:zoom="8"
inkscape:zoom="2"
objecttolerance="10000"
pagecolor="#ffffff"
showgrid="true"
@ -53,7 +53,7 @@
showguides="false"
inkscape:guide-bbox="true"
inkscape:snap-global="true"
inkscape:window-maximized="0"
inkscape:window-maximized="1"
inkscape:bbox-paths="false"
inkscape:bbox-nodes="false">
<inkscape:grid
@ -2436,6 +2436,88 @@
fx="626"
fy="505.22311"
r="30.535728" />
<linearGradient
id="linearGradient4908-1">
<stop
style="stop-color:#ce5c00;stop-opacity:1"
offset="0"
id="stop4910-1" />
<stop
style="stop-color:#f57900;stop-opacity:1"
offset="1"
id="stop4912-5" />
</linearGradient>
<linearGradient
id="linearGradient11481-5">
<stop
id="stop11483-5"
offset="0"
style="stop-color:#a04600;stop-opacity:1" />
<stop
id="stop11485-4"
offset="1"
style="stop-color:#ce5c00;stop-opacity:1" />
</linearGradient>
<linearGradient
id="linearGradient4989-6">
<stop
id="stop4991-7"
offset="0"
style="stop-color:#f57900;stop-opacity:1" />
<stop
style="stop-color:#fcaf3e;stop-opacity:1"
offset="0.06043659"
id="stop4993-3" />
<stop
style="stop-color:#fcaf3e;stop-opacity:1"
offset="0.17753538"
id="stop4995-05" />
<stop
id="stop4997-8"
offset="0.89421868"
style="stop-color:#f57900;stop-opacity:1" />
<stop
style="stop-color:#ce5c00;stop-opacity:1"
offset="1"
id="stop4999-0" />
</linearGradient>
<linearGradient
id="linearGradient12469">
<stop
id="stop12471"
offset="0"
style="stop-color:#a04600;stop-opacity:1" />
<stop
id="stop12473"
offset="1"
style="stop-color:#ce5c00;stop-opacity:1" />
</linearGradient>
<radialGradient
r="103.04688"
fy="525.86011"
fx="147.01562"
cy="525.86011"
cx="147.01562"
gradientTransform="matrix(1.5869209,1.2598559e-7,-5.9772551e-8,0.7528981,-86.286523,85.899531)"
gradientUnits="userSpaceOnUse"
id="radialGradient11735-0"
xlink:href="#linearGradient4347-6-5-6"
inkscape:collect="always" />
<linearGradient
id="linearGradient4347-6-5-6">
<stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop4349-3-4-7" />
<stop
id="stop16502-2"
offset="0.5"
style="stop-color:#ffffff;stop-opacity:0.49803922;" />
<stop
style="stop-color:#ffffff;stop-opacity:0;"
offset="1"
id="stop4351-6-4-2" />
</linearGradient>
</defs>
<g
transform="translate(0,300)"
@ -3676,6 +3758,100 @@
transform="translate(-151,-50)"
id="path7293" />
</g>
<rect
ry="0"
rx="0"
y="-60"
x="701"
height="0"
width="1.9999704"
id="rect12657-5"
style="color:#000000;fill:#888a85;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new" />
<g
style="display:inline;enable-background:new"
id="g12764-7"
transform="translate(-77.003148,62.985444)">
<g
transform="translate(231,-288.9985)"
id="g12757-4"
style="opacity:0.5;fill:none;stroke:#000000;stroke-opacity:1;display:inline;enable-background:new">
<path
style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline;enable-background:new"
d="m 536.4981,230.5 c -0.57203,0.064 -1.00351,0.54941 -1,1.125 l 0,0.90625 c -0.68054,0 -0.99809,0.62729 -0.9981,1.4375 l 0,9.125 c 0,1.33756 1.27557,2.40625 2.09375,2.40625 l 10.96875,0 c 0.81819,0 1.9375,-1.06869 1.9375,-2.40625 l 0,-9.90625 c 0,-0.37505 -0.29595,-0.6875 -0.65625,-0.6875 l -5.99653,0 -0.88822,-2 z"
transform="translate(-231,-11.0015)"
id="path12759-9"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccccssssssccc" />
</g>
<g
style="stroke:none;display:inline;enable-background:new"
id="g10370-6-2"
transform="translate(231,-287.9985)">
<path
sodipodi:nodetypes="cccccsssssssssccc"
inkscape:connector-curvature="0"
id="path12761-5"
d="m 305.59375,218.9985 c -0.32201,0.036 -0.56448,0.30099 -0.5625,0.625 l 0,0.90625 c -3e-5,0.26179 -0.23821,0.49997 -0.5,0.5 -0.18664,0 -0.24684,0.0427 -0.34375,0.1875 -0.0969,0.1448 -0.1875,0.41704 -0.1875,0.75 l 0,9.125 c 0,0.50984 0.24538,0.98446 0.59375,1.34375 0.34837,0.35929 0.80861,0.5625 1,0.5625 l 10.96875,0 c 0.1914,0 0.5954,-0.17788 0.90625,-0.53125 0.31085,-0.35337 0.53125,-0.84569 0.53125,-1.375 l 0,-9.90625 c 0,-0.11202 -0.085,-0.1875 -0.15625,-0.1875 l -6.35938,0 -0.87864,-2 z"
style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;display:inline;enable-background:new" />
</g>
<rect
style="color:#000000;fill:#b4b4b2;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new"
id="rect12657-0"
width="1.9999704"
height="2"
x="541"
y="-62"
rx="0"
ry="0" />
<path
sodipodi:nodetypes="ccccccccccccccccc"
inkscape:connector-curvature="0"
id="path12670-1"
d="m 541.99919,-64.500037 -0.30757,-2.21e-4 -1.00266,1.994507 -2.18347,0.0051 C 538,-63 538.49167,-61.814834 538.49167,-61.814834 l 1.90193,1.921793 -1.0451,2.136338 0.56709,0.392297 2.0565,-1.320983 2.12881,1.380561 0.47825,-0.47492 -0.98095,-2.111519 1.90439,-1.918369 -0.0349,-0.683193 -2.15805,-0.0083 -1.00551,-1.995469 z"
style="fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<path
style="fill:none;stroke:#626262;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1"
d="m 541.96092,-65.499657 -0.95078,-3.43e-4 -1.01569,2.021211 -2.50769,0.0014 0.007,2.45777 2.01317,1.531383 -0.98278,1.525808 -0.006,1.459651 1.48216,0.02348 2.01572,-0.973778 2,0.958667 1.49773,0.0026 9.9e-4,-1.503099 -1.01656,-1.490525 2.02188,-1.531544 0.004,-2.463825 -2.53024,0.0027 -0.99318,-2.016236 z"
id="path12672-4"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccccccccccccccccccc" />
<path
sodipodi:nodetypes="ccccc"
inkscape:connector-curvature="0"
id="path12726-8"
d="m 536.03219,-68.007813 c 0.005,0.665823 -0.019,0.874167 -0.34061,1 l 6.80384,0 -0.44979,-1 z"
style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#646464;fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans" />
<path
sodipodi:nodetypes="cccc"
inkscape:connector-curvature="0"
id="rect12659-6"
d="m 542,-64 1,2 -2,0 z"
style="color:#000000;fill:#626262;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new" />
<path
style="color:#000000;fill:#626262;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new"
d="m 545,-62 -2,2 0,-2 z"
id="path12662-6"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cccc" />
<path
sodipodi:nodetypes="cccc"
inkscape:connector-curvature="0"
id="path12664-4"
d="m 539,-62 2,2 0,-2 z"
style="color:#000000;fill:#626262;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new" />
<path
style="color:#000000;fill:#626262;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new"
d="M 539.99997,-57.970102 542.9961,-59.97231 541.00992,-60 z"
id="path12666-5"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cccc" />
<path
sodipodi:nodetypes="cccc"
inkscape:connector-curvature="0"
id="path12668-2"
d="M 544,-58 540.99997,-59.97231 542.98615,-60 z"
style="color:#000000;fill:#626262;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new" />
</g>
</g>
<g
style="display:inline"

Before

Width:  |  Height:  |  Size: 905 KiB

After

Width:  |  Height:  |  Size: 913 KiB

View file

Before

Width:  |  Height:  |  Size: 53 KiB

After

Width:  |  Height:  |  Size: 53 KiB

View file

Before

Width:  |  Height:  |  Size: 458 KiB

After

Width:  |  Height:  |  Size: 458 KiB

View file

@ -6,13 +6,12 @@ SparkleShare/Mac/SparkleStatusIcon.cs
SparkleShare/Mac/SparkleUI.cs
SparkleShare/Nautilus/sparkleshare-nautilus-extension.py.in
SparkleShare/SparkleAbout.cs
SparkleShare/SparkleBubble.cs
SparkleShare/SparkleController.cs
SparkleShare/SparkleIntro.cs
SparkleShare/SparkleEventLog.cs
SparkleShare/SparkleSetup.cs
SparkleShare/SparkleSetupWindow.cs
SparkleShare/SparkleShare.cs
SparkleShare/SparkleSpinner.cs
SparkleShare/SparkleStatusIcon.cs
SparkleShare/SparkleUI.cs
SparkleShare/SparkleWindow.cs

View file

@ -9,31 +9,32 @@ msgid ""
msgstr ""
"Project-Id-Version: SparkleShare\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-06-17 12:09+0200\n"
"PO-Revision-Date: 2011-06-17 14:36+0000\n"
"Last-Translator: usb333 <majid@aldharrab.com>\n"
"POT-Creation-Date: 2011-06-29 11:38+0200\n"
"PO-Revision-Date: 2011-06-26 09:22+0000\n"
"Last-Translator: deejay1 <deejay1@srem.org>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: ar\n"
"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5\n"
#: ../SparkleShare/Mac/SparkleStatusIcon.cs:338
#: ../SparkleShare/Mac/SparkleStatusIcon.cs:337
#: ../SparkleShare/SparkleIntro.cs:67 ../SparkleShare/SparkleStatusIcon.cs:345
msgid "Welcome to SparkleShare!"
msgstr "مرحبًا بك في سباركل‌شير!"
#: ../SparkleShare/Mac/SparkleStatusIcon.cs:349
#: ../SparkleShare/Mac/SparkleStatusIcon.cs:348
#: ../SparkleShare/SparkleStatusIcon.cs:357
msgid "Not everything is synced"
msgstr "ليس كل شيء مزامَنًا"
#: ../SparkleShare/Mac/SparkleStatusIcon.cs:359
#: ../SparkleShare/Mac/SparkleStatusIcon.cs:358
#: ../SparkleShare/SparkleStatusIcon.cs:367
msgid "Up to date"
msgstr "محدَّث"
#: ../SparkleShare/Mac/SparkleStatusIcon.cs:375
#: ../SparkleShare/Mac/SparkleStatusIcon.cs:374
#: ../SparkleShare/SparkleStatusIcon.cs:383
msgid "Syncing…"
msgstr "يزامن..."
@ -83,35 +84,35 @@ msgstr "أظهر الإ_شادات"
msgid "_Visit Website"
msgstr "_زر الموقع الإلكتروني"
#: ../SparkleShare/SparkleController.cs:422
#: ../SparkleShare/SparkleController.cs:455
msgid "ddd MMM d, yyyy"
msgstr "ddd MMM d, yyyy"
#: ../SparkleShare/SparkleController.cs:427
#: ../SparkleShare/SparkleController.cs:460
msgid "ddd MMM d"
msgstr "ddd MMM d"
#: ../SparkleShare/SparkleController.cs:629
#: ../SparkleShare/SparkleController.cs:661
#, csharp-format
msgid "added {0}"
msgstr "أضيفَ {0}"
#: ../SparkleShare/SparkleController.cs:634
#: ../SparkleShare/SparkleController.cs:666
#, csharp-format
msgid "moved {0}"
msgstr "نُقل {0}"
#: ../SparkleShare/SparkleController.cs:639
#: ../SparkleShare/SparkleController.cs:671
#, csharp-format
msgid "edited {0}"
msgstr "حرِّر {0}"
#: ../SparkleShare/SparkleController.cs:644
#: ../SparkleShare/SparkleController.cs:676
#, csharp-format
msgid "deleted {0}"
msgstr "حُذف {0}"
#: ../SparkleShare/SparkleController.cs:653
#: ../SparkleShare/SparkleController.cs:685
#, csharp-format
msgid "and {0} more"
msgid_plural "and {0} more"
@ -122,7 +123,7 @@ msgstr[3] "و{0} ملفات أخرى"
msgstr[4] "و{ملف آخر"
msgstr[5] "و{0} ملف آخر"
#: ../SparkleShare/SparkleController.cs:657
#: ../SparkleShare/SparkleController.cs:689
msgid "did something magical"
msgstr "فعلتُ شيئًا سحريًا"
@ -320,74 +321,70 @@ msgstr "تعلم كيف تستضيف خادوم سباركل‌شير بنفسك
msgid "Recent Events"
msgstr "الأحداث الأخيرة"
#: ../SparkleShare/SparkleEventLog.cs:131
#: ../SparkleShare/SparkleEventLog.cs:150
#: ../SparkleShare/SparkleEventLog.cs:148
#: ../SparkleShare/SparkleEventLog.cs:173
msgid "All Folders"
msgstr "كل المجلدات"
#: ../SparkleShare/SparkleShare.cs:56
#: ../SparkleShare/SparkleShare.cs:53
msgid "Sorry, you can't run SparkleShare with these permissions."
msgstr "المعذرة، لا يمكنك تشغيل سباركل‌شير بهذه الأذون."
#: ../SparkleShare/SparkleShare.cs:57
#: ../SparkleShare/SparkleShare.cs:54
msgid "Things would go utterly wrong."
msgstr "وإلا فستسير الأمور على غير ما يرام."
#: ../SparkleShare/SparkleShare.cs:66
msgid "Don't show the notification icon"
msgstr "لا تظهِر أيقونة التنبيه"
#: ../SparkleShare/SparkleShare.cs:67
#: ../SparkleShare/SparkleShare.cs:61
msgid "Print version information"
msgstr "اطبع معلومات الإصدارة"
#: ../SparkleShare/SparkleShare.cs:68
#: ../SparkleShare/SparkleShare.cs:62
msgid "Show this help text"
msgstr "أظهر نص المساعدة هذا"
#: ../SparkleShare/SparkleShare.cs:115
#: ../SparkleShare/SparkleShare.cs:109
msgid "SparkleShare, a collaboration and sharing tool."
msgstr "سباركل‌شير، أداة تعاون ومشاركة."
#: ../SparkleShare/SparkleShare.cs:116
#: ../SparkleShare/SparkleShare.cs:110
msgid "Copyright (C) 2010 Hylke Bons"
msgstr "Copyright (C) 2010 Hylke Bons"
#: ../SparkleShare/SparkleShare.cs:118
#: ../SparkleShare/SparkleShare.cs:112
msgid "This program comes with ABSOLUTELY NO WARRANTY."
msgstr "لا يشمل هذا البرنامج أي ضمان"
#: ../SparkleShare/SparkleShare.cs:120
#: ../SparkleShare/SparkleShare.cs:114
msgid "This is free software, and you are welcome to redistribute it "
msgstr "هذا برنامج حر، ونحن نرحب بتوزيعه "
#: ../SparkleShare/SparkleShare.cs:121
#: ../SparkleShare/SparkleShare.cs:115
msgid "under certain conditions. Please read the GNU GPLv3 for details."
msgstr ""
"ضمن شروط معينة. يرجى قراءة رخصة جنو العمومية - الإصدارة الثالثة للاطلاع على "
"التفاصيل."
#: ../SparkleShare/SparkleShare.cs:123
#: ../SparkleShare/SparkleShare.cs:117
msgid "SparkleShare automatically syncs Git repositories in "
msgstr "يزامن سباركل‌شير مستودعات جِت الموجودة في "
#: ../SparkleShare/SparkleShare.cs:124
#: ../SparkleShare/SparkleShare.cs:118
msgid "the ~/SparkleShare folder with their remote origins."
msgstr "مجلد ~/SparkleShare مع أصولها البعيدة آليًا."
#: ../SparkleShare/SparkleShare.cs:126
#: ../SparkleShare/SparkleShare.cs:120
msgid "Usage: sparkleshare [start|stop|restart] [OPTION]..."
msgstr "طريقة الاستخدام: sparkleshare [start|stop|restart] [OPTION]..."
#: ../SparkleShare/SparkleShare.cs:127
#: ../SparkleShare/SparkleShare.cs:121
msgid "Sync SparkleShare folder with remote repositories."
msgstr "زامن مجلد سباركل‌شير مع مستودعات بعيدة."
#: ../SparkleShare/SparkleShare.cs:129
#: ../SparkleShare/SparkleShare.cs:123
msgid "Arguments:"
msgstr "المعطيات:"
#: ../SparkleShare/SparkleShare.cs:139
#: ../SparkleShare/SparkleShare.cs:133
msgid "SparkleShare "
msgstr "سباركل‌شير "
@ -417,11 +414,11 @@ msgstr "فعِّل التنبيهات"
msgid "Quit"
msgstr "اخرج"
#: ../SparkleShare/SparkleUI.cs:96
#: ../SparkleShare/SparkleUI.cs:99
msgid "Ouch! Mid-air collision!"
msgstr "آخ! اصطدام هوائي!"
#: ../SparkleShare/SparkleUI.cs:97
#: ../SparkleShare/SparkleUI.cs:100
msgid "Don't worry, SparkleShare made a copy of each conflicting file."
msgstr "لا تقلق، صنع سباركل‌شير نسخة من كل ملف متعارض."

View file

@ -9,31 +9,32 @@ msgid ""
msgstr ""
"Project-Id-Version: SparkleShare\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-06-17 12:09+0200\n"
"PO-Revision-Date: 2011-06-17 10:13+0000\n"
"POT-Creation-Date: 2011-06-29 11:38+0200\n"
"PO-Revision-Date: 2011-06-26 09:22+0000\n"
"Last-Translator: deejay1 <deejay1@srem.org>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: bg\n"
"Plural-Forms: nplurals=2; plural=(n != 1)\n"
#: ../SparkleShare/Mac/SparkleStatusIcon.cs:338
#: ../SparkleShare/Mac/SparkleStatusIcon.cs:337
#: ../SparkleShare/SparkleIntro.cs:67 ../SparkleShare/SparkleStatusIcon.cs:345
msgid "Welcome to SparkleShare!"
msgstr "Здравейте в SparkleShare!"
#: ../SparkleShare/Mac/SparkleStatusIcon.cs:349
#: ../SparkleShare/Mac/SparkleStatusIcon.cs:348
#: ../SparkleShare/SparkleStatusIcon.cs:357
msgid "Not everything is synced"
msgstr "Синхронизирането не е приключило"
#: ../SparkleShare/Mac/SparkleStatusIcon.cs:359
#: ../SparkleShare/Mac/SparkleStatusIcon.cs:358
#: ../SparkleShare/SparkleStatusIcon.cs:367
msgid "Up to date"
msgstr "Обновено"
#: ../SparkleShare/Mac/SparkleStatusIcon.cs:375
#: ../SparkleShare/Mac/SparkleStatusIcon.cs:374
#: ../SparkleShare/SparkleStatusIcon.cs:383
msgid "Syncing…"
msgstr "Синхронизиране…"
@ -83,42 +84,42 @@ msgstr "_Заслуги"
msgid "_Visit Website"
msgstr "_Към уеб сайта"
#: ../SparkleShare/SparkleController.cs:422
#: ../SparkleShare/SparkleController.cs:455
msgid "ddd MMM d, yyyy"
msgstr ""
#: ../SparkleShare/SparkleController.cs:427
#: ../SparkleShare/SparkleController.cs:460
msgid "ddd MMM d"
msgstr ""
#: ../SparkleShare/SparkleController.cs:629
#: ../SparkleShare/SparkleController.cs:661
#, csharp-format
msgid "added {0}"
msgstr "добавен е „{0}“"
#: ../SparkleShare/SparkleController.cs:634
#: ../SparkleShare/SparkleController.cs:666
#, csharp-format
msgid "moved {0}"
msgstr ""
#: ../SparkleShare/SparkleController.cs:639
#: ../SparkleShare/SparkleController.cs:671
#, csharp-format
msgid "edited {0}"
msgstr "редактиран е „{0}“"
#: ../SparkleShare/SparkleController.cs:644
#: ../SparkleShare/SparkleController.cs:676
#, csharp-format
msgid "deleted {0}"
msgstr "изтрит е „{0}“"
#: ../SparkleShare/SparkleController.cs:653
#: ../SparkleShare/SparkleController.cs:685
#, csharp-format
msgid "and {0} more"
msgid_plural "and {0} more"
msgstr[0] ""
msgstr[1] ""
#: ../SparkleShare/SparkleController.cs:657
#: ../SparkleShare/SparkleController.cs:689
msgid "did something magical"
msgstr ""
@ -318,75 +319,71 @@ msgstr "Научете как да създадете свой сървър за
msgid "Recent Events"
msgstr ""
#: ../SparkleShare/SparkleEventLog.cs:131
#: ../SparkleShare/SparkleEventLog.cs:150
#: ../SparkleShare/SparkleEventLog.cs:148
#: ../SparkleShare/SparkleEventLog.cs:173
msgid "All Folders"
msgstr ""
#: ../SparkleShare/SparkleShare.cs:56
#: ../SparkleShare/SparkleShare.cs:53
msgid "Sorry, you can't run SparkleShare with these permissions."
msgstr "С настоящите права не може да стартирате SparkleShare."
#: ../SparkleShare/SparkleShare.cs:57
#: ../SparkleShare/SparkleShare.cs:54
msgid "Things would go utterly wrong."
msgstr "Нещата могат изцяло да се объркат."
#: ../SparkleShare/SparkleShare.cs:66
msgid "Don't show the notification icon"
msgstr "Без икона в областта за уведомяване"
#: ../SparkleShare/SparkleShare.cs:67
#: ../SparkleShare/SparkleShare.cs:61
msgid "Print version information"
msgstr "Извеждане на информация за версията"
#: ../SparkleShare/SparkleShare.cs:68
#: ../SparkleShare/SparkleShare.cs:62
msgid "Show this help text"
msgstr "Показване на този помощен текст"
#: ../SparkleShare/SparkleShare.cs:115
#: ../SparkleShare/SparkleShare.cs:109
msgid "SparkleShare, a collaboration and sharing tool."
msgstr ""
#: ../SparkleShare/SparkleShare.cs:116
#: ../SparkleShare/SparkleShare.cs:110
msgid "Copyright (C) 2010 Hylke Bons"
msgstr "Авторски права: © 2010 Hylke Bons"
#: ../SparkleShare/SparkleShare.cs:118
#: ../SparkleShare/SparkleShare.cs:112
msgid "This program comes with ABSOLUTELY NO WARRANTY."
msgstr "Тази програма идва БЕЗ НИКАКВИ ГАРАНЦИИ."
#: ../SparkleShare/SparkleShare.cs:120
#: ../SparkleShare/SparkleShare.cs:114
msgid "This is free software, and you are welcome to redistribute it "
msgstr ""
"Това е свободен софтуер, можете да го разпространявате при определени "
"условия."
#: ../SparkleShare/SparkleShare.cs:121
#: ../SparkleShare/SparkleShare.cs:115
msgid "under certain conditions. Please read the GNU GPLv3 for details."
msgstr "За повече информация вижте Общия публичен лиценз на GNU, версия 3."
#: ../SparkleShare/SparkleShare.cs:123
#: ../SparkleShare/SparkleShare.cs:117
msgid "SparkleShare automatically syncs Git repositories in "
msgstr "SparkleShare автоматично синхронизира хранилища на Git"
#: ../SparkleShare/SparkleShare.cs:124
#: ../SparkleShare/SparkleShare.cs:118
msgid "the ~/SparkleShare folder with their remote origins."
msgstr "в папката ~/SparkleShare с отдалечените им източници."
#: ../SparkleShare/SparkleShare.cs:126
#: ../SparkleShare/SparkleShare.cs:120
msgid "Usage: sparkleshare [start|stop|restart] [OPTION]..."
msgstr "Употреба: sparkleshare [start|stop|restart] [ОПЦИЯ]…"
#: ../SparkleShare/SparkleShare.cs:127
#: ../SparkleShare/SparkleShare.cs:121
msgid "Sync SparkleShare folder with remote repositories."
msgstr ""
"Синхронизиране на папката ви за SparkleShare с отдалечените източници."
#: ../SparkleShare/SparkleShare.cs:129
#: ../SparkleShare/SparkleShare.cs:123
msgid "Arguments:"
msgstr "Аргументи:"
#: ../SparkleShare/SparkleShare.cs:139
#: ../SparkleShare/SparkleShare.cs:133
msgid "SparkleShare "
msgstr "SparkleShare "
@ -416,11 +413,11 @@ msgstr "Включване на уведомленията"
msgid "Quit"
msgstr "Спиране на програмата"
#: ../SparkleShare/SparkleUI.cs:96
#: ../SparkleShare/SparkleUI.cs:99
msgid "Ouch! Mid-air collision!"
msgstr "Опс, конфликт на версии!"
#: ../SparkleShare/SparkleUI.cs:97
#: ../SparkleShare/SparkleUI.cs:100
msgid "Don't worry, SparkleShare made a copy of each conflicting file."
msgstr "Без паника! SparkleShare е създал копие на всеки файл в конфликт."

View file

@ -6,36 +6,38 @@
#
# <bielet@bielet.com>, 2011.
# Carles Mateu <carlesm@carlesm.com>, 2011.
# <a@alexandresaiz.com>, 2011.
# alexandresaiz <a@alexandresaiz.com>, 2011.
msgid ""
msgstr ""
"Project-Id-Version: SparkleShare\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-06-17 12:09+0200\n"
"PO-Revision-Date: 2011-06-17 10:13+0000\n"
"Last-Translator: deejay1 <deejay1@srem.org>\n"
"POT-Creation-Date: 2011-06-29 11:38+0200\n"
"PO-Revision-Date: 2011-07-02 21:33+0000\n"
"Last-Translator: alexandresaiz <a@alexandresaiz.com>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: ca\n"
"Plural-Forms: nplurals=2; plural=(n != 1)\n"
#: ../SparkleShare/Mac/SparkleStatusIcon.cs:338
#: ../SparkleShare/Mac/SparkleStatusIcon.cs:337
#: ../SparkleShare/SparkleIntro.cs:67 ../SparkleShare/SparkleStatusIcon.cs:345
msgid "Welcome to SparkleShare!"
msgstr "Benvinguts a SparkleShare"
#: ../SparkleShare/Mac/SparkleStatusIcon.cs:349
#: ../SparkleShare/Mac/SparkleStatusIcon.cs:348
#: ../SparkleShare/SparkleStatusIcon.cs:357
msgid "Not everything is synced"
msgstr "No està tot sincronitzat"
#: ../SparkleShare/Mac/SparkleStatusIcon.cs:359
#: ../SparkleShare/Mac/SparkleStatusIcon.cs:358
#: ../SparkleShare/SparkleStatusIcon.cs:367
msgid "Up to date"
msgstr "Al dia"
#: ../SparkleShare/Mac/SparkleStatusIcon.cs:375
#: ../SparkleShare/Mac/SparkleStatusIcon.cs:374
#: ../SparkleShare/SparkleStatusIcon.cs:383
msgid "Syncing…"
msgstr "Sincronitzant ..."
@ -85,42 +87,42 @@ msgstr "Mostra els Credits"
msgid "_Visit Website"
msgstr "_Visitar lloc web"
#: ../SparkleShare/SparkleController.cs:422
#: ../SparkleShare/SparkleController.cs:455
msgid "ddd MMM d, yyyy"
msgstr ""
msgstr "ddd MMM d, yyyy"
#: ../SparkleShare/SparkleController.cs:427
#: ../SparkleShare/SparkleController.cs:460
msgid "ddd MMM d"
msgstr ""
msgstr "ddd MMM d"
#: ../SparkleShare/SparkleController.cs:629
#: ../SparkleShare/SparkleController.cs:661
#, csharp-format
msgid "added {0}"
msgstr "afegit '{0}'"
#: ../SparkleShare/SparkleController.cs:634
#: ../SparkleShare/SparkleController.cs:666
#, csharp-format
msgid "moved {0}"
msgstr "mogut {0}"
#: ../SparkleShare/SparkleController.cs:639
#: ../SparkleShare/SparkleController.cs:671
#, csharp-format
msgid "edited {0}"
msgstr "editat '{0}'"
#: ../SparkleShare/SparkleController.cs:644
#: ../SparkleShare/SparkleController.cs:676
#, csharp-format
msgid "deleted {0}"
msgstr "eliminat '{0}'"
#: ../SparkleShare/SparkleController.cs:653
#: ../SparkleShare/SparkleController.cs:685
#, csharp-format
msgid "and {0} more"
msgid_plural "and {0} more"
msgstr[0] "i {0} més"
msgstr[1] "i {0} més"
#: ../SparkleShare/SparkleController.cs:657
#: ../SparkleShare/SparkleController.cs:689
msgid "did something magical"
msgstr "va fer una cosa màgica"
@ -323,76 +325,72 @@ msgstr "Apren com gestionar el teu propi servidor SparkleShare"
#: ../SparkleShare/SparkleEventLog.cs:61
msgid "Recent Events"
msgstr ""
msgstr "Accions recents"
#: ../SparkleShare/SparkleEventLog.cs:131
#: ../SparkleShare/SparkleEventLog.cs:150
#: ../SparkleShare/SparkleEventLog.cs:148
#: ../SparkleShare/SparkleEventLog.cs:173
msgid "All Folders"
msgstr ""
msgstr "Totes les carpetes"
#: ../SparkleShare/SparkleShare.cs:56
#: ../SparkleShare/SparkleShare.cs:53
msgid "Sorry, you can't run SparkleShare with these permissions."
msgstr "Ho sentim, no pots executar SparkleShare amb aquests permisos."
#: ../SparkleShare/SparkleShare.cs:57
#: ../SparkleShare/SparkleShare.cs:54
msgid "Things would go utterly wrong."
msgstr "Les coses anirien molt malament."
#: ../SparkleShare/SparkleShare.cs:66
msgid "Don't show the notification icon"
msgstr "No mostrar la icona de notificació"
#: ../SparkleShare/SparkleShare.cs:67
#: ../SparkleShare/SparkleShare.cs:61
msgid "Print version information"
msgstr "Imprimir la informació de versió"
#: ../SparkleShare/SparkleShare.cs:68
#: ../SparkleShare/SparkleShare.cs:62
msgid "Show this help text"
msgstr "Mostra aquest text d'ajuda"
#: ../SparkleShare/SparkleShare.cs:115
#: ../SparkleShare/SparkleShare.cs:109
msgid "SparkleShare, a collaboration and sharing tool."
msgstr "una eina d'intercanvi i col·laboració"
#: ../SparkleShare/SparkleShare.cs:116
#: ../SparkleShare/SparkleShare.cs:110
msgid "Copyright (C) 2010 Hylke Bons"
msgstr "Copyright (C) 2010 Hylke Bons"
#: ../SparkleShare/SparkleShare.cs:118
#: ../SparkleShare/SparkleShare.cs:112
msgid "This program comes with ABSOLUTELY NO WARRANTY."
msgstr "Aquest programa ve sense, absolutament, cap garantia."
#: ../SparkleShare/SparkleShare.cs:120
#: ../SparkleShare/SparkleShare.cs:114
msgid "This is free software, and you are welcome to redistribute it "
msgstr "Aquest és programari lliure, i estas convidat a redistribuir-lo"
#: ../SparkleShare/SparkleShare.cs:121
#: ../SparkleShare/SparkleShare.cs:115
msgid "under certain conditions. Please read the GNU GPLv3 for details."
msgstr ""
"sota certes condicions. Si us plau, llegeix la GNU GPLv3 per obtenir més "
"detalls."
#: ../SparkleShare/SparkleShare.cs:123
#: ../SparkleShare/SparkleShare.cs:117
msgid "SparkleShare automatically syncs Git repositories in "
msgstr "SparkleShare sincronitza automàticament repositoris Git a"
#: ../SparkleShare/SparkleShare.cs:124
#: ../SparkleShare/SparkleShare.cs:118
msgid "the ~/SparkleShare folder with their remote origins."
msgstr "carpeta ~ / SparkleShare amb els seus orígens remots."
#: ../SparkleShare/SparkleShare.cs:126
#: ../SparkleShare/SparkleShare.cs:120
msgid "Usage: sparkleshare [start|stop|restart] [OPTION]..."
msgstr "Ús: sparkleshare [start|stop|restart] [OPCIÓ] ..."
#: ../SparkleShare/SparkleShare.cs:127
#: ../SparkleShare/SparkleShare.cs:121
msgid "Sync SparkleShare folder with remote repositories."
msgstr "Sincronitza carpeta SparkleShare amb repositoris remots."
#: ../SparkleShare/SparkleShare.cs:129
#: ../SparkleShare/SparkleShare.cs:123
msgid "Arguments:"
msgstr "Arguments:"
#: ../SparkleShare/SparkleShare.cs:139
#: ../SparkleShare/SparkleShare.cs:133
msgid "SparkleShare "
msgstr "SparkleShare"
@ -407,7 +405,7 @@ msgstr "Afegeix una carpeta remota"
#: ../SparkleShare/SparkleStatusIcon.cs:242
msgid "Show Recent Events"
msgstr ""
msgstr "Mostra les accions més recents"
#: ../SparkleShare/SparkleStatusIcon.cs:262
msgid "Turn Notifications Off"
@ -422,11 +420,11 @@ msgstr "Activa les Notificacions"
msgid "Quit"
msgstr "Sortir"
#: ../SparkleShare/SparkleUI.cs:96
#: ../SparkleShare/SparkleUI.cs:99
msgid "Ouch! Mid-air collision!"
msgstr "Ai! Col·lisió en ple vol!"
#: ../SparkleShare/SparkleUI.cs:97
#: ../SparkleShare/SparkleUI.cs:100
msgid "Don't worry, SparkleShare made a copy of each conflicting file."
msgstr ""
"No et preocupis, SparkleShare ha fet una còpia de cada fitxer en conflicte."

View file

@ -4,36 +4,38 @@
# we apologise for any incovenience this may have caused and we hope to bring them
# back in the future.
#
# Jiri Slezka <jiri.slezka@slu.cz>, 2011.
# zzanzare <zzanzare@gmail.com>, 2011.
msgid ""
msgstr ""
"Project-Id-Version: SparkleShare\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-06-17 12:09+0200\n"
"PO-Revision-Date: 2011-06-17 10:13+0000\n"
"Last-Translator: deejay1 <deejay1@srem.org>\n"
"POT-Creation-Date: 2011-06-29 11:38+0200\n"
"PO-Revision-Date: 2011-07-09 22:10+0000\n"
"Last-Translator: dron23 <jiri.slezka@slu.cz>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: cs_CZ\n"
"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2\n"
#: ../SparkleShare/Mac/SparkleStatusIcon.cs:338
#: ../SparkleShare/Mac/SparkleStatusIcon.cs:337
#: ../SparkleShare/SparkleIntro.cs:67 ../SparkleShare/SparkleStatusIcon.cs:345
msgid "Welcome to SparkleShare!"
msgstr "Vítejte ve SparkleShare!"
#: ../SparkleShare/Mac/SparkleStatusIcon.cs:349
#: ../SparkleShare/Mac/SparkleStatusIcon.cs:348
#: ../SparkleShare/SparkleStatusIcon.cs:357
msgid "Not everything is synced"
msgstr "Něco není synchronizováno"
#: ../SparkleShare/Mac/SparkleStatusIcon.cs:359
#: ../SparkleShare/Mac/SparkleStatusIcon.cs:358
#: ../SparkleShare/SparkleStatusIcon.cs:367
msgid "Up to date"
msgstr "Aktuální"
#: ../SparkleShare/Mac/SparkleStatusIcon.cs:375
#: ../SparkleShare/Mac/SparkleStatusIcon.cs:374
#: ../SparkleShare/SparkleStatusIcon.cs:383
msgid "Syncing…"
msgstr "Synchronizuji…"
@ -65,15 +67,15 @@ msgstr "O SparkleShare"
#: ../SparkleShare/SparkleAbout.cs:53
msgid "A newer version is available"
msgstr ""
msgstr "Je k dispozici novější verze"
#: ../SparkleShare/SparkleAbout.cs:60
msgid "You are running the latest version."
msgstr ""
msgstr "Provozujete aktuální verzi."
#: ../SparkleShare/SparkleAbout.cs:87
msgid "Checking for updates..."
msgstr ""
msgstr "Kontroluji aktualizace..."
#: ../SparkleShare/SparkleAbout.cs:116
msgid "_Show Credits"
@ -83,45 +85,45 @@ msgstr "_Zásluhy"
msgid "_Visit Website"
msgstr "_Navštívit domovskou stránku"
#: ../SparkleShare/SparkleController.cs:422
#: ../SparkleShare/SparkleController.cs:455
msgid "ddd MMM d, yyyy"
msgstr "ddd d. MMM, yyyy"
#: ../SparkleShare/SparkleController.cs:427
#: ../SparkleShare/SparkleController.cs:460
msgid "ddd MMM d"
msgstr "ddd d. MMM"
#: ../SparkleShare/SparkleController.cs:629
#: ../SparkleShare/SparkleController.cs:661
#, csharp-format
msgid "added {0}"
msgstr "přidal(a) {0}"
#: ../SparkleShare/SparkleController.cs:634
#: ../SparkleShare/SparkleController.cs:666
#, csharp-format
msgid "moved {0}"
msgstr ""
msgstr "přesunuto \"{0}\""
#: ../SparkleShare/SparkleController.cs:639
#: ../SparkleShare/SparkleController.cs:671
#, csharp-format
msgid "edited {0}"
msgstr "upravil(a) {0}"
#: ../SparkleShare/SparkleController.cs:644
#: ../SparkleShare/SparkleController.cs:676
#, csharp-format
msgid "deleted {0}"
msgstr "smazal(a) {0}"
#: ../SparkleShare/SparkleController.cs:653
#: ../SparkleShare/SparkleController.cs:685
#, csharp-format
msgid "and {0} more"
msgid_plural "and {0} more"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
msgstr[0] "a {0} více"
msgstr[1] "a {0} více"
msgstr[2] "a {0} více"
#: ../SparkleShare/SparkleController.cs:657
#: ../SparkleShare/SparkleController.cs:689
msgid "did something magical"
msgstr ""
msgstr "stalo se něco magického"
#: ../SparkleShare/SparkleIntro.cs:73
msgid ""
@ -319,76 +321,72 @@ msgstr "Zjistěte jak připravit svůj vlastní SparkleServer"
#: ../SparkleShare/SparkleEventLog.cs:61
msgid "Recent Events"
msgstr ""
msgstr "Nedávné události"
#: ../SparkleShare/SparkleEventLog.cs:131
#: ../SparkleShare/SparkleEventLog.cs:150
#: ../SparkleShare/SparkleEventLog.cs:148
#: ../SparkleShare/SparkleEventLog.cs:173
msgid "All Folders"
msgstr ""
msgstr "Všechny složky"
#: ../SparkleShare/SparkleShare.cs:56
#: ../SparkleShare/SparkleShare.cs:53
msgid "Sorry, you can't run SparkleShare with these permissions."
msgstr ""
"Je nám líto, ale nemůžete spouštět SparkleShare s těmito přístupovými právy."
#: ../SparkleShare/SparkleShare.cs:57
#: ../SparkleShare/SparkleShare.cs:54
msgid "Things would go utterly wrong."
msgstr "Věci by se mohly příšerně pokazit."
#: ../SparkleShare/SparkleShare.cs:66
msgid "Don't show the notification icon"
msgstr "Nezobrazovat oznamovací ikonu"
#: ../SparkleShare/SparkleShare.cs:67
#: ../SparkleShare/SparkleShare.cs:61
msgid "Print version information"
msgstr "Vypíše informace o verzi"
#: ../SparkleShare/SparkleShare.cs:68
#: ../SparkleShare/SparkleShare.cs:62
msgid "Show this help text"
msgstr "Zobrazit tuto nápovědu"
#: ../SparkleShare/SparkleShare.cs:115
#: ../SparkleShare/SparkleShare.cs:109
msgid "SparkleShare, a collaboration and sharing tool."
msgstr ""
msgstr "SparkleShare, nástroj pro sdílení a spolupráci."
#: ../SparkleShare/SparkleShare.cs:116
#: ../SparkleShare/SparkleShare.cs:110
msgid "Copyright (C) 2010 Hylke Bons"
msgstr "Všechna práva vyhrazena (C) 2010 Hylke Bons"
#: ../SparkleShare/SparkleShare.cs:118
#: ../SparkleShare/SparkleShare.cs:112
msgid "This program comes with ABSOLUTELY NO WARRANTY."
msgstr "Tento program je ABSOLUTNĚ BEZ ZÁRUKY."
#: ../SparkleShare/SparkleShare.cs:120
#: ../SparkleShare/SparkleShare.cs:114
msgid "This is free software, and you are welcome to redistribute it "
msgstr "Toto je svobodný software a můžete jej dále šířit."
#: ../SparkleShare/SparkleShare.cs:121
#: ../SparkleShare/SparkleShare.cs:115
msgid "under certain conditions. Please read the GNU GPLv3 for details."
msgstr ""
"za jistých podmínek. Prosím, přečtěte si GNU GPLv3 pro více informací."
#: ../SparkleShare/SparkleShare.cs:123
#: ../SparkleShare/SparkleShare.cs:117
msgid "SparkleShare automatically syncs Git repositories in "
msgstr "SparkleShare automaticky synchronizuje repozitáře Git v "
#: ../SparkleShare/SparkleShare.cs:124
#: ../SparkleShare/SparkleShare.cs:118
msgid "the ~/SparkleShare folder with their remote origins."
msgstr "složce ~/SparkleShare s jejich vzdálenými protistranami."
#: ../SparkleShare/SparkleShare.cs:126
#: ../SparkleShare/SparkleShare.cs:120
msgid "Usage: sparkleshare [start|stop|restart] [OPTION]..."
msgstr "Použití: sparkleshare [start|stop|restart] [VOLBY]..."
#: ../SparkleShare/SparkleShare.cs:127
#: ../SparkleShare/SparkleShare.cs:121
msgid "Sync SparkleShare folder with remote repositories."
msgstr "Synchronizovat složku SparkleShare se vzdálenými repozitáři."
#: ../SparkleShare/SparkleShare.cs:129
#: ../SparkleShare/SparkleShare.cs:123
msgid "Arguments:"
msgstr "Argumenty:"
#: ../SparkleShare/SparkleShare.cs:139
#: ../SparkleShare/SparkleShare.cs:133
msgid "SparkleShare "
msgstr "SparkleShare "
@ -403,7 +401,7 @@ msgstr "Přidat vzdálenou složku…"
#: ../SparkleShare/SparkleStatusIcon.cs:242
msgid "Show Recent Events"
msgstr ""
msgstr "Zobrazit nedávné události"
#: ../SparkleShare/SparkleStatusIcon.cs:262
msgid "Turn Notifications Off"
@ -418,17 +416,17 @@ msgstr "Zapnout upozornění"
msgid "Quit"
msgstr "Ukončit"
#: ../SparkleShare/SparkleUI.cs:96
#: ../SparkleShare/SparkleUI.cs:99
msgid "Ouch! Mid-air collision!"
msgstr "Au! Nehoda na cestě!"
#: ../SparkleShare/SparkleUI.cs:97
#: ../SparkleShare/SparkleUI.cs:100
msgid "Don't worry, SparkleShare made a copy of each conflicting file."
msgstr ""
"Nemějte strach, SparkleShare udělal kopie každého konfliktního souboru."
#: ../SparkleShare/SparkleWindow.cs:41
msgid "SparkleShare Setup"
msgstr ""
msgstr "Nastavení SparkleShare"

View file

@ -9,31 +9,32 @@ msgid ""
msgstr ""
"Project-Id-Version: SparkleShare\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-06-17 12:09+0200\n"
"PO-Revision-Date: 2011-06-17 10:13+0000\n"
"POT-Creation-Date: 2011-06-29 11:38+0200\n"
"PO-Revision-Date: 2011-06-26 09:22+0000\n"
"Last-Translator: deejay1 <deejay1@srem.org>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: da\n"
"Plural-Forms: nplurals=2; plural=(n != 1)\n"
#: ../SparkleShare/Mac/SparkleStatusIcon.cs:338
#: ../SparkleShare/Mac/SparkleStatusIcon.cs:337
#: ../SparkleShare/SparkleIntro.cs:67 ../SparkleShare/SparkleStatusIcon.cs:345
msgid "Welcome to SparkleShare!"
msgstr "Velkommen til SparkleShare!"
#: ../SparkleShare/Mac/SparkleStatusIcon.cs:349
#: ../SparkleShare/Mac/SparkleStatusIcon.cs:348
#: ../SparkleShare/SparkleStatusIcon.cs:357
msgid "Not everything is synced"
msgstr "Ikke alt er synkroniseret"
#: ../SparkleShare/Mac/SparkleStatusIcon.cs:359
#: ../SparkleShare/Mac/SparkleStatusIcon.cs:358
#: ../SparkleShare/SparkleStatusIcon.cs:367
msgid "Up to date"
msgstr "Opdateret"
#: ../SparkleShare/Mac/SparkleStatusIcon.cs:375
#: ../SparkleShare/Mac/SparkleStatusIcon.cs:374
#: ../SparkleShare/SparkleStatusIcon.cs:383
msgid "Syncing…"
msgstr "Synkroniseret"
@ -83,42 +84,42 @@ msgstr ""
msgid "_Visit Website"
msgstr "_Besøg hjemmeside"
#: ../SparkleShare/SparkleController.cs:422
#: ../SparkleShare/SparkleController.cs:455
msgid "ddd MMM d, yyyy"
msgstr ""
#: ../SparkleShare/SparkleController.cs:427
#: ../SparkleShare/SparkleController.cs:460
msgid "ddd MMM d"
msgstr ""
#: ../SparkleShare/SparkleController.cs:629
#: ../SparkleShare/SparkleController.cs:661
#, csharp-format
msgid "added {0}"
msgstr "tilføjede '{0}'"
#: ../SparkleShare/SparkleController.cs:634
#: ../SparkleShare/SparkleController.cs:666
#, csharp-format
msgid "moved {0}"
msgstr ""
#: ../SparkleShare/SparkleController.cs:639
#: ../SparkleShare/SparkleController.cs:671
#, csharp-format
msgid "edited {0}"
msgstr "redigerede '{0}'"
#: ../SparkleShare/SparkleController.cs:644
#: ../SparkleShare/SparkleController.cs:676
#, csharp-format
msgid "deleted {0}"
msgstr "slettede '{0}'"
#: ../SparkleShare/SparkleController.cs:653
#: ../SparkleShare/SparkleController.cs:685
#, csharp-format
msgid "and {0} more"
msgid_plural "and {0} more"
msgstr[0] ""
msgstr[1] ""
#: ../SparkleShare/SparkleController.cs:657
#: ../SparkleShare/SparkleController.cs:689
msgid "did something magical"
msgstr ""
@ -319,72 +320,68 @@ msgstr "Lær hvordan du beværte din egen SparkleServer"
msgid "Recent Events"
msgstr ""
#: ../SparkleShare/SparkleEventLog.cs:131
#: ../SparkleShare/SparkleEventLog.cs:150
#: ../SparkleShare/SparkleEventLog.cs:148
#: ../SparkleShare/SparkleEventLog.cs:173
msgid "All Folders"
msgstr ""
#: ../SparkleShare/SparkleShare.cs:56
#: ../SparkleShare/SparkleShare.cs:53
msgid "Sorry, you can't run SparkleShare with these permissions."
msgstr "Beklager, du kan ikke køre SparkleShare med disse rettigheder."
#: ../SparkleShare/SparkleShare.cs:57
#: ../SparkleShare/SparkleShare.cs:54
msgid "Things would go utterly wrong."
msgstr "Det ville gå helt galt."
#: ../SparkleShare/SparkleShare.cs:66
msgid "Don't show the notification icon"
msgstr "Vis ikke besked-ikon."
#: ../SparkleShare/SparkleShare.cs:67
#: ../SparkleShare/SparkleShare.cs:61
msgid "Print version information"
msgstr "Vis versioninformation"
#: ../SparkleShare/SparkleShare.cs:68
#: ../SparkleShare/SparkleShare.cs:62
msgid "Show this help text"
msgstr "Vis denne hjælpetekst"
#: ../SparkleShare/SparkleShare.cs:115
#: ../SparkleShare/SparkleShare.cs:109
msgid "SparkleShare, a collaboration and sharing tool."
msgstr ""
#: ../SparkleShare/SparkleShare.cs:116
#: ../SparkleShare/SparkleShare.cs:110
msgid "Copyright (C) 2010 Hylke Bons"
msgstr "Copyright(C) 2010 Hylke Bons"
#: ../SparkleShare/SparkleShare.cs:118
#: ../SparkleShare/SparkleShare.cs:112
msgid "This program comes with ABSOLUTELY NO WARRANTY."
msgstr "Dette program modtages UDEN NOGEN GARANTIER OVERHOVEDET."
#: ../SparkleShare/SparkleShare.cs:120
#: ../SparkleShare/SparkleShare.cs:114
msgid "This is free software, and you are welcome to redistribute it "
msgstr "Dette er fri software, og du er velkommen til at distribuere den "
#: ../SparkleShare/SparkleShare.cs:121
#: ../SparkleShare/SparkleShare.cs:115
msgid "under certain conditions. Please read the GNU GPLv3 for details."
msgstr "under visse betingelser. Læs venligst GNU GPL v3 for detaljer."
#: ../SparkleShare/SparkleShare.cs:123
#: ../SparkleShare/SparkleShare.cs:117
msgid "SparkleShare automatically syncs Git repositories in "
msgstr "SparkleShare synkroniserer automatisk Git-depoter i "
#: ../SparkleShare/SparkleShare.cs:124
#: ../SparkleShare/SparkleShare.cs:118
msgid "the ~/SparkleShare folder with their remote origins."
msgstr "mappen ~/SparkleShare med deres fjerne kilder."
#: ../SparkleShare/SparkleShare.cs:126
#: ../SparkleShare/SparkleShare.cs:120
msgid "Usage: sparkleshare [start|stop|restart] [OPTION]..."
msgstr "Anvendelse: sparkleshare [start|stop|restart] [OPTION]..."
#: ../SparkleShare/SparkleShare.cs:127
#: ../SparkleShare/SparkleShare.cs:121
msgid "Sync SparkleShare folder with remote repositories."
msgstr "Synkroniser SparkleShare-mappe med fjerndepot"
#: ../SparkleShare/SparkleShare.cs:129
#: ../SparkleShare/SparkleShare.cs:123
msgid "Arguments:"
msgstr "Argumenter:"
#: ../SparkleShare/SparkleShare.cs:139
#: ../SparkleShare/SparkleShare.cs:133
msgid "SparkleShare "
msgstr "SparkleShare "
@ -414,11 +411,11 @@ msgstr ""
msgid "Quit"
msgstr "Afslut"
#: ../SparkleShare/SparkleUI.cs:96
#: ../SparkleShare/SparkleUI.cs:99
msgid "Ouch! Mid-air collision!"
msgstr "Av! Luftkollision!"
#: ../SparkleShare/SparkleUI.cs:97
#: ../SparkleShare/SparkleUI.cs:100
msgid "Don't worry, SparkleShare made a copy of each conflicting file."
msgstr ""
"Bare rolig, SparkleShare kopierede alle filer der gav anledning til "

View file

@ -4,6 +4,7 @@
# we apologise for any incovenience this may have caused and we hope to bring them
# back in the future.
#
# <ch3f@gmx.de>, 2011.
# <yujiang.wang@ymail.com>, 2011.
# kabum <uu.kabum@gmail.com>, 2011.
# kxnop <m_leinmueller@hotmail.com>, 2011.
@ -14,31 +15,32 @@ msgid ""
msgstr ""
"Project-Id-Version: SparkleShare\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-06-17 12:09+0200\n"
"PO-Revision-Date: 2011-06-17 10:13+0000\n"
"POT-Creation-Date: 2011-06-29 11:38+0200\n"
"PO-Revision-Date: 2011-06-26 09:22+0000\n"
"Last-Translator: deejay1 <deejay1@srem.org>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: de\n"
"Plural-Forms: nplurals=2; plural=(n != 1)\n"
#: ../SparkleShare/Mac/SparkleStatusIcon.cs:338
#: ../SparkleShare/Mac/SparkleStatusIcon.cs:337
#: ../SparkleShare/SparkleIntro.cs:67 ../SparkleShare/SparkleStatusIcon.cs:345
msgid "Welcome to SparkleShare!"
msgstr "Willkommen bei SparkleShare!"
#: ../SparkleShare/Mac/SparkleStatusIcon.cs:349
#: ../SparkleShare/Mac/SparkleStatusIcon.cs:348
#: ../SparkleShare/SparkleStatusIcon.cs:357
msgid "Not everything is synced"
msgstr "Nicht alles ist synchronisiert"
#: ../SparkleShare/Mac/SparkleStatusIcon.cs:359
#: ../SparkleShare/Mac/SparkleStatusIcon.cs:358
#: ../SparkleShare/SparkleStatusIcon.cs:367
msgid "Up to date"
msgstr "Schon auf dem aktuellsten Stand."
#: ../SparkleShare/Mac/SparkleStatusIcon.cs:375
#: ../SparkleShare/Mac/SparkleStatusIcon.cs:374
#: ../SparkleShare/SparkleStatusIcon.cs:383
msgid "Syncing…"
msgstr "Abgleichen …"
@ -88,42 +90,42 @@ msgstr "_Zeige Mitwirkende"
msgid "_Visit Website"
msgstr "_Website besuchen"
#: ../SparkleShare/SparkleController.cs:422
#: ../SparkleShare/SparkleController.cs:455
msgid "ddd MMM d, yyyy"
msgstr "ddd MMM d, yyyy"
#: ../SparkleShare/SparkleController.cs:427
#: ../SparkleShare/SparkleController.cs:460
msgid "ddd MMM d"
msgstr "ddd MMM d"
#: ../SparkleShare/SparkleController.cs:629
#: ../SparkleShare/SparkleController.cs:661
#, csharp-format
msgid "added {0}"
msgstr "{0} hinzugefügt"
#: ../SparkleShare/SparkleController.cs:634
#: ../SparkleShare/SparkleController.cs:666
#, csharp-format
msgid "moved {0}"
msgstr "{0} verschoben"
#: ../SparkleShare/SparkleController.cs:639
#: ../SparkleShare/SparkleController.cs:671
#, csharp-format
msgid "edited {0}"
msgstr "{0} bearbeitet"
#: ../SparkleShare/SparkleController.cs:644
#: ../SparkleShare/SparkleController.cs:676
#, csharp-format
msgid "deleted {0}"
msgstr "{0} gelöscht"
#: ../SparkleShare/SparkleController.cs:653
#: ../SparkleShare/SparkleController.cs:685
#, csharp-format
msgid "and {0} more"
msgid_plural "and {0} more"
msgstr[0] "und {0} weitere Änderung"
msgstr[1] "und {0} weitere Änderungen"
#: ../SparkleShare/SparkleController.cs:657
#: ../SparkleShare/SparkleController.cs:689
msgid "did something magical"
msgstr "etwas magisches wurde getan"
@ -325,78 +327,74 @@ msgstr "Lernen Sie, wie Sie Ihren eigenen SparkleServer betreiben können"
#: ../SparkleShare/SparkleEventLog.cs:61
msgid "Recent Events"
msgstr ""
msgstr "Letzte Ereignisse"
#: ../SparkleShare/SparkleEventLog.cs:131
#: ../SparkleShare/SparkleEventLog.cs:150
#: ../SparkleShare/SparkleEventLog.cs:148
#: ../SparkleShare/SparkleEventLog.cs:173
msgid "All Folders"
msgstr ""
msgstr "Alle Ordner"
#: ../SparkleShare/SparkleShare.cs:56
#: ../SparkleShare/SparkleShare.cs:53
msgid "Sorry, you can't run SparkleShare with these permissions."
msgstr ""
"Entschuldigung, SparkleShare kann mit diesen Rechten nicht ausgeführt "
"werden."
#: ../SparkleShare/SparkleShare.cs:57
#: ../SparkleShare/SparkleShare.cs:54
msgid "Things would go utterly wrong."
msgstr "Alles würde völlig schief gehen."
#: ../SparkleShare/SparkleShare.cs:66
msgid "Don't show the notification icon"
msgstr "Benachrichtigungssymbol nicht anzeigen."
#: ../SparkleShare/SparkleShare.cs:67
#: ../SparkleShare/SparkleShare.cs:61
msgid "Print version information"
msgstr "Versionsinformationen anzeigen"
#: ../SparkleShare/SparkleShare.cs:68
#: ../SparkleShare/SparkleShare.cs:62
msgid "Show this help text"
msgstr "Diesen Hilfetext anzeigen"
#: ../SparkleShare/SparkleShare.cs:115
#: ../SparkleShare/SparkleShare.cs:109
msgid "SparkleShare, a collaboration and sharing tool."
msgstr "SparkleShare, ein Werkzeug für verteilte Zusammenarbeit."
#: ../SparkleShare/SparkleShare.cs:116
#: ../SparkleShare/SparkleShare.cs:110
msgid "Copyright (C) 2010 Hylke Bons"
msgstr "Copyright (C) 2010 Hylke Bons"
#: ../SparkleShare/SparkleShare.cs:118
#: ../SparkleShare/SparkleShare.cs:112
msgid "This program comes with ABSOLUTELY NO WARRANTY."
msgstr "Diese Anwendung kommt OHNE IRGENDEINE GARANTIE."
#: ../SparkleShare/SparkleShare.cs:120
#: ../SparkleShare/SparkleShare.cs:114
msgid "This is free software, and you are welcome to redistribute it "
msgstr "Dies ist freie Software, die Sie gerne weitergeben dürfen"
#: ../SparkleShare/SparkleShare.cs:121
#: ../SparkleShare/SparkleShare.cs:115
msgid "under certain conditions. Please read the GNU GPLv3 for details."
msgstr ""
"unter bestimmten Bedingungen. Bitte lesen Sie die GNU GPLv3 für weitere "
"Details."
#: ../SparkleShare/SparkleShare.cs:123
#: ../SparkleShare/SparkleShare.cs:117
msgid "SparkleShare automatically syncs Git repositories in "
msgstr "SparkleShare synchronisiert sich automatisch mit Git Repositories"
#: ../SparkleShare/SparkleShare.cs:124
#: ../SparkleShare/SparkleShare.cs:118
msgid "the ~/SparkleShare folder with their remote origins."
msgstr "den SparkleShare-Ordner mit den entfernten Quellen."
#: ../SparkleShare/SparkleShare.cs:126
#: ../SparkleShare/SparkleShare.cs:120
msgid "Usage: sparkleshare [start|stop|restart] [OPTION]..."
msgstr "Verwendung: sparkleshare [start|stop|restart] [OPTION]..."
#: ../SparkleShare/SparkleShare.cs:127
#: ../SparkleShare/SparkleShare.cs:121
msgid "Sync SparkleShare folder with remote repositories."
msgstr "SparkleShare Ordner mit dem Remote-Repository synchronisieren."
#: ../SparkleShare/SparkleShare.cs:129
#: ../SparkleShare/SparkleShare.cs:123
msgid "Arguments:"
msgstr "Parameter:"
#: ../SparkleShare/SparkleShare.cs:139
#: ../SparkleShare/SparkleShare.cs:133
msgid "SparkleShare "
msgstr "SparkleShare"
@ -411,7 +409,7 @@ msgstr "Remote-Ordner hinzufügen..."
#: ../SparkleShare/SparkleStatusIcon.cs:242
msgid "Show Recent Events"
msgstr ""
msgstr "Zeige letzte Ereignisse"
#: ../SparkleShare/SparkleStatusIcon.cs:262
msgid "Turn Notifications Off"
@ -426,11 +424,11 @@ msgstr "Benachrichtigungen aktivieren"
msgid "Quit"
msgstr "Beenden"
#: ../SparkleShare/SparkleUI.cs:96
#: ../SparkleShare/SparkleUI.cs:99
msgid "Ouch! Mid-air collision!"
msgstr "Autsch! Kollision in der Luft!"
#: ../SparkleShare/SparkleUI.cs:97
#: ../SparkleShare/SparkleUI.cs:100
msgid "Don't worry, SparkleShare made a copy of each conflicting file."
msgstr ""
"Keine Sorge, SparkleShare hat eine Kopie jeder im Konflikt stehenden Datei "

View file

@ -4,50 +4,52 @@
# we apologise for any incovenience this may have caused and we hope to bring them
# back in the future.
#
# <manolis@kapcom.gr>, 2011.
msgid ""
msgstr ""
"Project-Id-Version: SparkleShare\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-06-17 12:09+0200\n"
"PO-Revision-Date: 2011-06-17 10:13+0000\n"
"Last-Translator: deejay1 <deejay1@srem.org>\n"
"POT-Creation-Date: 2011-06-29 11:38+0200\n"
"PO-Revision-Date: 2011-07-13 19:17+0000\n"
"Last-Translator: kapcom01 <manolis@kapcom.gr>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: el\n"
"Plural-Forms: nplurals=2; plural=(n != 1)\n"
#: ../SparkleShare/Mac/SparkleStatusIcon.cs:338
#: ../SparkleShare/Mac/SparkleStatusIcon.cs:337
#: ../SparkleShare/SparkleIntro.cs:67 ../SparkleShare/SparkleStatusIcon.cs:345
msgid "Welcome to SparkleShare!"
msgstr ""
#: ../SparkleShare/Mac/SparkleStatusIcon.cs:349
#: ../SparkleShare/Mac/SparkleStatusIcon.cs:348
#: ../SparkleShare/SparkleStatusIcon.cs:357
msgid "Not everything is synced"
msgstr ""
#: ../SparkleShare/Mac/SparkleStatusIcon.cs:359
#: ../SparkleShare/Mac/SparkleStatusIcon.cs:358
#: ../SparkleShare/SparkleStatusIcon.cs:367
msgid "Up to date"
msgstr ""
#: ../SparkleShare/Mac/SparkleStatusIcon.cs:375
#: ../SparkleShare/Mac/SparkleStatusIcon.cs:374
#: ../SparkleShare/SparkleStatusIcon.cs:383
msgid "Syncing…"
msgstr ""
#: ../SparkleShare/Nautilus/sparkleshare-nautilus-extension.py.in:113
msgid "Copy Web Link"
msgstr ""
msgstr "Αντιγραφή Συνδέσμου Ιστού"
#: ../SparkleShare/Nautilus/sparkleshare-nautilus-extension.py.in:114
msgid "Copy the web address of this file to the clipboard"
msgstr ""
msgstr "Αντιγραφή της διεύθυνσης ιστού αυτού του αρχείου στο πρόχειρο"
#: ../SparkleShare/Nautilus/sparkleshare-nautilus-extension.py.in:147
msgid "Get Earlier Version"
msgstr ""
msgstr "Λήψη Προηγούμενης Έκδοσης"
#: ../SparkleShare/Nautilus/sparkleshare-nautilus-extension.py.in:148
msgid "Make a copy of an earlier version in this folder"
@ -82,42 +84,42 @@ msgstr ""
msgid "_Visit Website"
msgstr ""
#: ../SparkleShare/SparkleController.cs:422
#: ../SparkleShare/SparkleController.cs:455
msgid "ddd MMM d, yyyy"
msgstr ""
#: ../SparkleShare/SparkleController.cs:427
#: ../SparkleShare/SparkleController.cs:460
msgid "ddd MMM d"
msgstr ""
#: ../SparkleShare/SparkleController.cs:629
#: ../SparkleShare/SparkleController.cs:661
#, csharp-format
msgid "added {0}"
msgstr ""
#: ../SparkleShare/SparkleController.cs:634
#: ../SparkleShare/SparkleController.cs:666
#, csharp-format
msgid "moved {0}"
msgstr ""
#: ../SparkleShare/SparkleController.cs:639
#: ../SparkleShare/SparkleController.cs:671
#, csharp-format
msgid "edited {0}"
msgstr ""
#: ../SparkleShare/SparkleController.cs:644
#: ../SparkleShare/SparkleController.cs:676
#, csharp-format
msgid "deleted {0}"
msgstr ""
#: ../SparkleShare/SparkleController.cs:653
#: ../SparkleShare/SparkleController.cs:685
#, csharp-format
msgid "and {0} more"
msgid_plural "and {0} more"
msgstr[0] ""
msgstr[1] ""
#: ../SparkleShare/SparkleController.cs:657
#: ../SparkleShare/SparkleController.cs:689
msgid "did something magical"
msgstr ""
@ -309,72 +311,68 @@ msgstr ""
msgid "Recent Events"
msgstr ""
#: ../SparkleShare/SparkleEventLog.cs:131
#: ../SparkleShare/SparkleEventLog.cs:150
#: ../SparkleShare/SparkleEventLog.cs:148
#: ../SparkleShare/SparkleEventLog.cs:173
msgid "All Folders"
msgstr ""
#: ../SparkleShare/SparkleShare.cs:56
#: ../SparkleShare/SparkleShare.cs:53
msgid "Sorry, you can't run SparkleShare with these permissions."
msgstr ""
#: ../SparkleShare/SparkleShare.cs:57
#: ../SparkleShare/SparkleShare.cs:54
msgid "Things would go utterly wrong."
msgstr "Τα πράγματα θα πάνε πολύ άσχημα."
#: ../SparkleShare/SparkleShare.cs:66
msgid "Don't show the notification icon"
msgstr ""
#: ../SparkleShare/SparkleShare.cs:67
#: ../SparkleShare/SparkleShare.cs:61
msgid "Print version information"
msgstr ""
#: ../SparkleShare/SparkleShare.cs:68
#: ../SparkleShare/SparkleShare.cs:62
msgid "Show this help text"
msgstr ""
#: ../SparkleShare/SparkleShare.cs:115
#: ../SparkleShare/SparkleShare.cs:109
msgid "SparkleShare, a collaboration and sharing tool."
msgstr ""
#: ../SparkleShare/SparkleShare.cs:116
#: ../SparkleShare/SparkleShare.cs:110
msgid "Copyright (C) 2010 Hylke Bons"
msgstr ""
#: ../SparkleShare/SparkleShare.cs:118
#: ../SparkleShare/SparkleShare.cs:112
msgid "This program comes with ABSOLUTELY NO WARRANTY."
msgstr ""
#: ../SparkleShare/SparkleShare.cs:120
#: ../SparkleShare/SparkleShare.cs:114
msgid "This is free software, and you are welcome to redistribute it "
msgstr ""
#: ../SparkleShare/SparkleShare.cs:121
#: ../SparkleShare/SparkleShare.cs:115
msgid "under certain conditions. Please read the GNU GPLv3 for details."
msgstr ""
#: ../SparkleShare/SparkleShare.cs:123
#: ../SparkleShare/SparkleShare.cs:117
msgid "SparkleShare automatically syncs Git repositories in "
msgstr ""
#: ../SparkleShare/SparkleShare.cs:124
#: ../SparkleShare/SparkleShare.cs:118
msgid "the ~/SparkleShare folder with their remote origins."
msgstr ""
#: ../SparkleShare/SparkleShare.cs:126
#: ../SparkleShare/SparkleShare.cs:120
msgid "Usage: sparkleshare [start|stop|restart] [OPTION]..."
msgstr ""
#: ../SparkleShare/SparkleShare.cs:127
#: ../SparkleShare/SparkleShare.cs:121
msgid "Sync SparkleShare folder with remote repositories."
msgstr ""
#: ../SparkleShare/SparkleShare.cs:129
#: ../SparkleShare/SparkleShare.cs:123
msgid "Arguments:"
msgstr ""
#: ../SparkleShare/SparkleShare.cs:139
#: ../SparkleShare/SparkleShare.cs:133
msgid "SparkleShare "
msgstr ""
@ -404,11 +402,11 @@ msgstr ""
msgid "Quit"
msgstr ""
#: ../SparkleShare/SparkleUI.cs:96
#: ../SparkleShare/SparkleUI.cs:99
msgid "Ouch! Mid-air collision!"
msgstr ""
#: ../SparkleShare/SparkleUI.cs:97
#: ../SparkleShare/SparkleUI.cs:100
msgid "Don't worry, SparkleShare made a copy of each conflicting file."
msgstr ""

View file

@ -4,36 +4,38 @@
# we apologise for any incovenience this may have caused and we hope to bring them
# back in the future.
#
# <sven.koehler@student.hpi.uni-potsdam.de>, 2011.
# eliovir <eliovir@gmail.com>, 2011.
msgid ""
msgstr ""
"Project-Id-Version: SparkleShare\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-06-17 12:09+0200\n"
"PO-Revision-Date: 2011-06-17 10:13+0000\n"
"Last-Translator: deejay1 <deejay1@srem.org>\n"
"POT-Creation-Date: 2011-06-29 11:38+0200\n"
"PO-Revision-Date: 2011-07-12 21:24+0000\n"
"Last-Translator: tzwenn <sven.koehler@student.hpi.uni-potsdam.de>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: eo\n"
"Plural-Forms: nplurals=2; plural=(n != 1)\n"
#: ../SparkleShare/Mac/SparkleStatusIcon.cs:338
#: ../SparkleShare/Mac/SparkleStatusIcon.cs:337
#: ../SparkleShare/SparkleIntro.cs:67 ../SparkleShare/SparkleStatusIcon.cs:345
msgid "Welcome to SparkleShare!"
msgstr "Bonvenon ĉe SparkleShare!"
#: ../SparkleShare/Mac/SparkleStatusIcon.cs:349
#: ../SparkleShare/Mac/SparkleStatusIcon.cs:348
#: ../SparkleShare/SparkleStatusIcon.cs:357
msgid "Not everything is synced"
msgstr ""
#: ../SparkleShare/Mac/SparkleStatusIcon.cs:359
#: ../SparkleShare/Mac/SparkleStatusIcon.cs:358
#: ../SparkleShare/SparkleStatusIcon.cs:367
msgid "Up to date"
msgstr ""
#: ../SparkleShare/Mac/SparkleStatusIcon.cs:375
#: ../SparkleShare/Mac/SparkleStatusIcon.cs:374
#: ../SparkleShare/SparkleStatusIcon.cs:383
msgid "Syncing…"
msgstr ""
@ -83,42 +85,42 @@ msgstr ""
msgid "_Visit Website"
msgstr "_Viziti retejon"
#: ../SparkleShare/SparkleController.cs:422
#: ../SparkleShare/SparkleController.cs:455
msgid "ddd MMM d, yyyy"
msgstr ""
#: ../SparkleShare/SparkleController.cs:427
#: ../SparkleShare/SparkleController.cs:460
msgid "ddd MMM d"
msgstr ""
#: ../SparkleShare/SparkleController.cs:629
#: ../SparkleShare/SparkleController.cs:661
#, csharp-format
msgid "added {0}"
msgstr ""
#: ../SparkleShare/SparkleController.cs:634
#: ../SparkleShare/SparkleController.cs:666
#, csharp-format
msgid "moved {0}"
msgstr ""
#: ../SparkleShare/SparkleController.cs:639
#: ../SparkleShare/SparkleController.cs:671
#, csharp-format
msgid "edited {0}"
msgstr ""
#: ../SparkleShare/SparkleController.cs:644
#: ../SparkleShare/SparkleController.cs:676
#, csharp-format
msgid "deleted {0}"
msgstr ""
#: ../SparkleShare/SparkleController.cs:653
#: ../SparkleShare/SparkleController.cs:685
#, csharp-format
msgid "and {0} more"
msgid_plural "and {0} more"
msgstr[0] ""
msgstr[1] ""
#: ../SparkleShare/SparkleController.cs:657
#: ../SparkleShare/SparkleController.cs:689
msgid "did something magical"
msgstr ""
@ -178,7 +180,7 @@ msgstr ""
#: ../SparkleShare/SparkleIntro.cs:206
msgid "Gitorious"
msgstr ""
msgstr "Gitorious"
#: ../SparkleShare/SparkleIntro.cs:208
msgid "Completely Free as in Freedom infrastructure."
@ -210,7 +212,7 @@ msgstr "Nomo de la dosierujo"
#: ../SparkleShare/SparkleIntro.cs:269
msgid "Sync"
msgstr ""
msgstr "Sinkronigi"
#: ../SparkleShare/SparkleIntro.cs:312
msgid "Cancel"
@ -282,7 +284,7 @@ msgstr ""
#: ../SparkleShare/SparkleIntro.cs:528
#, csharp-format
msgid "Syncing folder {0}’…"
msgstr ""
msgstr "Sinkronigi dosierujon '{0}'..."
#: ../SparkleShare/SparkleIntro.cs:535
msgid "This may take a while.\n"
@ -310,72 +312,68 @@ msgstr ""
msgid "Recent Events"
msgstr ""
#: ../SparkleShare/SparkleEventLog.cs:131
#: ../SparkleShare/SparkleEventLog.cs:150
#: ../SparkleShare/SparkleEventLog.cs:148
#: ../SparkleShare/SparkleEventLog.cs:173
msgid "All Folders"
msgstr ""
msgstr "Ĉiuj dosierujoj"
#: ../SparkleShare/SparkleShare.cs:56
#: ../SparkleShare/SparkleShare.cs:53
msgid "Sorry, you can't run SparkleShare with these permissions."
msgstr ""
#: ../SparkleShare/SparkleShare.cs:57
#: ../SparkleShare/SparkleShare.cs:54
msgid "Things would go utterly wrong."
msgstr ""
#: ../SparkleShare/SparkleShare.cs:66
msgid "Don't show the notification icon"
msgstr ""
#: ../SparkleShare/SparkleShare.cs:67
#: ../SparkleShare/SparkleShare.cs:61
msgid "Print version information"
msgstr ""
#: ../SparkleShare/SparkleShare.cs:68
#: ../SparkleShare/SparkleShare.cs:62
msgid "Show this help text"
msgstr ""
#: ../SparkleShare/SparkleShare.cs:115
#: ../SparkleShare/SparkleShare.cs:109
msgid "SparkleShare, a collaboration and sharing tool."
msgstr ""
#: ../SparkleShare/SparkleShare.cs:116
#: ../SparkleShare/SparkleShare.cs:110
msgid "Copyright (C) 2010 Hylke Bons"
msgstr ""
msgstr "Kopirajto (C) 2010 Hylke Bons"
#: ../SparkleShare/SparkleShare.cs:118
#: ../SparkleShare/SparkleShare.cs:112
msgid "This program comes with ABSOLUTELY NO WARRANTY."
msgstr ""
#: ../SparkleShare/SparkleShare.cs:120
#: ../SparkleShare/SparkleShare.cs:114
msgid "This is free software, and you are welcome to redistribute it "
msgstr ""
#: ../SparkleShare/SparkleShare.cs:121
#: ../SparkleShare/SparkleShare.cs:115
msgid "under certain conditions. Please read the GNU GPLv3 for details."
msgstr ""
#: ../SparkleShare/SparkleShare.cs:123
#: ../SparkleShare/SparkleShare.cs:117
msgid "SparkleShare automatically syncs Git repositories in "
msgstr ""
#: ../SparkleShare/SparkleShare.cs:124
#: ../SparkleShare/SparkleShare.cs:118
msgid "the ~/SparkleShare folder with their remote origins."
msgstr ""
#: ../SparkleShare/SparkleShare.cs:126
#: ../SparkleShare/SparkleShare.cs:120
msgid "Usage: sparkleshare [start|stop|restart] [OPTION]..."
msgstr ""
#: ../SparkleShare/SparkleShare.cs:127
#: ../SparkleShare/SparkleShare.cs:121
msgid "Sync SparkleShare folder with remote repositories."
msgstr ""
#: ../SparkleShare/SparkleShare.cs:129
#: ../SparkleShare/SparkleShare.cs:123
msgid "Arguments:"
msgstr ""
#: ../SparkleShare/SparkleShare.cs:139
#: ../SparkleShare/SparkleShare.cs:133
msgid "SparkleShare "
msgstr ""
@ -405,11 +403,11 @@ msgstr ""
msgid "Quit"
msgstr ""
#: ../SparkleShare/SparkleUI.cs:96
#: ../SparkleShare/SparkleUI.cs:99
msgid "Ouch! Mid-air collision!"
msgstr ""
#: ../SparkleShare/SparkleUI.cs:97
#: ../SparkleShare/SparkleUI.cs:100
msgid "Don't worry, SparkleShare made a copy of each conflicting file."
msgstr ""

View file

@ -4,16 +4,15 @@
# we apologise for any incovenience this may have caused and we hope to bring them
# back in the future.
#
# <jamelrom@gmail.com>, 2011.
# <luiso.perez@gmail.com>, 2011.
# jamelrom <jamelrom@gmail.com>, 2011.
# <jamelrom@gmail.com>, 2011.
msgid ""
msgstr ""
"Project-Id-Version: SparkleShare\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-06-17 12:09+0200\n"
"PO-Revision-Date: 2011-06-17 10:13+0000\n"
"Last-Translator: deejay1 <deejay1@srem.org>\n"
"POT-Creation-Date: 2011-06-29 11:38+0200\n"
"PO-Revision-Date: 2011-07-01 09:30+0000\n"
"Last-Translator: jamelrom <jamelrom@gmail.com>\n"
"Language-Team: Spanish (Castilian) (http://www.transifex.net/projects/p/sparkleshare/team/es/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@ -21,22 +20,22 @@ msgstr ""
"Language: es\n"
"Plural-Forms: nplurals=2; plural=(n != 1)\n"
#: ../SparkleShare/Mac/SparkleStatusIcon.cs:338
#: ../SparkleShare/Mac/SparkleStatusIcon.cs:337
#: ../SparkleShare/SparkleIntro.cs:67 ../SparkleShare/SparkleStatusIcon.cs:345
msgid "Welcome to SparkleShare!"
msgstr "¡Bienvenido a SparkleShare!"
#: ../SparkleShare/Mac/SparkleStatusIcon.cs:349
#: ../SparkleShare/Mac/SparkleStatusIcon.cs:348
#: ../SparkleShare/SparkleStatusIcon.cs:357
msgid "Not everything is synced"
msgstr "Pendiente de sincronizar"
#: ../SparkleShare/Mac/SparkleStatusIcon.cs:359
#: ../SparkleShare/Mac/SparkleStatusIcon.cs:358
#: ../SparkleShare/SparkleStatusIcon.cs:367
msgid "Up to date"
msgstr "Actualizado"
#: ../SparkleShare/Mac/SparkleStatusIcon.cs:375
#: ../SparkleShare/Mac/SparkleStatusIcon.cs:374
#: ../SparkleShare/SparkleStatusIcon.cs:383
msgid "Syncing…"
msgstr "Sincronizando..."
@ -86,42 +85,42 @@ msgstr "_Autores"
msgid "_Visit Website"
msgstr "_Visitar Página Web"
#: ../SparkleShare/SparkleController.cs:422
#: ../SparkleShare/SparkleController.cs:455
msgid "ddd MMM d, yyyy"
msgstr "d. ddd MMMM yyyy"
#: ../SparkleShare/SparkleController.cs:427
#: ../SparkleShare/SparkleController.cs:460
msgid "ddd MMM d"
msgstr "d. ddd MMM"
#: ../SparkleShare/SparkleController.cs:629
#: ../SparkleShare/SparkleController.cs:661
#, csharp-format
msgid "added {0}"
msgstr "añadido '{0}'"
#: ../SparkleShare/SparkleController.cs:634
#: ../SparkleShare/SparkleController.cs:666
#, csharp-format
msgid "moved {0}"
msgstr "movido '{0}'"
#: ../SparkleShare/SparkleController.cs:639
#: ../SparkleShare/SparkleController.cs:671
#, csharp-format
msgid "edited {0}"
msgstr "editado '{0}'"
#: ../SparkleShare/SparkleController.cs:644
#: ../SparkleShare/SparkleController.cs:676
#, csharp-format
msgid "deleted {0}"
msgstr "eliminado '{0}'"
#: ../SparkleShare/SparkleController.cs:653
#: ../SparkleShare/SparkleController.cs:685
#, csharp-format
msgid "and {0} more"
msgid_plural "and {0} more"
msgstr[0] "y {0} más"
msgstr[1] "y {0} más"
#: ../SparkleShare/SparkleController.cs:657
#: ../SparkleShare/SparkleController.cs:689
msgid "did something magical"
msgstr "algo mágico ocurrió"
@ -324,75 +323,71 @@ msgstr "Aprenda como hospedar su propio SparkleServer"
#: ../SparkleShare/SparkleEventLog.cs:61
msgid "Recent Events"
msgstr ""
msgstr "Eventos recientes"
#: ../SparkleShare/SparkleEventLog.cs:131
#: ../SparkleShare/SparkleEventLog.cs:150
#: ../SparkleShare/SparkleEventLog.cs:148
#: ../SparkleShare/SparkleEventLog.cs:173
msgid "All Folders"
msgstr ""
msgstr "Todas las carpetas"
#: ../SparkleShare/SparkleShare.cs:56
#: ../SparkleShare/SparkleShare.cs:53
msgid "Sorry, you can't run SparkleShare with these permissions."
msgstr "Perdón, no puede ejecutar SparkleShare con estos permisos."
#: ../SparkleShare/SparkleShare.cs:57
#: ../SparkleShare/SparkleShare.cs:54
msgid "Things would go utterly wrong."
msgstr "Las cosas irían absolutamente mal."
#: ../SparkleShare/SparkleShare.cs:66
msgid "Don't show the notification icon"
msgstr "No mostrar el icono de notificaciones"
#: ../SparkleShare/SparkleShare.cs:67
#: ../SparkleShare/SparkleShare.cs:61
msgid "Print version information"
msgstr "Muestra la información de la versión"
#: ../SparkleShare/SparkleShare.cs:68
#: ../SparkleShare/SparkleShare.cs:62
msgid "Show this help text"
msgstr "Mostrar este texto de ayuda"
#: ../SparkleShare/SparkleShare.cs:115
#: ../SparkleShare/SparkleShare.cs:109
msgid "SparkleShare, a collaboration and sharing tool."
msgstr "SparkleShare, una herramienta de compartición y colaboración"
#: ../SparkleShare/SparkleShare.cs:116
#: ../SparkleShare/SparkleShare.cs:110
msgid "Copyright (C) 2010 Hylke Bons"
msgstr "Copyright (C) 2010 Hylke Bons"
#: ../SparkleShare/SparkleShare.cs:118
#: ../SparkleShare/SparkleShare.cs:112
msgid "This program comes with ABSOLUTELY NO WARRANTY."
msgstr "Este programa viene SIN NINGUNA GARANTÍA."
#: ../SparkleShare/SparkleShare.cs:120
#: ../SparkleShare/SparkleShare.cs:114
msgid "This is free software, and you are welcome to redistribute it "
msgstr "Esto es software libre, y esta invitado a redistribuirlo"
#: ../SparkleShare/SparkleShare.cs:121
#: ../SparkleShare/SparkleShare.cs:115
msgid "under certain conditions. Please read the GNU GPLv3 for details."
msgstr ""
"bajo determinadas condiciones. Por favor lea la GNU GPLv3 para más detalles."
#: ../SparkleShare/SparkleShare.cs:123
#: ../SparkleShare/SparkleShare.cs:117
msgid "SparkleShare automatically syncs Git repositories in "
msgstr "SparkleShare sincroniza automaticamente repositorios Git en "
#: ../SparkleShare/SparkleShare.cs:124
#: ../SparkleShare/SparkleShare.cs:118
msgid "the ~/SparkleShare folder with their remote origins."
msgstr "La carpeta ~/SparkleShare con su origen remoto."
#: ../SparkleShare/SparkleShare.cs:126
#: ../SparkleShare/SparkleShare.cs:120
msgid "Usage: sparkleshare [start|stop|restart] [OPTION]..."
msgstr "Uso: sparkleshare [start|stop|restart] [OPCION]..."
#: ../SparkleShare/SparkleShare.cs:127
#: ../SparkleShare/SparkleShare.cs:121
msgid "Sync SparkleShare folder with remote repositories."
msgstr "Sincronizar carpeta SparkleShare con el repositorio remoto."
#: ../SparkleShare/SparkleShare.cs:129
#: ../SparkleShare/SparkleShare.cs:123
msgid "Arguments:"
msgstr "Parámetros:"
#: ../SparkleShare/SparkleShare.cs:139
#: ../SparkleShare/SparkleShare.cs:133
msgid "SparkleShare "
msgstr "SparkleShare"
@ -407,7 +402,7 @@ msgstr "Añadir carpeta remota..."
#: ../SparkleShare/SparkleStatusIcon.cs:242
msgid "Show Recent Events"
msgstr ""
msgstr "Mostrar eventos recientes"
#: ../SparkleShare/SparkleStatusIcon.cs:262
msgid "Turn Notifications Off"
@ -422,11 +417,11 @@ msgstr "Activar las notificaciones"
msgid "Quit"
msgstr "Salir"
#: ../SparkleShare/SparkleUI.cs:96
#: ../SparkleShare/SparkleUI.cs:99
msgid "Ouch! Mid-air collision!"
msgstr "¡Ohh! ¡Hay una colisión!"
#: ../SparkleShare/SparkleUI.cs:97
#: ../SparkleShare/SparkleUI.cs:100
msgid "Don't worry, SparkleShare made a copy of each conflicting file."
msgstr ""
"No se preocupe, SparkleShare hace una copia de cada archivo en conflicto."

View file

@ -11,31 +11,32 @@ msgid ""
msgstr ""
"Project-Id-Version: SparkleShare\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-06-17 12:09+0200\n"
"PO-Revision-Date: 2011-06-17 10:13+0000\n"
"POT-Creation-Date: 2011-06-29 11:38+0200\n"
"PO-Revision-Date: 2011-06-26 09:22+0000\n"
"Last-Translator: deejay1 <deejay1@srem.org>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: fi\n"
"Plural-Forms: nplurals=2; plural=(n != 1)\n"
#: ../SparkleShare/Mac/SparkleStatusIcon.cs:338
#: ../SparkleShare/Mac/SparkleStatusIcon.cs:337
#: ../SparkleShare/SparkleIntro.cs:67 ../SparkleShare/SparkleStatusIcon.cs:345
msgid "Welcome to SparkleShare!"
msgstr "Tervetuloa SparkleShareen!"
#: ../SparkleShare/Mac/SparkleStatusIcon.cs:349
#: ../SparkleShare/Mac/SparkleStatusIcon.cs:348
#: ../SparkleShare/SparkleStatusIcon.cs:357
msgid "Not everything is synced"
msgstr "Kaikkea ei ole synkronoitu"
#: ../SparkleShare/Mac/SparkleStatusIcon.cs:359
#: ../SparkleShare/Mac/SparkleStatusIcon.cs:358
#: ../SparkleShare/SparkleStatusIcon.cs:367
msgid "Up to date"
msgstr "Ajantasalla"
#: ../SparkleShare/Mac/SparkleStatusIcon.cs:375
#: ../SparkleShare/Mac/SparkleStatusIcon.cs:374
#: ../SparkleShare/SparkleStatusIcon.cs:383
msgid "Syncing…"
msgstr "Synkronoidaan..."
@ -85,42 +86,42 @@ msgstr "_Näytä osallistujat"
msgid "_Visit Website"
msgstr "_Käy nettisivulla"
#: ../SparkleShare/SparkleController.cs:422
#: ../SparkleShare/SparkleController.cs:455
msgid "ddd MMM d, yyyy"
msgstr "ppp kkk d, vvvv"
#: ../SparkleShare/SparkleController.cs:427
#: ../SparkleShare/SparkleController.cs:460
msgid "ddd MMM d"
msgstr "ppp kkk d"
#: ../SparkleShare/SparkleController.cs:629
#: ../SparkleShare/SparkleController.cs:661
#, csharp-format
msgid "added {0}"
msgstr "lisätty '{0}'"
#: ../SparkleShare/SparkleController.cs:634
#: ../SparkleShare/SparkleController.cs:666
#, csharp-format
msgid "moved {0}"
msgstr "siirrettiin '{0}'"
#: ../SparkleShare/SparkleController.cs:639
#: ../SparkleShare/SparkleController.cs:671
#, csharp-format
msgid "edited {0}"
msgstr "muokattu '{0}'"
#: ../SparkleShare/SparkleController.cs:644
#: ../SparkleShare/SparkleController.cs:676
#, csharp-format
msgid "deleted {0}"
msgstr "poistettu '{0}'"
#: ../SparkleShare/SparkleController.cs:653
#: ../SparkleShare/SparkleController.cs:685
#, csharp-format
msgid "and {0} more"
msgid_plural "and {0} more"
msgstr[0] ""
msgstr[1] ""
#: ../SparkleShare/SparkleController.cs:657
#: ../SparkleShare/SparkleController.cs:689
msgid "did something magical"
msgstr "teki jotain maagista"
@ -319,72 +320,68 @@ msgstr "Selvitä, kuinka voit pitää omaa SparkleServer-palvelinta"
msgid "Recent Events"
msgstr ""
#: ../SparkleShare/SparkleEventLog.cs:131
#: ../SparkleShare/SparkleEventLog.cs:150
#: ../SparkleShare/SparkleEventLog.cs:148
#: ../SparkleShare/SparkleEventLog.cs:173
msgid "All Folders"
msgstr ""
#: ../SparkleShare/SparkleShare.cs:56
#: ../SparkleShare/SparkleShare.cs:53
msgid "Sorry, you can't run SparkleShare with these permissions."
msgstr "Et voi ajaa SparkleSharea näillä oikeuksilla."
#: ../SparkleShare/SparkleShare.cs:57
#: ../SparkleShare/SparkleShare.cs:54
msgid "Things would go utterly wrong."
msgstr "Asiat menevät paljon pieleen."
#: ../SparkleShare/SparkleShare.cs:66
msgid "Don't show the notification icon"
msgstr "Älä näytä huomautusikonia"
#: ../SparkleShare/SparkleShare.cs:67
#: ../SparkleShare/SparkleShare.cs:61
msgid "Print version information"
msgstr "Tulosta versiotiedot"
#: ../SparkleShare/SparkleShare.cs:68
#: ../SparkleShare/SparkleShare.cs:62
msgid "Show this help text"
msgstr "Näytä tämä ohjeteksti"
#: ../SparkleShare/SparkleShare.cs:115
#: ../SparkleShare/SparkleShare.cs:109
msgid "SparkleShare, a collaboration and sharing tool."
msgstr "SparkleShare, yhteistyö- ja jakotyökalu."
#: ../SparkleShare/SparkleShare.cs:116
#: ../SparkleShare/SparkleShare.cs:110
msgid "Copyright (C) 2010 Hylke Bons"
msgstr "Copyright (C) 2010 Hylke Bons"
#: ../SparkleShare/SparkleShare.cs:118
#: ../SparkleShare/SparkleShare.cs:112
msgid "This program comes with ABSOLUTELY NO WARRANTY."
msgstr "Tällä ohjelmalla EI OLE TAKUUTA."
#: ../SparkleShare/SparkleShare.cs:120
#: ../SparkleShare/SparkleShare.cs:114
msgid "This is free software, and you are welcome to redistribute it "
msgstr "Tämä on vapaa ohjelma, ja saat vapaasti levittää sitä"
#: ../SparkleShare/SparkleShare.cs:121
#: ../SparkleShare/SparkleShare.cs:115
msgid "under certain conditions. Please read the GNU GPLv3 for details."
msgstr "tietyin ehdoin. Saat lisätietoja GNU GPLv3:sta."
#: ../SparkleShare/SparkleShare.cs:123
#: ../SparkleShare/SparkleShare.cs:117
msgid "SparkleShare automatically syncs Git repositories in "
msgstr "SparkleShare synkronoi automaattisesti Git-tietokannat"
#: ../SparkleShare/SparkleShare.cs:124
#: ../SparkleShare/SparkleShare.cs:118
msgid "the ~/SparkleShare folder with their remote origins."
msgstr "~/SparkleShare-kansiosta etäpalvelinten kanssa."
#: ../SparkleShare/SparkleShare.cs:126
#: ../SparkleShare/SparkleShare.cs:120
msgid "Usage: sparkleshare [start|stop|restart] [OPTION]..."
msgstr "Käyttö: sparkleshare [start|stop|restart] [asetukset]"
#: ../SparkleShare/SparkleShare.cs:127
#: ../SparkleShare/SparkleShare.cs:121
msgid "Sync SparkleShare folder with remote repositories."
msgstr "Synkronoi SparkleShare-kansio etätietokantoihin."
#: ../SparkleShare/SparkleShare.cs:129
#: ../SparkleShare/SparkleShare.cs:123
msgid "Arguments:"
msgstr "Parametrit:"
#: ../SparkleShare/SparkleShare.cs:139
#: ../SparkleShare/SparkleShare.cs:133
msgid "SparkleShare "
msgstr "SparkleShare"
@ -414,11 +411,11 @@ msgstr "Ota ilmoitukset käyttöön"
msgid "Quit"
msgstr "Lopeta"
#: ../SparkleShare/SparkleUI.cs:96
#: ../SparkleShare/SparkleUI.cs:99
msgid "Ouch! Mid-air collision!"
msgstr "Auts! Törmäys!"
#: ../SparkleShare/SparkleUI.cs:97
#: ../SparkleShare/SparkleUI.cs:100
msgid "Don't worry, SparkleShare made a copy of each conflicting file."
msgstr ""
"Ei huolta, SparkleShare teki kopion kaikista tiedostoista, joissa on "

View file

@ -12,31 +12,32 @@ msgid ""
msgstr ""
"Project-Id-Version: SparkleShare\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-06-17 12:09+0200\n"
"PO-Revision-Date: 2011-06-20 09:05+0000\n"
"Last-Translator: barliguy <from-transifex@arliguy.net>\n"
"POT-Creation-Date: 2011-06-29 11:38+0200\n"
"PO-Revision-Date: 2011-06-26 09:22+0000\n"
"Last-Translator: deejay1 <deejay1@srem.org>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: fr\n"
"Plural-Forms: nplurals=2; plural=(n > 1)\n"
#: ../SparkleShare/Mac/SparkleStatusIcon.cs:338
#: ../SparkleShare/Mac/SparkleStatusIcon.cs:337
#: ../SparkleShare/SparkleIntro.cs:67 ../SparkleShare/SparkleStatusIcon.cs:345
msgid "Welcome to SparkleShare!"
msgstr "Bienvenue sur SparkleShare !"
#: ../SparkleShare/Mac/SparkleStatusIcon.cs:349
#: ../SparkleShare/Mac/SparkleStatusIcon.cs:348
#: ../SparkleShare/SparkleStatusIcon.cs:357
msgid "Not everything is synced"
msgstr "Tout n'est pas synchronisé"
#: ../SparkleShare/Mac/SparkleStatusIcon.cs:359
#: ../SparkleShare/Mac/SparkleStatusIcon.cs:358
#: ../SparkleShare/SparkleStatusIcon.cs:367
msgid "Up to date"
msgstr "À jour"
#: ../SparkleShare/Mac/SparkleStatusIcon.cs:375
#: ../SparkleShare/Mac/SparkleStatusIcon.cs:374
#: ../SparkleShare/SparkleStatusIcon.cs:383
msgid "Syncing…"
msgstr "Synchronisation en cours…"
@ -86,42 +87,42 @@ msgstr "_Afficher les crédits"
msgid "_Visit Website"
msgstr "_Visiter le site web"
#: ../SparkleShare/SparkleController.cs:422
#: ../SparkleShare/SparkleController.cs:455
msgid "ddd MMM d, yyyy"
msgstr "ddd d MMM yyyy"
#: ../SparkleShare/SparkleController.cs:427
#: ../SparkleShare/SparkleController.cs:460
msgid "ddd MMM d"
msgstr "ddd d MMM"
#: ../SparkleShare/SparkleController.cs:629
#: ../SparkleShare/SparkleController.cs:661
#, csharp-format
msgid "added {0}"
msgstr "Ajouté : « {0} »"
#: ../SparkleShare/SparkleController.cs:634
#: ../SparkleShare/SparkleController.cs:666
#, csharp-format
msgid "moved {0}"
msgstr "Déplacé : « {0} »"
#: ../SparkleShare/SparkleController.cs:639
#: ../SparkleShare/SparkleController.cs:671
#, csharp-format
msgid "edited {0}"
msgstr "Edité : « {0} »"
#: ../SparkleShare/SparkleController.cs:644
#: ../SparkleShare/SparkleController.cs:676
#, csharp-format
msgid "deleted {0}"
msgstr "Supprimé : « {0} »"
#: ../SparkleShare/SparkleController.cs:653
#: ../SparkleShare/SparkleController.cs:685
#, csharp-format
msgid "and {0} more"
msgid_plural "and {0} more"
msgstr[0] "et {0} de plus"
msgstr[1] "et {0} de plus"
#: ../SparkleShare/SparkleController.cs:657
#: ../SparkleShare/SparkleController.cs:689
msgid "did something magical"
msgstr "quelque chose de magique s'est passé"
@ -329,76 +330,72 @@ msgstr "Apprendre à héberger son propre serveur SparkleServer"
msgid "Recent Events"
msgstr "Évènements récents"
#: ../SparkleShare/SparkleEventLog.cs:131
#: ../SparkleShare/SparkleEventLog.cs:150
#: ../SparkleShare/SparkleEventLog.cs:148
#: ../SparkleShare/SparkleEventLog.cs:173
msgid "All Folders"
msgstr "Tous les dossiers"
#: ../SparkleShare/SparkleShare.cs:56
#: ../SparkleShare/SparkleShare.cs:53
msgid "Sorry, you can't run SparkleShare with these permissions."
msgstr ""
"Désolé, vous ne disposez pas des autorisations nécessaires pour lancer "
"SparkleShare."
#: ../SparkleShare/SparkleShare.cs:57
#: ../SparkleShare/SparkleShare.cs:54
msgid "Things would go utterly wrong."
msgstr "Les choses pourraient très mal tourner."
#: ../SparkleShare/SparkleShare.cs:66
msgid "Don't show the notification icon"
msgstr "Masquer licône de notification"
#: ../SparkleShare/SparkleShare.cs:67
#: ../SparkleShare/SparkleShare.cs:61
msgid "Print version information"
msgstr "Affiche les informations de la version"
#: ../SparkleShare/SparkleShare.cs:68
#: ../SparkleShare/SparkleShare.cs:62
msgid "Show this help text"
msgstr "Afficher ce texte daide"
#: ../SparkleShare/SparkleShare.cs:115
#: ../SparkleShare/SparkleShare.cs:109
msgid "SparkleShare, a collaboration and sharing tool."
msgstr "SparkleShare, outils de collaboration et de partage"
#: ../SparkleShare/SparkleShare.cs:116
#: ../SparkleShare/SparkleShare.cs:110
msgid "Copyright (C) 2010 Hylke Bons"
msgstr "Copyright (C) 2010 Hylke Bons"
#: ../SparkleShare/SparkleShare.cs:118
#: ../SparkleShare/SparkleShare.cs:112
msgid "This program comes with ABSOLUTELY NO WARRANTY."
msgstr "Ce logiciel est diffusé sans AUCUNE GARANTIE."
#: ../SparkleShare/SparkleShare.cs:120
#: ../SparkleShare/SparkleShare.cs:114
msgid "This is free software, and you are welcome to redistribute it "
msgstr "Ce logiciel est libre et vous êtes invité à le redistribuer "
#: ../SparkleShare/SparkleShare.cs:121
#: ../SparkleShare/SparkleShare.cs:115
msgid "under certain conditions. Please read the GNU GPLv3 for details."
msgstr ""
"sous certaines conditions. Merci de lire la licence GNU GPLv3 pour de plus "
"amples informations."
#: ../SparkleShare/SparkleShare.cs:123
#: ../SparkleShare/SparkleShare.cs:117
msgid "SparkleShare automatically syncs Git repositories in "
msgstr "SparkleShare synchronise automatiquement les dépôts Git dans "
#: ../SparkleShare/SparkleShare.cs:124
#: ../SparkleShare/SparkleShare.cs:118
msgid "the ~/SparkleShare folder with their remote origins."
msgstr "le dossier ~/SparkleShare avec leurs racines distantes."
#: ../SparkleShare/SparkleShare.cs:126
#: ../SparkleShare/SparkleShare.cs:120
msgid "Usage: sparkleshare [start|stop|restart] [OPTION]..."
msgstr "Utilisation : sparkleshare [start|stop|restart] [OPTION]…"
#: ../SparkleShare/SparkleShare.cs:127
#: ../SparkleShare/SparkleShare.cs:121
msgid "Sync SparkleShare folder with remote repositories."
msgstr "Synchroniser le dossier SparkleShare avec les dépôts distants."
#: ../SparkleShare/SparkleShare.cs:129
#: ../SparkleShare/SparkleShare.cs:123
msgid "Arguments:"
msgstr "Paramètres :"
#: ../SparkleShare/SparkleShare.cs:139
#: ../SparkleShare/SparkleShare.cs:133
msgid "SparkleShare "
msgstr "SparkleShare"
@ -428,11 +425,11 @@ msgstr "Activer les notifications"
msgid "Quit"
msgstr "Quitter"
#: ../SparkleShare/SparkleUI.cs:96
#: ../SparkleShare/SparkleUI.cs:99
msgid "Ouch! Mid-air collision!"
msgstr "Outch ! Collision en plein ciel !"
#: ../SparkleShare/SparkleUI.cs:97
#: ../SparkleShare/SparkleUI.cs:100
msgid "Don't worry, SparkleShare made a copy of each conflicting file."
msgstr ""
"Ne vous inquiétez pas, SparkleShare a effectué une copie de chacun des "

View file

@ -8,31 +8,32 @@ msgid ""
msgstr ""
"Project-Id-Version: SparkleShare\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-06-17 12:09+0200\n"
"PO-Revision-Date: 2011-06-17 10:13+0000\n"
"POT-Creation-Date: 2011-06-29 11:38+0200\n"
"PO-Revision-Date: 2011-06-26 09:22+0000\n"
"Last-Translator: deejay1 <deejay1@srem.org>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: he\n"
"Plural-Forms: nplurals=2; plural=(n != 1)\n"
#: ../SparkleShare/Mac/SparkleStatusIcon.cs:338
#: ../SparkleShare/Mac/SparkleStatusIcon.cs:337
#: ../SparkleShare/SparkleIntro.cs:67 ../SparkleShare/SparkleStatusIcon.cs:345
msgid "Welcome to SparkleShare!"
msgstr "ברוכים הבאים לספארקלשר!"
#: ../SparkleShare/Mac/SparkleStatusIcon.cs:349
#: ../SparkleShare/Mac/SparkleStatusIcon.cs:348
#: ../SparkleShare/SparkleStatusIcon.cs:357
msgid "Not everything is synced"
msgstr "לא הכל מסונכרן"
#: ../SparkleShare/Mac/SparkleStatusIcon.cs:359
#: ../SparkleShare/Mac/SparkleStatusIcon.cs:358
#: ../SparkleShare/SparkleStatusIcon.cs:367
msgid "Up to date"
msgstr "מעודכן"
#: ../SparkleShare/Mac/SparkleStatusIcon.cs:375
#: ../SparkleShare/Mac/SparkleStatusIcon.cs:374
#: ../SparkleShare/SparkleStatusIcon.cs:383
msgid "Syncing…"
msgstr "מסנכרן..."
@ -82,42 +83,42 @@ msgstr ""
msgid "_Visit Website"
msgstr "_בקר באתר"
#: ../SparkleShare/SparkleController.cs:422
#: ../SparkleShare/SparkleController.cs:455
msgid "ddd MMM d, yyyy"
msgstr ""
#: ../SparkleShare/SparkleController.cs:427
#: ../SparkleShare/SparkleController.cs:460
msgid "ddd MMM d"
msgstr ""
#: ../SparkleShare/SparkleController.cs:629
#: ../SparkleShare/SparkleController.cs:661
#, csharp-format
msgid "added {0}"
msgstr "הוסף {0}"
#: ../SparkleShare/SparkleController.cs:634
#: ../SparkleShare/SparkleController.cs:666
#, csharp-format
msgid "moved {0}"
msgstr ""
#: ../SparkleShare/SparkleController.cs:639
#: ../SparkleShare/SparkleController.cs:671
#, csharp-format
msgid "edited {0}"
msgstr "נערך {0}"
#: ../SparkleShare/SparkleController.cs:644
#: ../SparkleShare/SparkleController.cs:676
#, csharp-format
msgid "deleted {0}"
msgstr "נמחק {0}"
#: ../SparkleShare/SparkleController.cs:653
#: ../SparkleShare/SparkleController.cs:685
#, csharp-format
msgid "and {0} more"
msgid_plural "and {0} more"
msgstr[0] ""
msgstr[1] ""
#: ../SparkleShare/SparkleController.cs:657
#: ../SparkleShare/SparkleController.cs:689
msgid "did something magical"
msgstr ""
@ -312,72 +313,68 @@ msgstr "למד איך להקים שרת אכסון, ספארקלסרבר (Sparkl
msgid "Recent Events"
msgstr ""
#: ../SparkleShare/SparkleEventLog.cs:131
#: ../SparkleShare/SparkleEventLog.cs:150
#: ../SparkleShare/SparkleEventLog.cs:148
#: ../SparkleShare/SparkleEventLog.cs:173
msgid "All Folders"
msgstr ""
#: ../SparkleShare/SparkleShare.cs:56
#: ../SparkleShare/SparkleShare.cs:53
msgid "Sorry, you can't run SparkleShare with these permissions."
msgstr "מצטערים, אך אינך יכול להריץ ספארקלשר עם ההרשאות האלה."
#: ../SparkleShare/SparkleShare.cs:57
#: ../SparkleShare/SparkleShare.cs:54
msgid "Things would go utterly wrong."
msgstr "דברים בלתי תקינים עשויים לקרות."
#: ../SparkleShare/SparkleShare.cs:66
msgid "Don't show the notification icon"
msgstr "אל תראה את סמל ההתרעה"
#: ../SparkleShare/SparkleShare.cs:67
#: ../SparkleShare/SparkleShare.cs:61
msgid "Print version information"
msgstr "מידע גרסת ההדפסה"
#: ../SparkleShare/SparkleShare.cs:68
#: ../SparkleShare/SparkleShare.cs:62
msgid "Show this help text"
msgstr "הראה את מלל העזרה"
#: ../SparkleShare/SparkleShare.cs:115
#: ../SparkleShare/SparkleShare.cs:109
msgid "SparkleShare, a collaboration and sharing tool."
msgstr ""
#: ../SparkleShare/SparkleShare.cs:116
#: ../SparkleShare/SparkleShare.cs:110
msgid "Copyright (C) 2010 Hylke Bons"
msgstr "זכויות שמורות (C) 2010 Hylke Bons"
#: ../SparkleShare/SparkleShare.cs:118
#: ../SparkleShare/SparkleShare.cs:112
msgid "This program comes with ABSOLUTELY NO WARRANTY."
msgstr "תוכנה זו באה ללא כל אחריות."
#: ../SparkleShare/SparkleShare.cs:120
#: ../SparkleShare/SparkleShare.cs:114
msgid "This is free software, and you are welcome to redistribute it "
msgstr "תוכנה זו הינה חופשית ואתם מוזמנים להפיצה"
#: ../SparkleShare/SparkleShare.cs:121
#: ../SparkleShare/SparkleShare.cs:115
msgid "under certain conditions. Please read the GNU GPLv3 for details."
msgstr "תחת תנאים מסויימים. אנא קראו את רשיון GNU GPLv3 לקבלת פרטים."
#: ../SparkleShare/SparkleShare.cs:123
#: ../SparkleShare/SparkleShare.cs:117
msgid "SparkleShare automatically syncs Git repositories in "
msgstr ""
#: ../SparkleShare/SparkleShare.cs:124
#: ../SparkleShare/SparkleShare.cs:118
msgid "the ~/SparkleShare folder with their remote origins."
msgstr ""
#: ../SparkleShare/SparkleShare.cs:126
#: ../SparkleShare/SparkleShare.cs:120
msgid "Usage: sparkleshare [start|stop|restart] [OPTION]..."
msgstr "שימוש: sparkleshare [start|stop|restart] [אפשרויות]..."
#: ../SparkleShare/SparkleShare.cs:127
#: ../SparkleShare/SparkleShare.cs:121
msgid "Sync SparkleShare folder with remote repositories."
msgstr "סנכרן תקיית ספארקלשר עם מאגרים מרוחקים."
#: ../SparkleShare/SparkleShare.cs:129
#: ../SparkleShare/SparkleShare.cs:123
msgid "Arguments:"
msgstr "ארגומנטים:"
#: ../SparkleShare/SparkleShare.cs:139
#: ../SparkleShare/SparkleShare.cs:133
msgid "SparkleShare "
msgstr "ספארקלשר"
@ -407,11 +404,11 @@ msgstr ""
msgid "Quit"
msgstr "צא"
#: ../SparkleShare/SparkleUI.cs:96
#: ../SparkleShare/SparkleUI.cs:99
msgid "Ouch! Mid-air collision!"
msgstr "איה! התנגשות באמצע ההעברה!"
#: ../SparkleShare/SparkleUI.cs:97
#: ../SparkleShare/SparkleUI.cs:100
msgid "Don't worry, SparkleShare made a copy of each conflicting file."
msgstr "אל דאגה, ספארקלשר יצר העתק של כל אחד מהקבצים הסותרים (השונים)"

View file

@ -9,31 +9,32 @@ msgid ""
msgstr ""
"Project-Id-Version: SparkleShare\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-06-17 12:09+0200\n"
"PO-Revision-Date: 2011-06-17 10:13+0000\n"
"POT-Creation-Date: 2011-06-29 11:38+0200\n"
"PO-Revision-Date: 2011-06-26 09:22+0000\n"
"Last-Translator: deejay1 <deejay1@srem.org>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: hu\n"
"Plural-Forms: nplurals=2; plural=(n != 1)\n"
#: ../SparkleShare/Mac/SparkleStatusIcon.cs:338
#: ../SparkleShare/Mac/SparkleStatusIcon.cs:337
#: ../SparkleShare/SparkleIntro.cs:67 ../SparkleShare/SparkleStatusIcon.cs:345
msgid "Welcome to SparkleShare!"
msgstr "Üdvözli a SparkleShare!"
#: ../SparkleShare/Mac/SparkleStatusIcon.cs:349
#: ../SparkleShare/Mac/SparkleStatusIcon.cs:348
#: ../SparkleShare/SparkleStatusIcon.cs:357
msgid "Not everything is synced"
msgstr "Nincs minden szinkronizálva"
#: ../SparkleShare/Mac/SparkleStatusIcon.cs:359
#: ../SparkleShare/Mac/SparkleStatusIcon.cs:358
#: ../SparkleShare/SparkleStatusIcon.cs:367
msgid "Up to date"
msgstr "Naprakész"
#: ../SparkleShare/Mac/SparkleStatusIcon.cs:375
#: ../SparkleShare/Mac/SparkleStatusIcon.cs:374
#: ../SparkleShare/SparkleStatusIcon.cs:383
msgid "Syncing…"
msgstr "Szinkronizálás..."
@ -83,42 +84,42 @@ msgstr "Szerzői névsor megjelenítése"
msgid "_Visit Website"
msgstr "Weboldal meglátogatása"
#: ../SparkleShare/SparkleController.cs:422
#: ../SparkleShare/SparkleController.cs:455
msgid "ddd MMM d, yyyy"
msgstr "ddd MMM d, yyyy"
#: ../SparkleShare/SparkleController.cs:427
#: ../SparkleShare/SparkleController.cs:460
msgid "ddd MMM d"
msgstr "ddd MMM d"
#: ../SparkleShare/SparkleController.cs:629
#: ../SparkleShare/SparkleController.cs:661
#, csharp-format
msgid "added {0}"
msgstr "hozzáadva '{0}'"
#: ../SparkleShare/SparkleController.cs:634
#: ../SparkleShare/SparkleController.cs:666
#, csharp-format
msgid "moved {0}"
msgstr "elmozgatva '{0}'"
#: ../SparkleShare/SparkleController.cs:639
#: ../SparkleShare/SparkleController.cs:671
#, csharp-format
msgid "edited {0}"
msgstr "szerkesztve '{0}'"
#: ../SparkleShare/SparkleController.cs:644
#: ../SparkleShare/SparkleController.cs:676
#, csharp-format
msgid "deleted {0}"
msgstr "törölve '{0}'"
#: ../SparkleShare/SparkleController.cs:653
#: ../SparkleShare/SparkleController.cs:685
#, csharp-format
msgid "and {0} more"
msgid_plural "and {0} more"
msgstr[0] "és {0} további"
msgstr[1] "és {0} továbbiak"
#: ../SparkleShare/SparkleController.cs:657
#: ../SparkleShare/SparkleController.cs:689
msgid "did something magical"
msgstr "valami varázslatosat tett"
@ -321,75 +322,71 @@ msgstr "Ismerje meg, hogyan tarthat saját SparkleServer-t"
#: ../SparkleShare/SparkleEventLog.cs:61
msgid "Recent Events"
msgstr ""
msgstr "Utóbbi események"
#: ../SparkleShare/SparkleEventLog.cs:131
#: ../SparkleShare/SparkleEventLog.cs:150
#: ../SparkleShare/SparkleEventLog.cs:148
#: ../SparkleShare/SparkleEventLog.cs:173
msgid "All Folders"
msgstr ""
msgstr "MInden mappa"
#: ../SparkleShare/SparkleShare.cs:56
#: ../SparkleShare/SparkleShare.cs:53
msgid "Sorry, you can't run SparkleShare with these permissions."
msgstr "Elnézést, nem tudja futtatni SparkleShare ezekkel a jogosultságokkal."
#: ../SparkleShare/SparkleShare.cs:57
#: ../SparkleShare/SparkleShare.cs:54
msgid "Things would go utterly wrong."
msgstr "A dolgok teljesen rossz irányt vehetnek."
#: ../SparkleShare/SparkleShare.cs:66
msgid "Don't show the notification icon"
msgstr "Ne jelenjen meg az értesítési ikon"
#: ../SparkleShare/SparkleShare.cs:67
#: ../SparkleShare/SparkleShare.cs:61
msgid "Print version information"
msgstr "Verzió információk nyomtatása"
#: ../SparkleShare/SparkleShare.cs:68
#: ../SparkleShare/SparkleShare.cs:62
msgid "Show this help text"
msgstr "Ezt a súgó segítséget jeleníti meg"
#: ../SparkleShare/SparkleShare.cs:115
#: ../SparkleShare/SparkleShare.cs:109
msgid "SparkleShare, a collaboration and sharing tool."
msgstr "SparkleShare, az együttműködés és megosztás eszköze."
#: ../SparkleShare/SparkleShare.cs:116
#: ../SparkleShare/SparkleShare.cs:110
msgid "Copyright (C) 2010 Hylke Bons"
msgstr "Copyright (C) 2010 Hylke Bons"
#: ../SparkleShare/SparkleShare.cs:118
#: ../SparkleShare/SparkleShare.cs:112
msgid "This program comes with ABSOLUTELY NO WARRANTY."
msgstr "Erre a programra nincs SEMMIFÉLE GARANCIA."
#: ../SparkleShare/SparkleShare.cs:120
#: ../SparkleShare/SparkleShare.cs:114
msgid "This is free software, and you are welcome to redistribute it "
msgstr "Ez egy szabad szoftver, és mindig örülünk, ha terjesztik "
#: ../SparkleShare/SparkleShare.cs:121
#: ../SparkleShare/SparkleShare.cs:115
msgid "under certain conditions. Please read the GNU GPLv3 for details."
msgstr ""
"bizonyos feltételek mellett. Kérjük, olvassa el a GNU GPLv3 a részletekért."
#: ../SparkleShare/SparkleShare.cs:123
#: ../SparkleShare/SparkleShare.cs:117
msgid "SparkleShare automatically syncs Git repositories in "
msgstr "SparkleShare automatikusan szinkronizálja Git adattárakat a"
#: ../SparkleShare/SparkleShare.cs:124
#: ../SparkleShare/SparkleShare.cs:118
msgid "the ~/SparkleShare folder with their remote origins."
msgstr "a ~/SparkleShare mappával a távoli eredetükkel."
#: ../SparkleShare/SparkleShare.cs:126
#: ../SparkleShare/SparkleShare.cs:120
msgid "Usage: sparkleshare [start|stop|restart] [OPTION]..."
msgstr "Használat: sparkleshare [start | stop | újraindítás] [OPCIÓK] ..."
#: ../SparkleShare/SparkleShare.cs:127
#: ../SparkleShare/SparkleShare.cs:121
msgid "Sync SparkleShare folder with remote repositories."
msgstr "A SparkleShare mappa szinkronizálása a távoli tárolókkal."
#: ../SparkleShare/SparkleShare.cs:129
#: ../SparkleShare/SparkleShare.cs:123
msgid "Arguments:"
msgstr "Paraméterek:"
#: ../SparkleShare/SparkleShare.cs:139
#: ../SparkleShare/SparkleShare.cs:133
msgid "SparkleShare "
msgstr "SparkleShare "
@ -404,7 +401,7 @@ msgstr "Távoli mappa hozzáadása..."
#: ../SparkleShare/SparkleStatusIcon.cs:242
msgid "Show Recent Events"
msgstr ""
msgstr "Utolsó események megjelenítése"
#: ../SparkleShare/SparkleStatusIcon.cs:262
msgid "Turn Notifications Off"
@ -419,11 +416,11 @@ msgstr "Értesítések bekapcsolása"
msgid "Quit"
msgstr "Kilépés"
#: ../SparkleShare/SparkleUI.cs:96
#: ../SparkleShare/SparkleUI.cs:99
msgid "Ouch! Mid-air collision!"
msgstr "Jaj! Ütközés a forgalomban!"
#: ../SparkleShare/SparkleUI.cs:97
#: ../SparkleShare/SparkleUI.cs:100
msgid "Don't worry, SparkleShare made a copy of each conflicting file."
msgstr ""
"Nincs ok az aggodalomra, SparkleShare minden ütköző fájlról készít "

View file

@ -10,31 +10,32 @@ msgid ""
msgstr ""
"Project-Id-Version: SparkleShare\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-06-17 12:09+0200\n"
"PO-Revision-Date: 2011-06-17 10:13+0000\n"
"POT-Creation-Date: 2011-06-29 11:38+0200\n"
"PO-Revision-Date: 2011-06-26 09:22+0000\n"
"Last-Translator: deejay1 <deejay1@srem.org>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: it\n"
"Plural-Forms: nplurals=2; plural=(n != 1)\n"
#: ../SparkleShare/Mac/SparkleStatusIcon.cs:338
#: ../SparkleShare/Mac/SparkleStatusIcon.cs:337
#: ../SparkleShare/SparkleIntro.cs:67 ../SparkleShare/SparkleStatusIcon.cs:345
msgid "Welcome to SparkleShare!"
msgstr "Benvenuto in SparkleShare!"
#: ../SparkleShare/Mac/SparkleStatusIcon.cs:349
#: ../SparkleShare/Mac/SparkleStatusIcon.cs:348
#: ../SparkleShare/SparkleStatusIcon.cs:357
msgid "Not everything is synced"
msgstr "Non tutto è sincronizzato"
#: ../SparkleShare/Mac/SparkleStatusIcon.cs:359
#: ../SparkleShare/Mac/SparkleStatusIcon.cs:358
#: ../SparkleShare/SparkleStatusIcon.cs:367
msgid "Up to date"
msgstr "Aggiornato"
#: ../SparkleShare/Mac/SparkleStatusIcon.cs:375
#: ../SparkleShare/Mac/SparkleStatusIcon.cs:374
#: ../SparkleShare/SparkleStatusIcon.cs:383
msgid "Syncing…"
msgstr "Sincronizzazione in corso..."
@ -84,42 +85,42 @@ msgstr "_Mostra Crediti"
msgid "_Visit Website"
msgstr "_Visita il sito web"
#: ../SparkleShare/SparkleController.cs:422
#: ../SparkleShare/SparkleController.cs:455
msgid "ddd MMM d, yyyy"
msgstr "ddd MMM d, yyyy"
#: ../SparkleShare/SparkleController.cs:427
#: ../SparkleShare/SparkleController.cs:460
msgid "ddd MMM d"
msgstr "ddd MMM d"
#: ../SparkleShare/SparkleController.cs:629
#: ../SparkleShare/SparkleController.cs:661
#, csharp-format
msgid "added {0}"
msgstr "aggiunti '{0}'"
#: ../SparkleShare/SparkleController.cs:634
#: ../SparkleShare/SparkleController.cs:666
#, csharp-format
msgid "moved {0}"
msgstr ""
#: ../SparkleShare/SparkleController.cs:639
#: ../SparkleShare/SparkleController.cs:671
#, csharp-format
msgid "edited {0}"
msgstr "modificati '{0}'"
#: ../SparkleShare/SparkleController.cs:644
#: ../SparkleShare/SparkleController.cs:676
#, csharp-format
msgid "deleted {0}"
msgstr "eliminati '{0}'"
#: ../SparkleShare/SparkleController.cs:653
#: ../SparkleShare/SparkleController.cs:685
#, csharp-format
msgid "and {0} more"
msgid_plural "and {0} more"
msgstr[0] ""
msgstr[1] ""
#: ../SparkleShare/SparkleController.cs:657
#: ../SparkleShare/SparkleController.cs:689
msgid "did something magical"
msgstr ""
@ -323,73 +324,69 @@ msgstr "Impara come installare il tuo SparkleServer personale"
msgid "Recent Events"
msgstr ""
#: ../SparkleShare/SparkleEventLog.cs:131
#: ../SparkleShare/SparkleEventLog.cs:150
#: ../SparkleShare/SparkleEventLog.cs:148
#: ../SparkleShare/SparkleEventLog.cs:173
msgid "All Folders"
msgstr ""
#: ../SparkleShare/SparkleShare.cs:56
#: ../SparkleShare/SparkleShare.cs:53
msgid "Sorry, you can't run SparkleShare with these permissions."
msgstr "Spiacente, non è possibile eseguire SparkleShare con questi permessi."
#: ../SparkleShare/SparkleShare.cs:57
#: ../SparkleShare/SparkleShare.cs:54
msgid "Things would go utterly wrong."
msgstr "Le cose potrebbero andare estremamente male."
#: ../SparkleShare/SparkleShare.cs:66
msgid "Don't show the notification icon"
msgstr "Non mostrare l'icona di notifica"
#: ../SparkleShare/SparkleShare.cs:67
#: ../SparkleShare/SparkleShare.cs:61
msgid "Print version information"
msgstr "Stampa informazioni sulla versione"
#: ../SparkleShare/SparkleShare.cs:68
#: ../SparkleShare/SparkleShare.cs:62
msgid "Show this help text"
msgstr "Mostra questo messaggio di aiuto"
#: ../SparkleShare/SparkleShare.cs:115
#: ../SparkleShare/SparkleShare.cs:109
msgid "SparkleShare, a collaboration and sharing tool."
msgstr ""
#: ../SparkleShare/SparkleShare.cs:116
#: ../SparkleShare/SparkleShare.cs:110
msgid "Copyright (C) 2010 Hylke Bons"
msgstr "Copyright (C) 2010 Hylke Bons"
#: ../SparkleShare/SparkleShare.cs:118
#: ../SparkleShare/SparkleShare.cs:112
msgid "This program comes with ABSOLUTELY NO WARRANTY."
msgstr "Questo programma viene fornito ASSOLUTAMENTE SENZA NESSUNA GARANZIA."
#: ../SparkleShare/SparkleShare.cs:120
#: ../SparkleShare/SparkleShare.cs:114
msgid "This is free software, and you are welcome to redistribute it "
msgstr "Questo è software libero e sei invitato a redistribuirlo"
#: ../SparkleShare/SparkleShare.cs:121
#: ../SparkleShare/SparkleShare.cs:115
msgid "under certain conditions. Please read the GNU GPLv3 for details."
msgstr ""
"rispettando alcune restrizioni. Leggi la licenza GNU GPLv3 per i dettagli"
#: ../SparkleShare/SparkleShare.cs:123
#: ../SparkleShare/SparkleShare.cs:117
msgid "SparkleShare automatically syncs Git repositories in "
msgstr "SparkleShare sincronizza automaticamente i repository Git nella"
#: ../SparkleShare/SparkleShare.cs:124
#: ../SparkleShare/SparkleShare.cs:118
msgid "the ~/SparkleShare folder with their remote origins."
msgstr "cartella ~/.SparkleShare con le loro origini."
#: ../SparkleShare/SparkleShare.cs:126
#: ../SparkleShare/SparkleShare.cs:120
msgid "Usage: sparkleshare [start|stop|restart] [OPTION]..."
msgstr "Utilizzo: sparkleshare [start|stop|restart] [OPTION]..."
#: ../SparkleShare/SparkleShare.cs:127
#: ../SparkleShare/SparkleShare.cs:121
msgid "Sync SparkleShare folder with remote repositories."
msgstr "Sincronizza cartella SparkleShare con repository remoti."
#: ../SparkleShare/SparkleShare.cs:129
#: ../SparkleShare/SparkleShare.cs:123
msgid "Arguments:"
msgstr "Argomenti"
#: ../SparkleShare/SparkleShare.cs:139
#: ../SparkleShare/SparkleShare.cs:133
msgid "SparkleShare "
msgstr "SparkleShare "
@ -419,11 +416,11 @@ msgstr "Accendi le notifiche"
msgid "Quit"
msgstr "Esci"
#: ../SparkleShare/SparkleUI.cs:96
#: ../SparkleShare/SparkleUI.cs:99
msgid "Ouch! Mid-air collision!"
msgstr "Ahi! Una collisione in volo!"
#: ../SparkleShare/SparkleUI.cs:97
#: ../SparkleShare/SparkleUI.cs:100
msgid "Don't worry, SparkleShare made a copy of each conflicting file."
msgstr ""
"Non ti preoccupare, SparkleShare ha eseguito una copia di ogni file in "

View file

@ -10,31 +10,32 @@ msgid ""
msgstr ""
"Project-Id-Version: SparkleShare\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-06-17 12:09+0200\n"
"PO-Revision-Date: 2011-06-17 10:13+0000\n"
"POT-Creation-Date: 2011-06-29 11:38+0200\n"
"PO-Revision-Date: 2011-06-26 09:22+0000\n"
"Last-Translator: deejay1 <deejay1@srem.org>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: ja\n"
"Plural-Forms: nplurals=1; plural=0\n"
#: ../SparkleShare/Mac/SparkleStatusIcon.cs:338
#: ../SparkleShare/Mac/SparkleStatusIcon.cs:337
#: ../SparkleShare/SparkleIntro.cs:67 ../SparkleShare/SparkleStatusIcon.cs:345
msgid "Welcome to SparkleShare!"
msgstr "SparkleShareへようこそ"
#: ../SparkleShare/Mac/SparkleStatusIcon.cs:349
#: ../SparkleShare/Mac/SparkleStatusIcon.cs:348
#: ../SparkleShare/SparkleStatusIcon.cs:357
msgid "Not everything is synced"
msgstr "すべてが同期されていません"
#: ../SparkleShare/Mac/SparkleStatusIcon.cs:359
#: ../SparkleShare/Mac/SparkleStatusIcon.cs:358
#: ../SparkleShare/SparkleStatusIcon.cs:367
msgid "Up to date"
msgstr "最新の状態です。"
#: ../SparkleShare/Mac/SparkleStatusIcon.cs:375
#: ../SparkleShare/Mac/SparkleStatusIcon.cs:374
#: ../SparkleShare/SparkleStatusIcon.cs:383
msgid "Syncing…"
msgstr "同期中..."
@ -84,41 +85,41 @@ msgstr "クレジットを表示する(_S)"
msgid "_Visit Website"
msgstr "Webサイトにアクセスする(_V)"
#: ../SparkleShare/SparkleController.cs:422
#: ../SparkleShare/SparkleController.cs:455
msgid "ddd MMM d, yyyy"
msgstr "ddd MMM d, yyyy"
#: ../SparkleShare/SparkleController.cs:427
#: ../SparkleShare/SparkleController.cs:460
msgid "ddd MMM d"
msgstr "ddd MMM d"
#: ../SparkleShare/SparkleController.cs:629
#: ../SparkleShare/SparkleController.cs:661
#, csharp-format
msgid "added {0}"
msgstr "'{0}'を追加しました"
#: ../SparkleShare/SparkleController.cs:634
#: ../SparkleShare/SparkleController.cs:666
#, csharp-format
msgid "moved {0}"
msgstr "'{0}'を移動しました"
#: ../SparkleShare/SparkleController.cs:639
#: ../SparkleShare/SparkleController.cs:671
#, csharp-format
msgid "edited {0}"
msgstr "'{0}'を編集しました"
#: ../SparkleShare/SparkleController.cs:644
#: ../SparkleShare/SparkleController.cs:676
#, csharp-format
msgid "deleted {0}"
msgstr "'{0}'を削除しました"
#: ../SparkleShare/SparkleController.cs:653
#: ../SparkleShare/SparkleController.cs:685
#, csharp-format
msgid "and {0} more"
msgid_plural "and {0} more"
msgstr[0] "、{0}詳細"
#: ../SparkleShare/SparkleController.cs:657
#: ../SparkleShare/SparkleController.cs:689
msgid "did something magical"
msgstr "何か摩訶不思議なことをしました"
@ -314,72 +315,68 @@ msgstr "個人でSparkleServerを立ち上げる方法"
msgid "Recent Events"
msgstr ""
#: ../SparkleShare/SparkleEventLog.cs:131
#: ../SparkleShare/SparkleEventLog.cs:150
#: ../SparkleShare/SparkleEventLog.cs:148
#: ../SparkleShare/SparkleEventLog.cs:173
msgid "All Folders"
msgstr ""
#: ../SparkleShare/SparkleShare.cs:56
#: ../SparkleShare/SparkleShare.cs:53
msgid "Sorry, you can't run SparkleShare with these permissions."
msgstr "申し訳ありませんが、SparkleShareを実行する権限がありません。パーミッションの設定を見直してください。"
#: ../SparkleShare/SparkleShare.cs:57
#: ../SparkleShare/SparkleShare.cs:54
msgid "Things would go utterly wrong."
msgstr "全く予期しないことになるかもしれません。"
#: ../SparkleShare/SparkleShare.cs:66
msgid "Don't show the notification icon"
msgstr "通知アイコンを表示しない"
#: ../SparkleShare/SparkleShare.cs:67
#: ../SparkleShare/SparkleShare.cs:61
msgid "Print version information"
msgstr "バージョン情報の表示"
#: ../SparkleShare/SparkleShare.cs:68
#: ../SparkleShare/SparkleShare.cs:62
msgid "Show this help text"
msgstr "このヘルプテキストを表示"
#: ../SparkleShare/SparkleShare.cs:115
#: ../SparkleShare/SparkleShare.cs:109
msgid "SparkleShare, a collaboration and sharing tool."
msgstr "SparkleShare、コラボレーションと共有のためのツールです。"
#: ../SparkleShare/SparkleShare.cs:116
#: ../SparkleShare/SparkleShare.cs:110
msgid "Copyright (C) 2010 Hylke Bons"
msgstr "Copyright (C)2010 Hylke Bons"
#: ../SparkleShare/SparkleShare.cs:118
#: ../SparkleShare/SparkleShare.cs:112
msgid "This program comes with ABSOLUTELY NO WARRANTY."
msgstr "このプログラムは完全無保証です。"
#: ../SparkleShare/SparkleShare.cs:120
#: ../SparkleShare/SparkleShare.cs:114
msgid "This is free software, and you are welcome to redistribute it "
msgstr "これはフリーソフトウェアであり、再配布を歓迎します。"
#: ../SparkleShare/SparkleShare.cs:121
#: ../SparkleShare/SparkleShare.cs:115
msgid "under certain conditions. Please read the GNU GPLv3 for details."
msgstr "一定の条件の下で。詳細については、GNUのGPLv3をお読みください。"
#: ../SparkleShare/SparkleShare.cs:123
#: ../SparkleShare/SparkleShare.cs:117
msgid "SparkleShare automatically syncs Git repositories in "
msgstr "SparkleShareは自動的に..のGitリポジトリと同期します"
#: ../SparkleShare/SparkleShare.cs:124
#: ../SparkleShare/SparkleShare.cs:118
msgid "the ~/SparkleShare folder with their remote origins."
msgstr "リモートの元フォルダを含んだ~/SparkleShareフォルダ"
#: ../SparkleShare/SparkleShare.cs:126
#: ../SparkleShare/SparkleShare.cs:120
msgid "Usage: sparkleshare [start|stop|restart] [OPTION]..."
msgstr "使用法: sparkleshare [start|stop|restart] [オプション]..."
#: ../SparkleShare/SparkleShare.cs:127
#: ../SparkleShare/SparkleShare.cs:121
msgid "Sync SparkleShare folder with remote repositories."
msgstr "SparkleShareフォルダをリモートのリポジトリと同期。"
#: ../SparkleShare/SparkleShare.cs:129
#: ../SparkleShare/SparkleShare.cs:123
msgid "Arguments:"
msgstr "引数:"
#: ../SparkleShare/SparkleShare.cs:139
#: ../SparkleShare/SparkleShare.cs:133
msgid "SparkleShare "
msgstr "SparkleShare"
@ -409,11 +406,11 @@ msgstr "通知をオン"
msgid "Quit"
msgstr "終了"
#: ../SparkleShare/SparkleUI.cs:96
#: ../SparkleShare/SparkleUI.cs:99
msgid "Ouch! Mid-air collision!"
msgstr "イテテ!空中衝突だ!"
#: ../SparkleShare/SparkleUI.cs:97
#: ../SparkleShare/SparkleUI.cs:100
msgid "Don't worry, SparkleShare made a copy of each conflicting file."
msgstr "心配しないでください。SparkleShareは、各競合しているファイルのコピーを作成しました。"

View file

@ -4,37 +4,40 @@
# we apologise for any incovenience this may have caused and we hope to bring them
# back in the future.
#
# <sven.koehler@student.hpi.uni-potsdam.de>, 2011.
# <benjamincottyn@gmail.com>, 2011.
# smeagiel <michielaiso@hotmail.com>, 2011.
# Łukasz Jernaś <deejay1@srem.org>, 2011.
msgid ""
msgstr ""
"Project-Id-Version: SparkleShare\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-06-17 12:09+0200\n"
"PO-Revision-Date: 2011-06-17 10:13+0000\n"
"Last-Translator: deejay1 <deejay1@srem.org>\n"
"POT-Creation-Date: 2011-06-29 11:38+0200\n"
"PO-Revision-Date: 2011-07-12 21:12+0000\n"
"Last-Translator: tzwenn <sven.koehler@student.hpi.uni-potsdam.de>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: nl\n"
"Plural-Forms: nplurals=2; plural=(n != 1)\n"
#: ../SparkleShare/Mac/SparkleStatusIcon.cs:338
#: ../SparkleShare/Mac/SparkleStatusIcon.cs:337
#: ../SparkleShare/SparkleIntro.cs:67 ../SparkleShare/SparkleStatusIcon.cs:345
msgid "Welcome to SparkleShare!"
msgstr "Welkom bij SparkleShare!"
#: ../SparkleShare/Mac/SparkleStatusIcon.cs:349
#: ../SparkleShare/Mac/SparkleStatusIcon.cs:348
#: ../SparkleShare/SparkleStatusIcon.cs:357
msgid "Not everything is synced"
msgstr "Niet alles is gesynchroniseerd"
#: ../SparkleShare/Mac/SparkleStatusIcon.cs:359
#: ../SparkleShare/Mac/SparkleStatusIcon.cs:358
#: ../SparkleShare/SparkleStatusIcon.cs:367
msgid "Up to date"
msgstr "Up-to-date"
#: ../SparkleShare/Mac/SparkleStatusIcon.cs:375
#: ../SparkleShare/Mac/SparkleStatusIcon.cs:374
#: ../SparkleShare/SparkleStatusIcon.cs:383
msgid "Syncing…"
msgstr "Synchroniseren…"
@ -66,15 +69,15 @@ msgstr "Over SparkleShare"
#: ../SparkleShare/SparkleAbout.cs:53
msgid "A newer version is available"
msgstr ""
msgstr "Een nieuwere versie is beschikbaar"
#: ../SparkleShare/SparkleAbout.cs:60
msgid "You are running the latest version."
msgstr ""
msgstr "U werkt met de nieuwste versie."
#: ../SparkleShare/SparkleAbout.cs:87
msgid "Checking for updates..."
msgstr ""
msgstr "Controleren op updates ..."
#: ../SparkleShare/SparkleAbout.cs:116
msgid "_Show Credits"
@ -84,42 +87,42 @@ msgstr ""
msgid "_Visit Website"
msgstr "_Bezoek website"
#: ../SparkleShare/SparkleController.cs:422
#: ../SparkleShare/SparkleController.cs:455
msgid "ddd MMM d, yyyy"
msgstr ""
#: ../SparkleShare/SparkleController.cs:427
#: ../SparkleShare/SparkleController.cs:460
msgid "ddd MMM d"
msgstr ""
#: ../SparkleShare/SparkleController.cs:629
#: ../SparkleShare/SparkleController.cs:661
#, csharp-format
msgid "added {0}"
msgstr "voegde {0} toe"
#: ../SparkleShare/SparkleController.cs:634
#: ../SparkleShare/SparkleController.cs:666
#, csharp-format
msgid "moved {0}"
msgstr ""
#: ../SparkleShare/SparkleController.cs:639
#: ../SparkleShare/SparkleController.cs:671
#, csharp-format
msgid "edited {0}"
msgstr "bewerkte {0}"
#: ../SparkleShare/SparkleController.cs:644
#: ../SparkleShare/SparkleController.cs:676
#, csharp-format
msgid "deleted {0}"
msgstr "verwijderde {0}"
#: ../SparkleShare/SparkleController.cs:653
#: ../SparkleShare/SparkleController.cs:685
#, csharp-format
msgid "and {0} more"
msgid_plural "and {0} more"
msgstr[0] ""
msgstr[1] ""
#: ../SparkleShare/SparkleController.cs:657
#: ../SparkleShare/SparkleController.cs:689
msgid "did something magical"
msgstr ""
@ -263,7 +266,7 @@ msgstr "Opnieuw proberen"
#: ../SparkleShare/SparkleIntro.cs:473
#, csharp-format
msgid "{0} has been successfully added"
msgstr ""
msgstr "'{0}' is met succes toegevoegd"
#: ../SparkleShare/SparkleIntro.cs:482
msgid "Folder synced successfully!"
@ -318,76 +321,72 @@ msgstr "Leer hoe je je eigen SparkleServer kan opzetten"
#: ../SparkleShare/SparkleEventLog.cs:61
msgid "Recent Events"
msgstr ""
msgstr "Recente gebeurtenissen"
#: ../SparkleShare/SparkleEventLog.cs:131
#: ../SparkleShare/SparkleEventLog.cs:150
#: ../SparkleShare/SparkleEventLog.cs:148
#: ../SparkleShare/SparkleEventLog.cs:173
msgid "All Folders"
msgstr ""
msgstr "Alle mappen"
#: ../SparkleShare/SparkleShare.cs:56
#: ../SparkleShare/SparkleShare.cs:53
msgid "Sorry, you can't run SparkleShare with these permissions."
msgstr "Sorry, SparkleShare kan niet gedraaid worden met deze rechten."
#: ../SparkleShare/SparkleShare.cs:57
#: ../SparkleShare/SparkleShare.cs:54
msgid "Things would go utterly wrong."
msgstr "Dingen zouden vresenlijk mis gaan"
#: ../SparkleShare/SparkleShare.cs:66
msgid "Don't show the notification icon"
msgstr "Toon het notificatiepictogram niet."
#: ../SparkleShare/SparkleShare.cs:67
#: ../SparkleShare/SparkleShare.cs:61
msgid "Print version information"
msgstr "Druk versie-informatie af"
#: ../SparkleShare/SparkleShare.cs:68
#: ../SparkleShare/SparkleShare.cs:62
msgid "Show this help text"
msgstr "Toon deze helptekst"
#: ../SparkleShare/SparkleShare.cs:115
#: ../SparkleShare/SparkleShare.cs:109
msgid "SparkleShare, a collaboration and sharing tool."
msgstr ""
#: ../SparkleShare/SparkleShare.cs:116
#: ../SparkleShare/SparkleShare.cs:110
msgid "Copyright (C) 2010 Hylke Bons"
msgstr "Copyright (C) 2010 Hylke Bons"
#: ../SparkleShare/SparkleShare.cs:118
#: ../SparkleShare/SparkleShare.cs:112
msgid "This program comes with ABSOLUTELY NO WARRANTY."
msgstr "Er zit ABSOLUUT GEEN GARANTIE op dit programma."
#: ../SparkleShare/SparkleShare.cs:120
#: ../SparkleShare/SparkleShare.cs:114
msgid "This is free software, and you are welcome to redistribute it "
msgstr ""
"Dit is vrije software en je bent van harte uitgenodigd om het te "
"herdistribueren "
#: ../SparkleShare/SparkleShare.cs:121
#: ../SparkleShare/SparkleShare.cs:115
msgid "under certain conditions. Please read the GNU GPLv3 for details."
msgstr " onder bepaalde voorwaarden. Zie de GNU GPLv3 voor meer informatie."
#: ../SparkleShare/SparkleShare.cs:123
#: ../SparkleShare/SparkleShare.cs:117
msgid "SparkleShare automatically syncs Git repositories in "
msgstr "SparkleShare automatisch synchroniseerd Git repositories in "
#: ../SparkleShare/SparkleShare.cs:124
#: ../SparkleShare/SparkleShare.cs:118
msgid "the ~/SparkleShare folder with their remote origins."
msgstr "de ~/SparkleShare map met de externe bron."
#: ../SparkleShare/SparkleShare.cs:126
#: ../SparkleShare/SparkleShare.cs:120
msgid "Usage: sparkleshare [start|stop|restart] [OPTION]..."
msgstr "Gebruik: sparkleshare [start|stop|restart] [OPTION]..."
#: ../SparkleShare/SparkleShare.cs:127
#: ../SparkleShare/SparkleShare.cs:121
msgid "Sync SparkleShare folder with remote repositories."
msgstr "Synchroniseer de SparkleShare map met externe repositories"
#: ../SparkleShare/SparkleShare.cs:129
#: ../SparkleShare/SparkleShare.cs:123
msgid "Arguments:"
msgstr "Argumenten"
msgstr "Argumenten:"
#: ../SparkleShare/SparkleShare.cs:139
#: ../SparkleShare/SparkleShare.cs:133
msgid "SparkleShare "
msgstr "SparkleShare "
@ -402,7 +401,7 @@ msgstr "Externe map toevoegen…"
#: ../SparkleShare/SparkleStatusIcon.cs:242
msgid "Show Recent Events"
msgstr ""
msgstr "Toon recente gebeurtenissen"
#: ../SparkleShare/SparkleStatusIcon.cs:262
msgid "Turn Notifications Off"
@ -417,11 +416,11 @@ msgstr "Zet mededelingen aan"
msgid "Quit"
msgstr "Afsluiten"
#: ../SparkleShare/SparkleUI.cs:96
#: ../SparkleShare/SparkleUI.cs:99
msgid "Ouch! Mid-air collision!"
msgstr "Ouw! Botsing!"
#: ../SparkleShare/SparkleUI.cs:97
#: ../SparkleShare/SparkleUI.cs:100
msgid "Don't worry, SparkleShare made a copy of each conflicting file."
msgstr ""
"Geen zorgen, SparkleShare heeft een kopie van elk conflicterend bestand "
@ -429,6 +428,6 @@ msgstr ""
#: ../SparkleShare/SparkleWindow.cs:41
msgid "SparkleShare Setup"
msgstr ""
msgstr "SparkleShare Setup"

View file

@ -4,36 +4,38 @@
# we apologise for any incovenience this may have caused and we hope to bring them
# back in the future.
#
# <vegard.aarseth@gmail.com>, 2011.
# habakke <habakke@matrise.net>, 2011.
msgid ""
msgstr ""
"Project-Id-Version: SparkleShare\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-06-17 12:09+0200\n"
"PO-Revision-Date: 2011-06-17 10:13+0000\n"
"Last-Translator: deejay1 <deejay1@srem.org>\n"
"POT-Creation-Date: 2011-06-29 11:38+0200\n"
"PO-Revision-Date: 2011-07-05 10:29+0000\n"
"Last-Translator: VegardAa <vegard.aarseth@gmail.com>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: no_NO\n"
"Plural-Forms: nplurals=2; plural=(n != 1)\n"
#: ../SparkleShare/Mac/SparkleStatusIcon.cs:338
#: ../SparkleShare/Mac/SparkleStatusIcon.cs:337
#: ../SparkleShare/SparkleIntro.cs:67 ../SparkleShare/SparkleStatusIcon.cs:345
msgid "Welcome to SparkleShare!"
msgstr "Velkommen til SparkleShare!"
#: ../SparkleShare/Mac/SparkleStatusIcon.cs:349
#: ../SparkleShare/Mac/SparkleStatusIcon.cs:348
#: ../SparkleShare/SparkleStatusIcon.cs:357
msgid "Not everything is synced"
msgstr "Ikke alt er synkronisert"
#: ../SparkleShare/Mac/SparkleStatusIcon.cs:359
#: ../SparkleShare/Mac/SparkleStatusIcon.cs:358
#: ../SparkleShare/SparkleStatusIcon.cs:367
msgid "Up to date"
msgstr "Oppdatert"
#: ../SparkleShare/Mac/SparkleStatusIcon.cs:375
#: ../SparkleShare/Mac/SparkleStatusIcon.cs:374
#: ../SparkleShare/SparkleStatusIcon.cs:383
msgid "Syncing…"
msgstr "Synkroniserer..."
@ -61,66 +63,66 @@ msgstr "Vel for å få en kopi av denne versjonen."
#. A menu item that takes the user to http://www.sparkleshare.org/
#: ../SparkleShare/SparkleAbout.cs:46 ../SparkleShare/SparkleStatusIcon.cs:275
msgid "About SparkleShare"
msgstr ""
msgstr "Om SparkleShare"
#: ../SparkleShare/SparkleAbout.cs:53
msgid "A newer version is available"
msgstr ""
msgstr "En nyere versjon er tilgjengelig"
#: ../SparkleShare/SparkleAbout.cs:60
msgid "You are running the latest version."
msgstr ""
msgstr "Du kjører siste versjon"
#: ../SparkleShare/SparkleAbout.cs:87
msgid "Checking for updates..."
msgstr ""
msgstr "Ser etter oppdateringer..."
#: ../SparkleShare/SparkleAbout.cs:116
msgid "_Show Credits"
msgstr ""
msgstr "_Vis ...."
#: ../SparkleShare/SparkleAbout.cs:129
msgid "_Visit Website"
msgstr "_Besøk webside"
#: ../SparkleShare/SparkleController.cs:422
#: ../SparkleShare/SparkleController.cs:455
msgid "ddd MMM d, yyyy"
msgstr ""
#: ../SparkleShare/SparkleController.cs:427
#: ../SparkleShare/SparkleController.cs:460
msgid "ddd MMM d"
msgstr ""
#: ../SparkleShare/SparkleController.cs:629
#: ../SparkleShare/SparkleController.cs:661
#, csharp-format
msgid "added {0}"
msgstr "la til '{0}'"
#: ../SparkleShare/SparkleController.cs:634
#: ../SparkleShare/SparkleController.cs:666
#, csharp-format
msgid "moved {0}"
msgstr ""
msgstr "Flyttet {0}"
#: ../SparkleShare/SparkleController.cs:639
#: ../SparkleShare/SparkleController.cs:671
#, csharp-format
msgid "edited {0}"
msgstr "redigerte '{0}'"
#: ../SparkleShare/SparkleController.cs:644
#: ../SparkleShare/SparkleController.cs:676
#, csharp-format
msgid "deleted {0}"
msgstr "slettet '{0}'"
#: ../SparkleShare/SparkleController.cs:653
#: ../SparkleShare/SparkleController.cs:685
#, csharp-format
msgid "and {0} more"
msgid_plural "and {0} more"
msgstr[0] ""
msgstr[1] ""
#: ../SparkleShare/SparkleController.cs:657
#: ../SparkleShare/SparkleController.cs:689
msgid "did something magical"
msgstr ""
msgstr "Gjorde noe magisk"
#: ../SparkleShare/SparkleIntro.cs:73
msgid ""
@ -148,7 +150,7 @@ msgstr "Konfigurerer..."
#: ../SparkleShare/SparkleIntro.cs:161
msgid "Where is your remote folder?"
msgstr "Hvor er din eksterne mappen?"
msgstr "Hvor er din eksterne mappe?"
#: ../SparkleShare/SparkleIntro.cs:174
msgid "address-to-server.com"
@ -160,7 +162,7 @@ msgstr "På min egen server:"
#: ../SparkleShare/SparkleIntro.cs:186
msgid "Free hosting for Free and Open Source Software projects."
msgstr "Gratis hosting for Free og Åpne Kildekode prosjekter"
msgstr "Gratis hosting for gratis og Åpen Kildekode prosjekter"
#: ../SparkleShare/SparkleIntro.cs:187
msgid "Also has paid accounts for extra private space and bandwidth."
@ -215,7 +217,7 @@ msgstr "Mappe Navn:"
#: ../SparkleShare/SparkleIntro.cs:269
msgid "Sync"
msgstr "Synk"
msgstr "Synkroniser"
#: ../SparkleShare/SparkleIntro.cs:312
msgid "Cancel"
@ -243,7 +245,7 @@ msgstr "Aksepterer du denne invitasjonen?"
#: ../SparkleShare/SparkleIntro.cs:368
msgid "Server Address:"
msgstr "Server Adresse:"
msgstr "Tjener Adresse:"
#: ../SparkleShare/SparkleIntro.cs:391
msgid "Reject"
@ -251,7 +253,7 @@ msgstr "Avvis"
#: ../SparkleShare/SparkleIntro.cs:392
msgid "Accept and Sync"
msgstr "Godta og Synk"
msgstr "Godta og Synkroniser"
#: ../SparkleShare/SparkleIntro.cs:442
msgid "Something went wrong…"
@ -264,7 +266,7 @@ msgstr "Forsøk igjen"
#: ../SparkleShare/SparkleIntro.cs:473
#, csharp-format
msgid "{0} has been successfully added"
msgstr ""
msgstr "{0} har blitt lagt til"
#: ../SparkleShare/SparkleIntro.cs:482
msgid "Folder synced successfully!"
@ -319,75 +321,71 @@ msgstr "Lær hvordan du kan være vert for din egen SparkleServer"
#: ../SparkleShare/SparkleEventLog.cs:61
msgid "Recent Events"
msgstr ""
msgstr "Nylige hendelser"
#: ../SparkleShare/SparkleEventLog.cs:131
#: ../SparkleShare/SparkleEventLog.cs:150
#: ../SparkleShare/SparkleEventLog.cs:148
#: ../SparkleShare/SparkleEventLog.cs:173
msgid "All Folders"
msgstr ""
msgstr "Alle mapper"
#: ../SparkleShare/SparkleShare.cs:56
#: ../SparkleShare/SparkleShare.cs:53
msgid "Sorry, you can't run SparkleShare with these permissions."
msgstr "Beklager, du kan ikke kjøre SparkleShare med disse tillatelsene."
#: ../SparkleShare/SparkleShare.cs:57
#: ../SparkleShare/SparkleShare.cs:54
msgid "Things would go utterly wrong."
msgstr "Ting ville gå helt galt."
#: ../SparkleShare/SparkleShare.cs:66
msgid "Don't show the notification icon"
msgstr "Ikke vis varslingsikonet"
#: ../SparkleShare/SparkleShare.cs:67
#: ../SparkleShare/SparkleShare.cs:61
msgid "Print version information"
msgstr "Print versjons informasjon"
#: ../SparkleShare/SparkleShare.cs:68
#: ../SparkleShare/SparkleShare.cs:62
msgid "Show this help text"
msgstr "Vis denne hjelpeteksten"
#: ../SparkleShare/SparkleShare.cs:115
#: ../SparkleShare/SparkleShare.cs:109
msgid "SparkleShare, a collaboration and sharing tool."
msgstr ""
#: ../SparkleShare/SparkleShare.cs:116
#: ../SparkleShare/SparkleShare.cs:110
msgid "Copyright (C) 2010 Hylke Bons"
msgstr "Copyright (C) 2010 Hylke Bons"
#: ../SparkleShare/SparkleShare.cs:118
#: ../SparkleShare/SparkleShare.cs:112
msgid "This program comes with ABSOLUTELY NO WARRANTY."
msgstr "Dette programmet kommer med ABSOLUTT INGEN GARANTI."
#: ../SparkleShare/SparkleShare.cs:120
#: ../SparkleShare/SparkleShare.cs:114
msgid "This is free software, and you are welcome to redistribute it "
msgstr ""
"Dette er fri programvare, og du er velkommen til å videredistribuere det"
#: ../SparkleShare/SparkleShare.cs:121
#: ../SparkleShare/SparkleShare.cs:115
msgid "under certain conditions. Please read the GNU GPLv3 for details."
msgstr "under visse vilkår. Vennligst les GNU GPLv3 for detaljer."
#: ../SparkleShare/SparkleShare.cs:123
#: ../SparkleShare/SparkleShare.cs:117
msgid "SparkleShare automatically syncs Git repositories in "
msgstr "SparkleShare synkroniserer automatisk Git repositories i"
#: ../SparkleShare/SparkleShare.cs:124
#: ../SparkleShare/SparkleShare.cs:118
msgid "the ~/SparkleShare folder with their remote origins."
msgstr "på ~ / SparkleShare mappe med deres eksterne opprinnelse."
#: ../SparkleShare/SparkleShare.cs:126
#: ../SparkleShare/SparkleShare.cs:120
msgid "Usage: sparkleshare [start|stop|restart] [OPTION]..."
msgstr "Bruk: sparkleshare [start | stop | restart] [VALG] ..."
#: ../SparkleShare/SparkleShare.cs:127
#: ../SparkleShare/SparkleShare.cs:121
msgid "Sync SparkleShare folder with remote repositories."
msgstr "Synkroniser SparkleShare mappe med eksterne repositories."
#: ../SparkleShare/SparkleShare.cs:129
#: ../SparkleShare/SparkleShare.cs:123
msgid "Arguments:"
msgstr "Argumenter:"
#: ../SparkleShare/SparkleShare.cs:139
#: ../SparkleShare/SparkleShare.cs:133
msgid "SparkleShare "
msgstr "SparkleShare"
@ -398,30 +396,30 @@ msgstr "Ingen Eksterne Mapper Ennå"
#. Opens the wizard to add a new remote folder
#: ../SparkleShare/SparkleStatusIcon.cs:218
msgid "Add Remote Folder…"
msgstr ""
msgstr "Legg til esktern mappe..."
#: ../SparkleShare/SparkleStatusIcon.cs:242
msgid "Show Recent Events"
msgstr ""
msgstr "Vis nylige hendelser"
#: ../SparkleShare/SparkleStatusIcon.cs:262
msgid "Turn Notifications Off"
msgstr ""
msgstr "Slå av varslinger"
#: ../SparkleShare/SparkleStatusIcon.cs:264
msgid "Turn Notifications On"
msgstr ""
msgstr "Slå på varslinger"
#. A menu item that quits the application
#: ../SparkleShare/SparkleStatusIcon.cs:286
msgid "Quit"
msgstr "Avslutt"
#: ../SparkleShare/SparkleUI.cs:96
#: ../SparkleShare/SparkleUI.cs:99
msgid "Ouch! Mid-air collision!"
msgstr "Au! Kollisjon midt i luften!"
#: ../SparkleShare/SparkleUI.cs:97
#: ../SparkleShare/SparkleUI.cs:100
msgid "Don't worry, SparkleShare made a copy of each conflicting file."
msgstr ""
"Ikke bekymre deg, SparkleShare laget en kopi av hver motstridende fil."

View file

@ -9,31 +9,32 @@ msgid ""
msgstr ""
"Project-Id-Version: SparkleShare\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-06-17 12:09+0200\n"
"PO-Revision-Date: 2011-06-17 10:13+0000\n"
"POT-Creation-Date: 2011-06-29 11:38+0200\n"
"PO-Revision-Date: 2011-07-02 16:58+0000\n"
"Last-Translator: deejay1 <deejay1@srem.org>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: pl\n"
"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)\n"
#: ../SparkleShare/Mac/SparkleStatusIcon.cs:338
#: ../SparkleShare/Mac/SparkleStatusIcon.cs:337
#: ../SparkleShare/SparkleIntro.cs:67 ../SparkleShare/SparkleStatusIcon.cs:345
msgid "Welcome to SparkleShare!"
msgstr "Witamy w programie SparkleShare!"
#: ../SparkleShare/Mac/SparkleStatusIcon.cs:349
#: ../SparkleShare/Mac/SparkleStatusIcon.cs:348
#: ../SparkleShare/SparkleStatusIcon.cs:357
msgid "Not everything is synced"
msgstr "Nie wszystko zostało zsynchronizowane"
#: ../SparkleShare/Mac/SparkleStatusIcon.cs:359
#: ../SparkleShare/Mac/SparkleStatusIcon.cs:358
#: ../SparkleShare/SparkleStatusIcon.cs:367
msgid "Up to date"
msgstr "Wszystko jest aktualne"
#: ../SparkleShare/Mac/SparkleStatusIcon.cs:375
#: ../SparkleShare/Mac/SparkleStatusIcon.cs:374
#: ../SparkleShare/SparkleStatusIcon.cs:383
msgid "Syncing…"
msgstr "Synchronizowanie…"
@ -65,15 +66,15 @@ msgstr "Informacje o"
#: ../SparkleShare/SparkleAbout.cs:53
msgid "A newer version is available"
msgstr ""
msgstr "Dostępna jest nowsza wersja"
#: ../SparkleShare/SparkleAbout.cs:60
msgid "You are running the latest version."
msgstr ""
msgstr "Korzystasz z najnowszej wersji."
#: ../SparkleShare/SparkleAbout.cs:87
msgid "Checking for updates..."
msgstr ""
msgstr "Wyszukiwanie aktualizacji"
#: ../SparkleShare/SparkleAbout.cs:116
msgid "_Show Credits"
@ -83,35 +84,35 @@ msgstr "Za_sługi"
msgid "_Visit Website"
msgstr "_Odwiedź stronę domową"
#: ../SparkleShare/SparkleController.cs:422
#: ../SparkleShare/SparkleController.cs:455
msgid "ddd MMM d, yyyy"
msgstr "ddd, d MMM yyyy"
#: ../SparkleShare/SparkleController.cs:427
#: ../SparkleShare/SparkleController.cs:460
msgid "ddd MMM d"
msgstr "ddd, d MMM"
#: ../SparkleShare/SparkleController.cs:629
#: ../SparkleShare/SparkleController.cs:661
#, csharp-format
msgid "added {0}"
msgstr "dodano „{0}”"
#: ../SparkleShare/SparkleController.cs:634
#: ../SparkleShare/SparkleController.cs:666
#, csharp-format
msgid "moved {0}"
msgstr "przesunięto \"{0}\""
#: ../SparkleShare/SparkleController.cs:639
#: ../SparkleShare/SparkleController.cs:671
#, csharp-format
msgid "edited {0}"
msgstr "edytowano „{0}”"
#: ../SparkleShare/SparkleController.cs:644
#: ../SparkleShare/SparkleController.cs:676
#, csharp-format
msgid "deleted {0}"
msgstr "usunięto „{0}”"
#: ../SparkleShare/SparkleController.cs:653
#: ../SparkleShare/SparkleController.cs:685
#, csharp-format
msgid "and {0} more"
msgid_plural "and {0} more"
@ -119,7 +120,7 @@ msgstr[0] "oraz {0} więcej"
msgstr[1] "oraz {0} więcej"
msgstr[2] "oraz {0} więcej"
#: ../SparkleShare/SparkleController.cs:657
#: ../SparkleShare/SparkleController.cs:689
msgid "did something magical"
msgstr "wydarzyło się coś magicznego"
@ -318,83 +319,79 @@ msgstr "Dowiedz się, jak postawić własny SparkleServer"
#: ../SparkleShare/SparkleEventLog.cs:61
msgid "Recent Events"
msgstr ""
msgstr "Ostatnie zdarzenia"
#: ../SparkleShare/SparkleEventLog.cs:131
#: ../SparkleShare/SparkleEventLog.cs:150
#: ../SparkleShare/SparkleEventLog.cs:148
#: ../SparkleShare/SparkleEventLog.cs:173
msgid "All Folders"
msgstr ""
msgstr "Wszystkie katalogi"
#: ../SparkleShare/SparkleShare.cs:56
#: ../SparkleShare/SparkleShare.cs:53
msgid "Sorry, you can't run SparkleShare with these permissions."
msgstr ""
"Przepraszamy, nie można uruchomić programu SparkleShare z bieżącymi "
"uprawnieniami."
#: ../SparkleShare/SparkleShare.cs:57
#: ../SparkleShare/SparkleShare.cs:54
msgid "Things would go utterly wrong."
msgstr "Może to spowodować nieprzewidziane skutki."
#: ../SparkleShare/SparkleShare.cs:66
msgid "Don't show the notification icon"
msgstr "Wyłącza wyświetlanie ikony w obszarze powiadamiania"
#: ../SparkleShare/SparkleShare.cs:67
#: ../SparkleShare/SparkleShare.cs:61
msgid "Print version information"
msgstr "Wyświetla informacje o wersji"
#: ../SparkleShare/SparkleShare.cs:68
#: ../SparkleShare/SparkleShare.cs:62
msgid "Show this help text"
msgstr "Wyświetla opcje pomocy"
#: ../SparkleShare/SparkleShare.cs:115
#: ../SparkleShare/SparkleShare.cs:109
msgid "SparkleShare, a collaboration and sharing tool."
msgstr "SparkleShare narzędzie wspomagające współpracę."
#: ../SparkleShare/SparkleShare.cs:116
#: ../SparkleShare/SparkleShare.cs:110
msgid "Copyright (C) 2010 Hylke Bons"
msgstr "Copyright (C) 2010 Hylke Bons"
#: ../SparkleShare/SparkleShare.cs:118
#: ../SparkleShare/SparkleShare.cs:112
msgid "This program comes with ABSOLUTELY NO WARRANTY."
msgstr "Niniejszy program dostarczany jest BEZ JAKIEJKOLWIEK GWARANCJI."
#: ../SparkleShare/SparkleShare.cs:120
#: ../SparkleShare/SparkleShare.cs:114
msgid "This is free software, and you are welcome to redistribute it "
msgstr ""
"Niniejszy program jest wolnym oprogramowanie, można go rozprowadzać dalej "
"pod pewnymi warunkami."
#: ../SparkleShare/SparkleShare.cs:121
#: ../SparkleShare/SparkleShare.cs:115
msgid "under certain conditions. Please read the GNU GPLv3 for details."
msgstr ""
"Aby uzyskać więcej informacji, proszę zapoznać się z tekstem licencji GNU "
"GPLv3."
#: ../SparkleShare/SparkleShare.cs:123
#: ../SparkleShare/SparkleShare.cs:117
msgid "SparkleShare automatically syncs Git repositories in "
msgstr ""
"Program SparkleShare automatycznie synchronizuje reozytoria Git znajdujące "
"się"
#: ../SparkleShare/SparkleShare.cs:124
#: ../SparkleShare/SparkleShare.cs:118
msgid "the ~/SparkleShare folder with their remote origins."
msgstr "w katalogu ~/SparkleShare z ich zdalnymi gałęziami."
#: ../SparkleShare/SparkleShare.cs:126
#: ../SparkleShare/SparkleShare.cs:120
msgid "Usage: sparkleshare [start|stop|restart] [OPTION]..."
msgstr "Użycie: sparkleshare [start|stop|restart] [OPCJA]..."
#: ../SparkleShare/SparkleShare.cs:127
#: ../SparkleShare/SparkleShare.cs:121
msgid "Sync SparkleShare folder with remote repositories."
msgstr ""
"Synchronizuj zawartość katalogu SparkleShare ze zdalnymi repozytoriami."
#: ../SparkleShare/SparkleShare.cs:129
#: ../SparkleShare/SparkleShare.cs:123
msgid "Arguments:"
msgstr "Parametry:"
#: ../SparkleShare/SparkleShare.cs:139
#: ../SparkleShare/SparkleShare.cs:133
msgid "SparkleShare "
msgstr "SparkleShare"
@ -409,7 +406,7 @@ msgstr "Dodaj zdalny katalog"
#: ../SparkleShare/SparkleStatusIcon.cs:242
msgid "Show Recent Events"
msgstr ""
msgstr "Wyświetl ostatnie zdarzenia"
#: ../SparkleShare/SparkleStatusIcon.cs:262
msgid "Turn Notifications Off"
@ -424,16 +421,16 @@ msgstr "Włącz powiadomienia"
msgid "Quit"
msgstr "Zakończ"
#: ../SparkleShare/SparkleUI.cs:96
#: ../SparkleShare/SparkleUI.cs:99
msgid "Ouch! Mid-air collision!"
msgstr "Ups! Nastąpiło czołowe zderzenie! "
#: ../SparkleShare/SparkleUI.cs:97
#: ../SparkleShare/SparkleUI.cs:100
msgid "Don't worry, SparkleShare made a copy of each conflicting file."
msgstr "Bez obaw, program SparkleShare wykonał kopię skonfliktowanych plików."
#: ../SparkleShare/SparkleWindow.cs:41
msgid "SparkleShare Setup"
msgstr ""
msgstr "Ustawienia programu SparkleShare"

View file

@ -10,31 +10,32 @@ msgid ""
msgstr ""
"Project-Id-Version: SparkleShare\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-06-17 12:09+0200\n"
"PO-Revision-Date: 2011-06-17 10:13+0000\n"
"POT-Creation-Date: 2011-06-29 11:38+0200\n"
"PO-Revision-Date: 2011-06-26 09:22+0000\n"
"Last-Translator: deejay1 <deejay1@srem.org>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: pt_BR\n"
"Plural-Forms: nplurals=2; plural=(n > 1)\n"
#: ../SparkleShare/Mac/SparkleStatusIcon.cs:338
#: ../SparkleShare/Mac/SparkleStatusIcon.cs:337
#: ../SparkleShare/SparkleIntro.cs:67 ../SparkleShare/SparkleStatusIcon.cs:345
msgid "Welcome to SparkleShare!"
msgstr "Bem-vindo ao SparkleShare!"
#: ../SparkleShare/Mac/SparkleStatusIcon.cs:349
#: ../SparkleShare/Mac/SparkleStatusIcon.cs:348
#: ../SparkleShare/SparkleStatusIcon.cs:357
msgid "Not everything is synced"
msgstr "Nem tudo foi sincronizado"
#: ../SparkleShare/Mac/SparkleStatusIcon.cs:359
#: ../SparkleShare/Mac/SparkleStatusIcon.cs:358
#: ../SparkleShare/SparkleStatusIcon.cs:367
msgid "Up to date"
msgstr "Atualizado"
#: ../SparkleShare/Mac/SparkleStatusIcon.cs:375
#: ../SparkleShare/Mac/SparkleStatusIcon.cs:374
#: ../SparkleShare/SparkleStatusIcon.cs:383
msgid "Syncing…"
msgstr "Sincronizando…"
@ -84,42 +85,42 @@ msgstr "_Exibir os Créditos"
msgid "_Visit Website"
msgstr "Visite o site"
#: ../SparkleShare/SparkleController.cs:422
#: ../SparkleShare/SparkleController.cs:455
msgid "ddd MMM d, yyyy"
msgstr "ddd d MMM yyyy"
#: ../SparkleShare/SparkleController.cs:427
#: ../SparkleShare/SparkleController.cs:460
msgid "ddd MMM d"
msgstr "ddd d MMM"
#: ../SparkleShare/SparkleController.cs:629
#: ../SparkleShare/SparkleController.cs:661
#, csharp-format
msgid "added {0}"
msgstr "incluído '{0}'"
#: ../SparkleShare/SparkleController.cs:634
#: ../SparkleShare/SparkleController.cs:666
#, csharp-format
msgid "moved {0}"
msgstr "'{0}' movida"
#: ../SparkleShare/SparkleController.cs:639
#: ../SparkleShare/SparkleController.cs:671
#, csharp-format
msgid "edited {0}"
msgstr "editado '{0}'"
#: ../SparkleShare/SparkleController.cs:644
#: ../SparkleShare/SparkleController.cs:676
#, csharp-format
msgid "deleted {0}"
msgstr "excluído '{0}'"
#: ../SparkleShare/SparkleController.cs:653
#: ../SparkleShare/SparkleController.cs:685
#, csharp-format
msgid "and {0} more"
msgid_plural "and {0} more"
msgstr[0] "e {0} mais"
msgstr[1] "e {0} mais"
#: ../SparkleShare/SparkleController.cs:657
#: ../SparkleShare/SparkleController.cs:689
msgid "did something magical"
msgstr "Algo mágico aconteceu"
@ -321,73 +322,69 @@ msgstr "Aprenda a hospedar o seu próprio SparkleServer"
msgid "Recent Events"
msgstr ""
#: ../SparkleShare/SparkleEventLog.cs:131
#: ../SparkleShare/SparkleEventLog.cs:150
#: ../SparkleShare/SparkleEventLog.cs:148
#: ../SparkleShare/SparkleEventLog.cs:173
msgid "All Folders"
msgstr ""
#: ../SparkleShare/SparkleShare.cs:56
#: ../SparkleShare/SparkleShare.cs:53
msgid "Sorry, you can't run SparkleShare with these permissions."
msgstr "Descuple, você não pode rodar o SparkleShare sem essas permissões."
#: ../SparkleShare/SparkleShare.cs:57
#: ../SparkleShare/SparkleShare.cs:54
msgid "Things would go utterly wrong."
msgstr "Algo vai dar muito errado."
#: ../SparkleShare/SparkleShare.cs:66
msgid "Don't show the notification icon"
msgstr "Não exibir o ícone de notificação"
#: ../SparkleShare/SparkleShare.cs:67
#: ../SparkleShare/SparkleShare.cs:61
msgid "Print version information"
msgstr "Imprimir informações da versão"
#: ../SparkleShare/SparkleShare.cs:68
#: ../SparkleShare/SparkleShare.cs:62
msgid "Show this help text"
msgstr "Exibir esse texto de ajuda"
#: ../SparkleShare/SparkleShare.cs:115
#: ../SparkleShare/SparkleShare.cs:109
msgid "SparkleShare, a collaboration and sharing tool."
msgstr "SparkleShare, uma ferramenta de colaboração e compartilhamento"
#: ../SparkleShare/SparkleShare.cs:116
#: ../SparkleShare/SparkleShare.cs:110
msgid "Copyright (C) 2010 Hylke Bons"
msgstr "Copyright (C) 2010 Hylke Bons - Todos os direitos reservados"
#: ../SparkleShare/SparkleShare.cs:118
#: ../SparkleShare/SparkleShare.cs:112
msgid "This program comes with ABSOLUTELY NO WARRANTY."
msgstr "Este programa vem com ABSOLUTAMENTE NENHUMA GARANTIA."
#: ../SparkleShare/SparkleShare.cs:120
#: ../SparkleShare/SparkleShare.cs:114
msgid "This is free software, and you are welcome to redistribute it "
msgstr "Este é um software livre, e você está convidado a distribuí-lo"
#: ../SparkleShare/SparkleShare.cs:121
#: ../SparkleShare/SparkleShare.cs:115
msgid "under certain conditions. Please read the GNU GPLv3 for details."
msgstr ""
"sob certas condições. Por favor leia a licença GNU GPLv3 para mais detalhes."
#: ../SparkleShare/SparkleShare.cs:123
#: ../SparkleShare/SparkleShare.cs:117
msgid "SparkleShare automatically syncs Git repositories in "
msgstr "O SparkleShare sincroniza os repositórios do Git automaticamente"
#: ../SparkleShare/SparkleShare.cs:124
#: ../SparkleShare/SparkleShare.cs:118
msgid "the ~/SparkleShare folder with their remote origins."
msgstr "a pasta ~/SparkleShare com suas origens remotas"
#: ../SparkleShare/SparkleShare.cs:126
#: ../SparkleShare/SparkleShare.cs:120
msgid "Usage: sparkleshare [start|stop|restart] [OPTION]..."
msgstr "Utilização: sparkleshare [start|stop|restart] [OPÇÕES]..."
#: ../SparkleShare/SparkleShare.cs:127
#: ../SparkleShare/SparkleShare.cs:121
msgid "Sync SparkleShare folder with remote repositories."
msgstr "Sincroniza a pasta SparkleShare com repositórios remotos."
#: ../SparkleShare/SparkleShare.cs:129
#: ../SparkleShare/SparkleShare.cs:123
msgid "Arguments:"
msgstr "Argumentos:"
#: ../SparkleShare/SparkleShare.cs:139
#: ../SparkleShare/SparkleShare.cs:133
msgid "SparkleShare "
msgstr "SparkleShare"
@ -417,11 +414,11 @@ msgstr "Ligar as notificações"
msgid "Quit"
msgstr "Sair"
#: ../SparkleShare/SparkleUI.cs:96
#: ../SparkleShare/SparkleUI.cs:99
msgid "Ouch! Mid-air collision!"
msgstr "Ops! Colisão em pleno vôo!"
#: ../SparkleShare/SparkleUI.cs:97
#: ../SparkleShare/SparkleUI.cs:100
msgid "Don't worry, SparkleShare made a copy of each conflicting file."
msgstr ""
"Não se preocupe, SparkleShare fez uma cópia de cada arquivo conflitante."

Some files were not shown because too many files have changed in this diff Show more