Merge branch 'master' into HEAD

Conflicts:
	app/models/post.rb
	app/models/user.rb
	config/initializers/socket.rb
This commit is contained in:
Raphael 2010-09-24 09:13:30 -07:00
commit 70a22ae839
155 changed files with 3897 additions and 1115 deletions

1
.gitignore vendored
View file

@ -13,3 +13,4 @@ gpg/diaspora-production/*.gpg
gpg/*/random_seed
public/uploads/*
.rvmrc
config/app_config.yml

View file

@ -1 +1,23 @@
Diaspora is copyright Diaspora Inc., 2010, and files herein are licensed under the Affero General Public License version 3, the text of which can be found in GNU-AGPL-3.0, unless otherwise noted. Components of Diaspora, including Rails, JQuery, and Devise, are licensed under the MIT/X11 license. Blueprint-CSS is licensed under a modified version of the MIT/X11 license. All unmodified files from these and other sources retain their original copyright and license notices: see the relevand individual files. Attribution information for Diaspora is contained in the AUTHORS file.
Diaspora is copyright Diaspora Inc., 2010, and files herein are licensed
under the Affero General Public License version 3, the text of which can
be found in GNU-AGPL-3.0, or any later version of the AGPL, unless otherwise
noted. Components of Diaspora, including Rails, JQuery, and Devise, are
licensed under the MIT/X11 license. Blueprint-CSS is licensed under a
modified version of the MIT/X11 license. All unmodified files from these
and other sources retain their original copyright and license notices: see
the relevant individual files. Attribution information for Diaspora is
contained in the AUTHORS file.
In addition, as a special exception, the copyright holders give
permission to link the code of portions of this program with the
OpenSSL library under certain conditions as described in each
individual source file, and distribute linked combinations
including the two.
You must obey the GNU Affero General Public License V3 or later in all respects
for all of the code used other than OpenSSL or the components mentioned
above. If you modify file(s) with this exception, you may extend this
exception to your version of the file(s), but you are not obligated to
do so. If you do not wish to do so, delete this exception statement from your
version. If you delete this exception statement from all source files in the
program, then also delete it here.

View file

@ -28,9 +28,12 @@ gem 'redfinger', :git => 'git://github.com/rsofaer/redfinger.git'
#EventMachine
gem 'em-http-request',:git => 'git://github.com/igrigorik/em-http-request.git', :require => 'em-http'
gem 'em-websocket'
gem 'thin'
#Websocket
gem 'em-websocket'
gem 'magent', :git => 'http://github.com/dcu/magent.git'
#File uploading
gem 'carrierwave', :git => 'git://github.com/rsofaer/carrierwave.git' , :branch => 'master' #Untested mongomapper branch
gem 'mini_magick'

View file

@ -47,6 +47,14 @@ GIT
bcrypt-ruby (~> 2.1.2)
warden (~> 0.10.7)
GIT
remote: http://github.com/dcu/magent.git
revision: 06513f3dac812469a55f2e365c349af4d2abc92a
specs:
magent (0.4.2)
mongo (>= 0.1.0)
uuidtools (>= 2.0.0)
GIT
remote: http://github.com/jnunemaker/mongomapper.git
revision: 931dab779011aa7acf60c1a4c7ad19e1ba838345
@ -206,6 +214,7 @@ GEM
treetop (1.4.8)
polyglot (>= 0.3.1)
tzinfo (0.3.23)
uuidtools (2.1.1)
warden (0.10.7)
rack (>= 1.0.0)
webmock (1.3.5)
@ -235,6 +244,7 @@ DEPENDENCIES
haml
jnunemaker-validatable (= 1.8.4)!
json
magent!
mini_magick
mocha
mongo_mapper (= 0.8.4)!

236
README.md
View file

@ -1,218 +1,60 @@
## Commit Guidlines
You are welcome to contribute, add and extend Diaspora however you see fit. We will do our best to incorporate everything that meets our guidelines.
All commits must be tested, and after each commit, all tests should be green before a pull request is sent. Please write your tests in Rspec or Test-Unit.
You are welcome to contribute, add to and extend Diaspora however you see fit. We
will do our best to incorporate everything that meets our guidelines.
GEMS: We would like to keep external dependencies unduplicated. We're using Nokogiri, and Mongomapper, and EM::HttpRequest as much as possible. We have a few gems in the project we'd rather not use, but if you can, use dependencies we already have.
We need you to fill out a
[contributor agreement form](https://spreadsheets.google.com/a/joindiaspora.com/viewform?formkey=dGI2cHA3ZnNHLTJvbm10LUhXRTJjR0E6MQ&theme=0AX42CRMsmRFbUy1iOGYwN2U2Mi1hNWU0LTRlNjEtYWMyOC1lZmU4ODg1ODc1ODI&ifq)
before we can accept your patches. The agreement gives Diaspora joint
ownership of the patch so the copyright isn't scattered. You can find it
[here](https://spreadsheets.google.com/a/joindiaspora.com/viewform?formkey=dGI2cHA3ZnNHLTJvbm10LUhXRTJjR0E6MQ&theme=0AX42CRMsmRFbUy1iOGYwN2U2Mi1hNWU0LTRlNjEtYWMyOC1lZmU4ODg1ODc1ODI&ifq).
All commits must be tested, and after each commit, all tests should be green
before a pull request is sent. Please write your tests in Rspec.
GEMS: We would like to keep external dependencies unduplicated. We're using
Nokogiri, Mongomapper, and EM::HttpRequest as much as possible. We have a few
gems in the project we'd rather not use, but if you can, use dependencies we
already have.
# Diaspora
The privacy aware, personally controlled, do-it-all, open source social network.
The privacy aware, personally controlled, do-it-all, open source social
network.
**DISCLAIMER: THIS IS PRE-ALPHA SOFTWARE AND SHOULD BE TREATED ACCORDINGLY.**
These instructions are for machines running [Ubuntu](http://www.ubuntu.com/), [Fedora](http://www.fedoraproject.org) or Mac OS X. We are developing Diaspora for the latest and greatest browsers, so please update your Firefox, Chrome or Safari to the latest and greatest.
**PLEASE, DO NOT RUN IN PRODUCTION. IT IS FUN TO GET RUNNING, BUT EXPECT THINGS
TO BE BROKEN**
## Preparing your system
In order to run Diaspora, you will need to download the following dependencies (specific instructions follow):
Some initial installation instructions are [here](http://github.com/diaspora/diaspora/wiki/Installing-and-Running-Diaspora).
- Build Tools - Packages needed to compile the components that follow.
- [Ruby](http://www.ruby-lang.org) - The Ruby programming language. (We're using **1.8.7**. It comes preinstalled on Mac OS X.)
- [MongoDB](http://www.mongodb.org) - A snappy noSQL database.
- [OpenSSL](http://www.openssl.org/) - An encryption library. (It comes preinstalled on Mac OS X and Ubuntu.)
- [ImageMagick](http://www.imagemagick.org/) - An Image processing library used to resize uploaded photos.
- [Git](http://git-scm.com/) - The fast version control system.
We are continuing to build features and improve the code base.
When we think it is ready for general use, we will post more final
instructions.
After you have Ruby installed on your system, you will need to get RubyGems, then install Bundler:
- [RubyGems](http://rubygems.org/) - Source for Ruby gems.
- [Bundler](http://gembundler.com/) - Gem management tool for Ruby projects.
**We suggest using a package management system to download these dependencies. Trust us, it's going to make your life a lot easier. If you're using Mac OS X, you can use [homebrew](http://mxcl.github.com/homebrew/); if you're using Ubuntu, just use [Synaptic](http://www.nongnu.org/synaptic/) (it comes pre-installed); if you're using Fedora simply use [yum](http://yum.baseurl.org/). The instructions below assume you have these installed.**
### Build Tools
To install build tools on **Ubuntu**, run the following (includes the gcc and xml parsing dependencies):
sudo apt-get install build-essential libxslt1.1 libxslt1-dev libxml2
To install build tools on **Fedora**, run the following:
sudo yum install libxslt libxslt-devel libxml2 libxml2-devel
To install build tools on **Mac OS X**, you need to download and install [Xcode](http://developer.apple.com/technologies/tools/xcode.html).
### Ruby
To install Ruby 1.8.7 on **Ubuntu**, run the following command:
sudo apt-get install ruby-full
At this time Fedora does not have Ruby 1.8.7. As a workaround it is possible to use [rvm](http://rvm.beginrescueend.com/) with a locally compiled Ruby installation. A semi automated method for doing this is available. It is highly recommended that you review the script before running it so you understand what will occur. The script can be executed by running the following command:
./script/bootstrap-fedora-diaspora.sh
After reviewing and executing the above script you will need to follow the "MongoDB" section and then you should skip all the way down to "Start Mongo".
If you're on **Mac OS X**, you already have Ruby on your system. Yay!
### MongoDB
To install MongoDB on **Ubuntu**, add the official MongoDB repository from this link:
http://www.mongodb.org/display/DOCS/Ubuntu+and+Debian+packages
For Lucid, add the following line to your /etc/apt/sources.list:
deb http://downloads.mongodb.org/distros/ubuntu 10.4 10gen
And then run:
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv 7F0CEB10
sudo apt-get update
sudo apt-get install mongodb-stable
You can also run the binary directly by doing the following:
If you're running a 32-bit system, run `wget http://fastdl.mongodb.org/linux/mongodb-linux-i686-1.6.2.tgz`. If you're running a 64-bit system, run `wget http://fastdl.mongodb.org/linux/mongodb-linux-x86_64-1.6.2.tgz`.
# extract
tar xzf mongodb-linux-i686-1.4.0.tgz
# create the required data directory
sudo mkdir -p /data/db
sudo chmod -Rv 777 /data/
To install MongoDB on a x86_64 **Fedora** system, add the official MongoDB repository from MongoDB (http://www.mongodb.org/display/DOCS/CentOS+and+Fedora+Packages) into /etc/yum.repos.d/10gen.repo:
[10gen]
name=10gen Repository
baseurl=http://downloads.mongodb.org/distros/fedora/13/os/x86_64/
gpgcheck=0
enabled=1
Then use yum to install the packages:
sudo yum install mongo-stable mongo-stable-server
If you're running a 32-bit system, run `wget http://fastdl.mongodb.org/linux/mongodb-linux-i686-1.6.2.tgz`. If you're running a 64-bit system, run `wget http://fastdl.mongodb.org/linux/mongodb-linux-x86_64-1.6.2.tgz`.
# extract
tar xzf mongodb-linux-i686-1.4.0.tgz
# create the required data directory
sudo mkdir -p /data/db
sudo chmod -Rv 777 /data/
To install MongoDB on **Mac OS X**, run the following:
brew install mongo
### OpenSSL
If you're running either **Ubuntu**, **Fedora** or **Mac OS X** you already have OpenSSL installed!
### ImageMagick
To install ImageMagick on **Ubuntu**, run the following:
sudo apt-get install imagemagick libmagick9-dev
To install ImageMagick on **Fedora**, run the following:
sudo yum install ImageMagick
To install ImageMagick on **Mac OS X**, run the following:
brew install imagemagick
### Git
To install Git on **Ubuntu**, run the following:
sudo apt-get install git-core
To install Git on **Fedora**, run the following:
sudo yum install git
To install Git on **Mac OS X**, run the following:
brew install git
### Rubygems
On **Ubuntu**, run the following:
wget http://production.cf.rubygems.org/rubygems/rubygems-1.3.7.tgz
tar -xf rubygems-1.3.7.tgz
cd rubygems-1.3.7
sudo ruby setup.rb
sudo ln -s /usr/bin/gem1.8 /usr/bin/gem
On **Fedora**, run the following:
sudo yum install rubygems
On **Mac OS X**, RubyGems comes preinstalled; however, you might need to update it for use with the latest Bundler. To update RubyGems, run `sudo gem update --system`.
### Bundler
After RubyGems is updated, simply run `sudo gem install bundler` to get Bundler.
## Getting Diaspora
git clone http://github.com/diaspora/diaspora.git
If you have never used github before, their [help desk](http://help.github.com/) has a pretty awesome guide on getting setup.
## Running Diaspora
### Install required gems
To start the app server for the first time, you need to use Bundler to install Diaspora's gem depencencies. Run `bundle install` from Diaspora's root directory. Bundler will also warn you if there is a new dependency and you need to bundle install again.
### Start Mongo
If you installed the Ubuntu package, MongoDB should already be running (if not, run `service mongodb start`). If you installed the binary manually, run `sudo mongod` from where mongo is installed to start mongo.
If you installed the Fedora package, MongoDB will need to be started via `service mongodb start`. If you installed the binary manually, run `sudo mongod` from where mongo is installed to start mongo.
Diaspora will not run unless mongo is running. Mongo will not run by default, and will need to be started every time you wish to use or run the test suite for Diaspora.
### Run the app server
Once mongo is running and bundler has finished, run `bundle exec thin start` from the root Diaspora directory. This will start the app server in development mode[.](http://bit.ly/9mwtUw)
### Logging in
Run `rake db:seed:tom`, then login with user `tom` and password `evankorth`. More details in db/seeds/tom.rb.
### Testing
Diaspora's test suite uses [rspec](http://rspec.info/), a behavior driven testing framework. In order to run the tests, run `bundle exec rspec spec`.
## Resources
We are maintaining a [public tracker project](http://www.pivotaltracker.com/projects/61641) and a [roadmap](https://github.com/diaspora/diaspora/wiki/Roadmap). Also, you can file [bug reports](https://github.com/diaspora/diaspora/issues) right here on github.
We are maintaining a
[public tracker project](http://www.pivotaltracker.com/projects/61641)
and a
[roadmap](https://github.com/diaspora/diaspora/wiki/Roadmap). Also, you can
file [bug reports](https://github.com/diaspora/diaspora/issues) right here on
github.
Ongoing discussion:
- [Diaspora Developer Google Group](http://groups.google.com/group/diaspora-dev)
- [Diaspora Discussion Google Group](http://groups.google.com/group/diaspora-discuss)
- [#diaspora-dev](irc://irc.freenode.net/#diaspora-dev)
- [Diaspora Q&A site](http://diaspora.shapado.com/)
- [#diaspora-dev IRC channel](irc://irc.freenode.net/#diaspora-dev)
([join via the web client](http://webchat.freenode.net?channels=diaspora-dev))
More general info and updates about the project can be found on our [blog](http://joindiaspora.com), [twitter](http://twitter.com/joindiaspora). Also, be sure to join the official [mailing list](http://http://eepurl.com/Vebk).
## License
Copyright 2010 Diaspora Inc.
Diaspora is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
Diaspora 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 Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License along with Diaspora. If not, see <http://www.gnu.org/licenses/>.
More general info and updates about the project can be found on:
[Our blog](http://joindiaspora.com),
[and on Twitter](http://twitter.com/joindiaspora).
Also, be sure to join the official [mailing list](http://http://eepurl.com/Vebk).
If you wish to contact us privately about any exploits in Diaspora you may
find, you can email
[exploits@joindiaspora.com](mailto:exploits@joindiaspora.com).

View file

@ -9,14 +9,18 @@ class AlbumsController < ApplicationController
respond_to :json, :only => [:index, :show]
def index
@albums = current_user.albums_by_aspect(@aspect).paginate
@albums = current_user.albums_by_aspect(@aspect).paginate :page => params[:page], :per_page => 9, :order => 'created_at DESC'
@aspect = :all
respond_with @albums, :aspect => @aspect
end
def create
aspect = params[:album][:to]
@album = current_user.post(:album, params[:album])
flash[:notice] = "You've created an album called #{@album.name}."
aspect = params[:album][:to]
data = clean_hash(params[:album])
@album = current_user.post(:album, data)
flash[:notice] = I18n.t 'albums.create.success', :name => @album.name
redirect_to :action => :show, :id => @album.id, :aspect => aspect
end
@ -25,34 +29,43 @@ class AlbumsController < ApplicationController
end
def destroy
@album = Album.find_by_id params[:id]
@album = current_user.find_visible_post_by_id params[:id]
@album.destroy
flash[:notice] = "Album #{@album.name} deleted."
flash[:notice] = I18n.t 'albums.destroy.success', :name => @album.name
respond_with :location => albums_url
end
def show
@photo = Photo.new
@album = Album.find_by_id params[:id]
@album = current_user.find_visible_post_by_id( params[:id] )
@album_photos = @album.photos
respond_with @album
end
def edit
@album = Album.find_by_id params[:id]
@album = current_user.find_visible_post_by_id params[:id]
redirect_to @album unless current_user.owns? @album
end
def update
@album = Album.find_params_by_id params[:id]
if @album.update_attributes params[:album]
flash[:notice] = "Album #{@album.name} successfully edited."
@album = current_user.find_visible_post_by_id params[:id]
data = clean_hash(params[:album])
if current_user.update_post( @album, data )
flash[:notice] = I18n.t 'albums.update.success', :name => @album.name
respond_with @album
else
flash[:error] = "Failed to edit album #{@album.name}."
flash[:error] = I18n.t 'albums.update.failure', :name => @album.name
render :action => :edit
end
end
private
def clean_hash(params)
return {
:name => params[:name],
:to => params[:to]
}
end
end

View file

@ -16,7 +16,7 @@ class AspectsController < ApplicationController
def create
@aspect = current_user.aspect params[:aspect]
flash[:notice] = "Click on the plus on the left side to tell Diaspora who can see your new aspect."
flash[:notice] = I18n.t('aspects.create.success')
respond_with :location => aspects_manage_path
end
@ -25,14 +25,20 @@ class AspectsController < ApplicationController
end
def destroy
@aspect = Aspect.find_by_id params[:id]
@aspect.destroy
flash[:notice] = "You are no longer sharing the aspect called #{@aspect.name}."
respond_with :location => aspects_url
@aspect = current_user.aspect_by_id params[:id]
begin
current_user.drop_aspect @aspect
flash[:notice] = i18n.t 'aspects.destroy.success',:name => @aspect.name
rescue RuntimeError => e
flash[:error] = e.message
end
respond_with :location => aspects_manage_path
end
def show
@aspect = Aspect.find_by_id params[:id]
@aspect = current_user.aspect_by_id params[:id]
@friends = @aspect.people
@posts = current_user.visible_posts( :by_members_of => @aspect ).paginate :per_page => 15, :order => 'created_at DESC'
@ -41,13 +47,15 @@ class AspectsController < ApplicationController
def manage
@aspect = :manage
@remote_requests = Request.for_user current_user
@remote_requests = Request.for_user(current_user).all
end
def update
@aspect = Aspect.find_by_id(params[:id])
@aspect.update_attributes(params[:aspect])
flash[:notice] = "Your aspect, #{@aspect.name}, has been successfully edited."
@aspect = current_user.aspect_by_id(params[:id])
data = clean_hash(params[:aspect])
@aspect.update_attributes( data )
flash[:notice] = i18n.t 'aspects.update.success',:name => @aspect.name
respond_with @aspect
end
@ -55,26 +63,34 @@ class AspectsController < ApplicationController
params[:moves].each{ |move|
move = move[1]
unless current_user.move_friend(move)
flash[:error] = "Aspect editing failed for friend #{Person.find_by_id( move[:friend_id] ).real_name}."
redirect_to Aspect.first, :action => "edit"
flash[:error] = i18n.t 'aspects.move_friends.failure', :real_name => Person.find_by_id( move[:friend_id] ).real_name
redirect_to aspects_manage_path
return
end
}
flash[:notice] = "Aspects edited successfully."
redirect_to Aspect.first, :action => "edit"
flash[:notice] = i18n.t 'aspects.move_friends.success'
redirect_to aspects_manage_path
end
def move_friend
unless current_user.move_friend( :friend_id => params[:friend_id], :from => params[:from], :to => params[:to][:to])
flash[:error] = "didn't work #{params.inspect}"
flash[:error] = I18n.t 'aspects.move_friend.error',:inspect => params.inspect
end
if aspect = Aspect.first(:id => params[:to][:to])
flash[:notice] = "You are now showing your friend a different aspect of yourself."
respond_with aspect
if aspect = current_user.aspect_by_id(params[:to][:to])
flash[:notice] = I18n.t 'aspects.move_friend.success'
render :nothing => true
else
flash[:notice] = "You are now showing your friend a different aspect of yourself."
respond_with Person.first(:id => params[:friend_id])
flash[:notice] = I18n.t 'aspects.move_friend.failure'
render aspects_manage_path
end
end
private
def clean_hash(params)
return {
:name => params[:name]
}
end
end

View file

@ -10,16 +10,11 @@ class CommentsController < ApplicationController
respond_to :json, :only => :show
def create
target = Post.find_by_id params[:comment][:post_id]
target = current_user.find_visible_post_by_id params[:comment][:post_id]
text = params[:comment][:text]
@comment = current_user.comment text, :on => target
render :nothing => true
end
def show
@comment = Comment.find_by_id params[:id]
respond_with @comment
end
end

View file

@ -7,24 +7,6 @@ class DevUtilitiesController < ApplicationController
before_filter :authenticate_user!, :except => [:set_backer_number]
include ApplicationHelper
include RequestsHelper
def warzombie
render :nothing => true
if current_user.email == "tom@tom.joindiaspora.com" && StatusMessage.where(:message => "There's a bomb in the lasagna!?").first == nil
current_user.post(:status_message, :message => "There's a bomb in the lasagna!?")
current_user.post(:status_message, :message => "xkcd \nhttp://xkcd.com/743/" )
current_user.post(:status_message, :message => "I switched to Motoroi today, a Motorola Android-based phone, in Korea. Now, I am using Android phones in both the U.S. and Korea", :created_at => Time.now-930)
current_user.post(:status_message, :message => "I had 5 hours to study for it :-( GREs on Thursday. Wunderbar.", :created_at => Time.now-43990)
current_user.post(:status_message, :message => "Spotted in toy story 3: google maps, OSX, and windows XP. Two out of three isn't bad.", :created_at => Time.now-4390)
current_user.post(:status_message, :message => "Reddit\nhttp://reddit.com", :created_at => Time.now-54390)
current_user.post(:status_message, :message => "Commercials for IE make me SO MAD and my friends just don't get why.", :created_at => Time.now-30900)
current_user.post(:status_message, :message => "Zombo.com\nhttp://zombo.com", :created_at => Time.now-9090)
current_user.post(:status_message, :message => "Why do I have \"No More Heroes\" by Westlife on repeat all day?", :created_at => Time.now-590000)
current_user.post(:status_message, :message => "Mmm. Friday night. Acknowledged.", :created_at => Time.now-503900)
current_user.post(:status_message, :message => "Getting a universal remote is the epitome of laziness, I do declare.", :created_at => Time.now-4400)
current_user.post(:status_message, :message => "Does anyone know how to merge two Skype contact entries of the same person? (i.e. one Skype ID and one mobile number)", :created_at => Time.now-400239)
current_user.post(:status_message, :message => "A cool, cool morning for once.", :created_at => Time.now-150000)
end
end
def zombiefriends
render :nothing => true

View file

@ -11,7 +11,9 @@ class PeopleController < ApplicationController
def index
@aspects_dropdown_array = current_user.aspects.collect{|x| [x.to_s, x.id]}
@people = Person.search params[:q]
@aspect = :all
@people = Person.search(params[:q]).paginate :page => params[:page], :per_page => 25, :order => 'created_at DESC'
respond_with @people
end
@ -20,7 +22,7 @@ class PeopleController < ApplicationController
@profile = @person.profile
@aspects_with_person = current_user.aspects_with_person(@person)
@aspects_dropdown_array = current_user.aspects.collect{|x| [x.to_s, x.id]}
@posts = current_user.visible_posts_from_others(:from => @person).paginate :page => params[:page], :order => 'created_at DESC'
@posts = current_user.visible_posts(:from => @person).paginate :page => params[:page], :order => 'created_at DESC'
@latest_status_message = current_user.raw_visible_posts.find_all_by__type_and_person_id("StatusMessage", params[:id]).last
@post_count = @posts.count
respond_with @person

View file

@ -10,9 +10,7 @@ class PhotosController < ApplicationController
respond_to :json, :only => :show
def create
album = Album.find_by_id params[:album_id]
begin
######################## dealing with local files #############
@ -33,22 +31,26 @@ class PhotosController < ApplicationController
params[:user_file] = file
@photo = current_user.post(:photo, params)
data = clean_hash(params)
@photo = current_user.post(:photo, data)
respond_to do |format|
format.json{render(:layout => false , :json => {"success" => true, "data" => @photo}.to_json )}
end
rescue TypeError
message = "Photo upload failed. Are you sure an image was added?"
message = I18n.t 'photos.create.type_error'
respond_with :location => album, :error => message
rescue CarrierWave::IntegrityError
message = "Photo upload failed. Are you sure that was an image?"
message = I18n.t 'photos.create.integrity_error'
respond_with :location => album, :error => message
rescue RuntimeError => e
message = "Photo upload failed. Are you sure that your seatbelt is fastened?"
message = I18n.t 'photos.create.runtime_error'
respond_with :location => album, :error => message
raise e
end
@ -61,34 +63,55 @@ class PhotosController < ApplicationController
end
def destroy
@photo = Photo.find_by_id params[:id]
@photo = current_user.find_visible_post_by_id params[:id]
@photo.destroy
flash[:notice] = "Photo deleted."
flash[:notice] = I18n.t 'photos.destroy.notice'
respond_with :location => @photo.album
end
def show
@photo = Photo.find_by_id params[:id]
@photo = current_user.find_visible_post_by_id params[:id]
@album = @photo.album
respond_with @photo, @album
end
def edit
@photo = Photo.find_by_id params[:id]
@photo = current_user.find_visible_post_by_id params[:id]
@album = @photo.album
redirect_to @photo unless current_user.owns? @album
end
def update
@photo = Photo.find_by_id params[:id]
if @photo.update_attributes params[:photo]
flash[:notice] = "Photo successfully updated."
@photo = current_user.find_visible_post_by_id params[:id]
data = clean_hash(params)
if current_user.update_post( @photo, data[:photo] )
flash[:notice] = I18n.t 'photos.update.notice'
respond_with @photo
else
flash[:error] = "Failed to edit photo."
flash[:error] = I18n.t 'photos.update.error'
render :action => :edit
end
end
private
def clean_hash(params)
if params[:photo]
return {
:photo => {
:caption => params[:photo][:caption],
}
}
else
return{
:album_id => params[:album_id],
:user_file => params[:user_file]
}
end
end
end

View file

@ -10,7 +10,6 @@ class PublicsController < ApplicationController
def hcard
@person = Person.find_by_id params[:id]
puts @person
unless @person.nil? || @person.owner.nil?
render 'hcard'
end
@ -21,9 +20,11 @@ class PublicsController < ApplicationController
end
def webfinger
@person = Person.by_webfinger(params[:q])
@person = Person.by_webfinger(params[:q], :local => true) if params[:q]
unless @person.nil? || @person.owner.nil?
render 'webfinger', :content_type => 'application/xrd+xml'
else
render :nothing => true
end
end
@ -31,9 +32,10 @@ class PublicsController < ApplicationController
render :nothing => true
return unless params[:xml]
begin
@user = Person.first(:id => params[:id]).owner
person = Person.first(:id => params[:id])
@user = person.owner
rescue NoMethodError => e
Rails.logger.error("Received post #{params[:xml]} for nonexistent person #{params[:id]}")
Rails.logger.error("Received post for nonexistent person #{params[:id]}")
return
end
@user.receive_salmon params[:xml]

View file

@ -15,9 +15,7 @@ class RegistrationsController < Devise::RegistrationsController
flash[:error] = e.message
end
if user
#set_flash_message :notice, :signed_up
flash[:notice] = "You've joined Diaspora!"
#redirect_to root_url
flash[:notice] = I18n.t 'registrations.create.success'
sign_in_and_redirect(:user, user)
else
redirect_to new_user_registration_path

View file

@ -13,15 +13,15 @@ class RequestsController < ApplicationController
if params[:accept]
if params[:aspect_id]
@friend = current_user.accept_and_respond( params[:id], params[:aspect_id])
flash[:notice] = "You are now friends."
flash[:notice] = I18n.t 'requests.destroy.success'
respond_with :location => current_user.aspect_by_id(params[:aspect_id])
else
flash[:error] = "Please select an aspect!"
flash[:error] = I18n.t 'requests.destroy.error'
respond_with :location => requests_url
end
else
current_user.ignore_friend_request params[:id]
flash[:notice] = "Ignored friend request."
flash[:notice] = I18n.t 'requests.destroy.ignore'
respond_with :location => requests_url
end
end
@ -36,27 +36,31 @@ class RequestsController < ApplicationController
begin
rel_hash = relationship_flow(params[:request][:destination_url])
rescue Exception => e
flash[:error] = "No diaspora seed found with this email!"
raise e unless e.message.include? "not found"
flash[:error] = I18n.t 'requests.create.error'
respond_with :location => aspect
return
end
# rel_hash = {:friend => params[:friend_handle]}
Rails.logger.debug("Sending request: #{rel_hash}")
begin
@request = current_user.send_friend_request_to(rel_hash[:friend], aspect)
rescue Exception => e
raise e unless e.message.include? "already friends"
flash[:notice] = "You are already friends with #{params[:request][:destination_url]}!"
raise e unless e.message.include? "already"
flash[:notice] = I18n.t 'requests.create.already_friends', :destination_url => params[:request][:destination_url]
respond_with :location => aspect
return
end
if @request
flash[:notice] = "A friend request was sent to #{@request.destination_url}."
flash[:notice] = I18n.t 'requests.create.success',:destination_url => @request.destination_url
respond_with :location => aspect
else
flash[:error] = "Something went horribly wrong."
flash[:error] = I18n.t 'requests.create.horribly_wrong'
respond_with :location => aspect
end
end

View file

@ -14,7 +14,7 @@ class SocketsController < ApplicationController
def outgoing(uid,object,opts={})
@_request = ActionDispatch::Request.new({})
Diaspora::WebSocket.push_to_user(uid, action_hash(uid, object, opts))
Diaspora::WebSocket.queue_to_user(uid, action_hash(uid, object, opts))
end
end

View file

@ -11,18 +11,29 @@ class StatusMessagesController < ApplicationController
def create
params[:status_message][:to] = params[:aspect_ids]
@status_message = current_user.post(:status_message, params[:status_message])
data = clean_hash params[:status_message]
@status_message = current_user.post(:status_message, data)
respond_with @status_message
end
def destroy
@status_message = StatusMessage.find_by_id params[:id]
@status_message = current_user.find_visible_post_by_id params[:id]
@status_message.destroy
respond_with :location => root_url
end
def show
@status_message = StatusMessage.find_by_id params[:id]
@status_message = current_user.find_visible_post_by_id params[:id]
respond_with @status_message
end
private
def clean_hash(params)
return {
:message => params[:message],
:to => params[:to]
}
end
end

View file

@ -7,13 +7,6 @@ class UsersController < ApplicationController
before_filter :authenticate_user!, :except => [:new, :create]
respond_to :html
respond_to :json, :only => :show
def show
@user = User.find_by_id params[:id]
@user_profile = @user.person.profile
respond_with @user
end
def edit
@user = current_user
@ -23,15 +16,16 @@ class UsersController < ApplicationController
end
def update
@user = User.find_by_id params[:id]
prep_image_url(params[:user])
@user = current_user
@user.update_profile params[:user]
data = clean_hash params[:user]
prep_image_url(data)
@user.update_profile data
respond_with(@user, :location => root_url)
end
private
def prep_image_url(params)
if params[:profile][:image_url].empty?
params[:profile].delete(:image_url)
@ -39,4 +33,16 @@ class UsersController < ApplicationController
params[:profile][:image_url] = "http://" + request.host + ":" + request.port.to_s + params[:profile][:image_url]
end
end
def clean_hash(params)
return {
:profile =>
{
:first_name => params[:profile][:first_name],
:last_name => params[:profile][:last_name],
:image_url => params[:profile][:image_url]
}
}
end
end

View file

@ -6,17 +6,17 @@
module AlbumsHelper
def friends_albums_link
if params[:friends]
"Friends Albums"
I18n.t('albums.helper.friends_albums')
else
link_to 'Friends Albums', albums_path({:friends => true})
link_to I18n.t('albums.helper.friends_albums'), albums_path({:friends => true})
end
end
def your_albums_link
if params[:friends]
link_to 'Your Albums', albums_path
link_to I18n.t('albums.helper.your_albums'), albums_path
else
'Your Albums'
I18n.t('albums.helper.your_albums')
end
end
end

View file

@ -4,12 +4,12 @@
module ApplicationHelper
def current_aspect?(aspect)
!@aspect.is_a?(Symbol) && @aspect.id == aspect.id
end
def object_path(object, opts = {})
object = object.person if object.is_a? User
eval("#{object.class.to_s.underscore}_path(object, opts)")
end
@ -27,7 +27,7 @@ module ApplicationHelper
end
def how_long_ago(obj)
"#{time_ago_in_words(obj.created_at)} ago."
"#{time_ago_in_words(obj.created_at)} ago"
end
def person_url(person)
@ -37,16 +37,16 @@ module ApplicationHelper
when "Person"
person_path(person)
else
"unknown person"
I18n.t('application.helper.unknown_person')
end
end
def owner_image_tag
person_image_tag(current_user)
person_image_tag(current_user.person)
end
def owner_image_link
person_image_link(current_user)
person_image_link(current_user.person)
end
def person_image_tag(person)
@ -61,11 +61,10 @@ module ApplicationHelper
end
def new_request(request_count)
"new_requests" if request_count > 0
I18n.t('application.helper.new_requests') if request_count > 0
end
def post_yield_tag(post)
(':' + post.id.to_s).to_sym
end
end

View file

@ -7,4 +7,12 @@ module AspectsHelper
def link_for_aspect( aspect )
link_to aspect.name, aspect
end
def remove_link( aspect )
if aspect.people.size == 0
link_to I18n.t('aspects.helper.remove'), aspect, :method => :delete
else
"<span class='grey' title=#{I18n.t('aspects.helper.aspect_not_empty')}>#{I18n.t('aspects.helper.remove')}</span>"
end
end
end

View file

@ -4,8 +4,7 @@
module DashboardsHelper
def title_for_page
'home'
I18n.t('dashboards.helper.home')
end
end

View file

@ -7,8 +7,8 @@ module ErrorMessagesHelper
# Render error messages for the given objects. The :message and :header_message options are allowed.
def error_messages_for(*objects)
options = objects.extract_options!
options[:header_message] ||= "Invalid Fields"
options[:message] ||= "Correct the following errors and try again."
options[:header_message] ||= I18n.t('error_messages.helper.invalid_fields')
options[:message] ||= I18n.t('error_messages.helper.correct_the_following_errors_and_try_again')
messages = objects.compact.map { |o| o.errors.full_messages }.flatten
unless messages.empty?
content_tag(:div, :class => "error_messages") do

View file

@ -7,9 +7,9 @@ module PeopleHelper
def search_or_index
if params[:q]
" results for #{params[:q]}"
I18n.t 'people.helper.results_for',:params => params[:q]
else
" people on pod is aware of"
I18n.t "people.helper.people_on_pod_are_aware_of"
end
end

View file

@ -4,7 +4,6 @@
module PhotosHelper
def linked_scaled_photo(photo, album)
link_to (image_tag photo.url(:scaled_full)), photo_path(album.next_photo(photo)), :rel => "prefetch"
end

View file

@ -9,7 +9,6 @@ module PublicsHelper
subscriber ||= Subscriber.new(:url => opts[:callback], :topic => opts[:topic])
if subscriber.save
if opts[:verify] == 'sync'
204
elsif opts[:verify] == 'async'

View file

@ -4,7 +4,6 @@
module RequestsHelper
def subscription_mode(profile)
if diaspora?(profile)
:friend
@ -39,5 +38,4 @@ module RequestsHelper
end
{ action => person }
end
end

View file

@ -33,7 +33,4 @@ module SocketsHelper
action_hash.to_json
end
end

View file

@ -8,7 +8,7 @@ module StatusMessagesHelper
unless @latest_status_message.nil?
return @latest_status_message.message
else
return "No message to display."
return I18n.t('status_messages.helper.no_message_to_display')
end
end
end

View file

@ -39,5 +39,6 @@ class Aspect
}
}
end
end

View file

@ -34,11 +34,9 @@ class Person
validates_format_of :url, :with =>
/^(https?):\/\/[a-z0-9]+([\-\.]{1}[a-z0-9]+)*(\.[a-z]{2,5})?(:[0-9]{1,5})?(\/.*)?$/ix
def self.search(query)
Person.all('$where' => "function() { return this.diaspora_handle.match(/^#{query}/i) ||
this.profile.first_name.match(/^#{query}/i) ||
this.profile.last_name.match(/^#{query}/i); }")
query = Regexp.escape( query.to_s.strip )
Person.all('profile.first_name' => /^#{query}/i) | Person.all('profile.last_name' => /^#{query}/i)
end
def real_name
@ -78,18 +76,23 @@ class Person
@serialized_key = new_key
end
def self.by_webfinger( identifier )
local_person = Person.first(:diaspora_handle => identifier.gsub('acct:', ''))
def self.by_webfinger( identifier, opts = {})
#need to check if this is a valid email structure, maybe should do in JS
local_person = Person.first(:diaspora_handle => identifier.gsub('acct:', '').to_s.downcase)
if local_person
Rails.logger.info("Do not need to webfinger, found a local person #{local_person.real_name}")
local_person
elsif !identifier.include?("localhost")
elsif !identifier.include?("localhost") && !opts[:local]
begin
Rails.logger.info("Webfingering #{identifier}")
f = Redfinger.finger(identifier)
rescue SocketError => e
raise "Diaspora server for #{identifier} not found" if e.message =~ /Name or service not known/
rescue Errno::ETIMEDOUT => e
raise "Connection timed out to Diaspora server for #{identifier}"
end
raise "No webfinger profile found at #{identifier}" unless f
raise "No webfinger profile found at #{identifier}" if f.nil? || f.links.empty?
Person.from_webfinger_profile(identifier, f )
end
end
@ -97,8 +100,12 @@ class Person
def self.from_webfinger_profile( identifier, profile)
new_person = Person.new
public_key = profile.links.select{|x| x.rel == 'diaspora-public-key'}.first.href
new_person.exported_key = Base64.decode64 public_key
public_key_entry = profile.links.select{|x| x.rel == 'diaspora-public-key'}
return nil unless public_key_entry
pubkey = public_key_entry.first.href
new_person.exported_key = Base64.decode64 pubkey
guid = profile.links.select{|x| x.rel == 'http://joindiaspora.com/guid'}.first.href
new_person.id = guid

View file

@ -5,6 +5,7 @@
class Post
require File.expand_path('../../../lib/encryptable', __FILE__)
require File.expand_path('../../../lib/diaspora/websocket', __FILE__)
include MongoMapper::Document
include ApplicationHelper
include ROXML
@ -17,7 +18,7 @@ class Post
key :person_id, ObjectId
key :user_refs, Integer, :default => 0
many :comments, :class_name => 'Comment', :foreign_key => :post_id
many :comments, :class_name => 'Comment', :foreign_key => :post_id, :order => 'created_at ASC'
belongs_to :person, :class_name => 'Person'
timestamps!

View file

@ -26,8 +26,8 @@ class Request
validates_presence_of :destination_url, :callback_url
before_validation :clean_link
scope :for_user, lambda{ |user| where(:destination_url => user.receive_url) }
scope :from_user, lambda{ |user| where(:destination_url.ne => user.receive_url) }
scope :for_user, lambda{ |user| where(:destination_url => user.person.receive_url) }
scope :from_user, lambda{ |user| where(:destination_url.ne => user.person.receive_url) }
def self.instantiate(options = {})
person = options[:from]

View file

@ -5,12 +5,14 @@
require File.expand_path('../../../lib/diaspora/user/friending', __FILE__)
require File.expand_path('../../../lib/diaspora/user/querying', __FILE__)
require File.expand_path('../../../lib/diaspora/user/receiving', __FILE__)
require File.expand_path('../../../lib/salmon/salmon', __FILE__)
class User
include MongoMapper::Document
include Diaspora::UserModules::Friending
include Diaspora::UserModules::Querying
include Diaspora::UserModules::Receiving
include Encryptor::Private
QUEUE = MessageHandler.new
@ -23,8 +25,6 @@ class User
key :visible_post_ids, Array
key :visible_person_ids, Array
key :url, String
one :person, :class_name => 'Person', :foreign_key => :owner_id
many :friends, :in => :friend_ids, :class_name => 'Person'
@ -34,7 +34,6 @@ class User
many :aspects, :class_name => 'Aspect'
after_create :seed_aspects
before_validation_on_create :downcase_username
@ -65,6 +64,15 @@ class User
Aspect.create(opts)
end
def drop_aspect( aspect )
if aspect.people.size == 0
aspect.destroy
else
raise "Aspect not empty"
end
end
def move_friend( opts = {})
return true if opts[:to] == opts[:from]
friend = Person.first(:_id => opts[:friend_id])
@ -87,7 +95,6 @@ class User
######## Posting ########
def post(class_name, options = {})
if class_name == :photo
raise ArgumentError.new("No album_id given") unless options[:album_id]
aspect_ids = aspects_with_post( options[:album_id] )
@ -96,17 +103,47 @@ class User
aspect_ids = options.delete(:to)
end
aspect_ids = [aspect_ids.to_s] if aspect_ids.is_a? BSON::ObjectId
raise ArgumentError.new("You must post to someone.") if aspect_ids.nil? || aspect_ids.empty?
aspect_ids = validate_aspect_permissions(aspect_ids)
intitial_post(class_name, aspect_ids, options)
end
def intitial_post(class_name, aspect_ids, options = {})
post = build_post(class_name, options)
post.socket_to_uid(id, :aspect_ids => aspect_ids) if post.respond_to?(:socket_to_uid)
push_to_aspects(post, aspect_ids)
post
end
def repost( post, options = {} )
aspect_ids = validate_aspect_permissions(options[:to])
push_to_aspects(post, aspect_ids)
post
end
def update_post( post, post_hash = {} )
if self.owns? post
post.update_attributes(post_hash)
end
end
def validate_aspect_permissions(aspect_ids)
aspect_ids = [aspect_ids.to_s] if aspect_ids.is_a? BSON::ObjectId
if aspect_ids.nil? || aspect_ids.empty?
raise ArgumentError.new("You must post to someone.")
end
aspect_ids.each do |aspect_id|
unless aspect_id == "all" || self.aspects.find(aspect_id)
raise ArgumentError.new("Cannot post to an aspect you do not own.")
end
end
aspect_ids
end
def build_post( class_name, options = {})
options[:person] = self.person
model_class = class_name.to_s.camelize.constantize
@ -209,92 +246,19 @@ class User
end
end
###### Receiving #######
def receive_salmon ciphertext
cleartext = decrypt( ciphertext)
Rails.logger.info("Received a salmon: #{cleartext}")
salmon = Salmon::SalmonSlap.parse cleartext
if salmon.verified_for_key?(salmon.author.public_key)
Rails.logger.info("data in salmon: #{salmon.data}")
self.receive(salmon.data)
end
end
def receive xml
object = Diaspora::Parser.from_xml(xml)
Rails.logger.debug("Receiving object for #{self.real_name}:\n#{object.inspect}")
Rails.logger.debug("From: #{object.person.inspect}") if object.person
if object.is_a? Retraction
if object.type == 'Person'
Rails.logger.info( "the person id is #{object.post_id} the friend found is #{visible_person_by_id(object.post_id).inspect}")
unfriended_by visible_person_by_id(object.post_id)
else
object.perform self.id
aspects = self.aspects_with_person(object.person)
aspects.each{ |aspect| aspect.post_ids.delete(object.post_id.to_id)
aspect.save
}
end
elsif object.is_a? Request
person = Diaspora::Parser.parse_or_find_person_from_xml( xml )
person.serialized_key ||= object.exported_key
object.person = person
object.person.save
old_request = Request.first(:id => object.id)
object.aspect_id = old_request.aspect_id if old_request
object.save
receive_friend_request(object)
elsif object.is_a? Profile
person = Diaspora::Parser.owner_id_from_xml xml
person.profile = object
person.save
elsif object.is_a?(Comment)
object.person = Diaspora::Parser.parse_or_find_person_from_xml( xml ).save if object.person.nil?
self.visible_people = self.visible_people | [object.person]
self.save
Rails.logger.debug("The person parsed from comment xml is #{object.person.inspect}") unless object.person.nil?
object.person.save
Rails.logger.debug("From: #{object.person.inspect}") if object.person
raise "In receive for #{self.real_name}, signature was not valid on: #{object.inspect}" unless object.post.person == self.person || object.verify_post_creator_signature
object.save
unless owns?(object)
dispatch_comment object
end
object.socket_to_uid(id) if (object.respond_to?(:socket_to_uid) && !self.owns?(object))
else
Rails.logger.debug("Saving object: #{object}")
object.user_refs += 1
object.save
self.raw_visible_posts << object
self.save
aspects = self.aspects_with_person(object.person)
aspects.each{ |aspect|
aspect.posts << object
aspect.save
object.socket_to_uid(id, :aspect_ids => [aspect.id]) if (object.respond_to?(:socket_to_uid) && !self.owns?(object))
}
end
end
###Helpers############
def self.instantiate!( opts = {} )
opts[:person][:diaspora_handle] = "#{opts[:username]}@#{opts[:url]}"
opts[:person][:diaspora_handle] = "#{opts[:username]}@#{APP_CONFIG[:terse_pod_url]}"
opts[:person][:url] = APP_CONFIG[:pod_url]
opts[:person][:serialized_key] = generate_key
User.create!(opts)
User.create(opts)
end
def seed_aspects
aspect(:name => "Family")
aspect(:name => "Work")
end
<<<<<<< HEAD
def self.create(opts ={})
puts opts.inspect
@ -305,9 +269,12 @@ class User
terse = terse.chop! if terse[-1, 1] == '/'
terse
end
=======
>>>>>>> master
def diaspora_handle
"#{self.username}@#{self.terse_url}"
"#{self.username}@#{APP_CONFIG[:terse_pod_url]}"
end
def downcase_username

View file

@ -8,7 +8,7 @@
%div.time
by
= link_to ((current_user.person == post.person)? 'you' : post.person.real_name), person_path(post.person)
= link_to ((current_user.person == post.person)? t('.you') : post.person.real_name), person_path(post.person)
%br
= link_to(how_long_ago(post), object_path(post, :aspect => @aspect))

View file

@ -3,7 +3,7 @@
-# the COPYRIGHT file.
%h1 Add a new album
%h1=t('.add_a_new_album')
= form_for Album.new do |f|
= f.error_messages
@ -11,4 +11,4 @@
= f.label :name
= f.text_field :name
= f.hidden_field :to, :value => aspect
= f.submit 'create', :class => 'button'
= f.submit t('.create'), :class => 'button'

View file

@ -6,10 +6,10 @@
.back= link_to "⇧ #{@album.name}", @album
%h1.big_text
= "Editing #{@album.name}"
= "#{t('.editing')} #{@album.name}"
.sub_header
="updated #{how_long_ago(@album)}"
="#{t('.updated')} #{how_long_ago(@album)}"
- form_for @album do |a|
= a.error_messages
@ -21,12 +21,12 @@
.photo_edit_block= image_tag photo.url(:thumb_medium)
#submit_block
= link_to "Cancel", root_path
= link_to t('.cancel'), root_path
or
= a.submit
.button.delete
= link_to 'Delete Album', @album, :confirm => 'Are you sure?', :method => :delete
= link_to t('.delete_album'), @album, :confirm => t('.are_you_sure'), :method => :delete
#content_bottom
.back

View file

@ -10,7 +10,7 @@
});
= content_for :page_title do
= link_to "◂ Home", aspects_path, :aspect => params[:aspect]
= link_to "◂ #{t('.home')}", aspects_path, :aspect => params[:aspect]
- content_for :left_pane do
= render "shared/aspect_friends"
@ -19,7 +19,7 @@
%h1
Albums
.right
= link_to 'New Album', '#new_album_pane', {:class => "button", :id => "add_album_button"}
= link_to t('.new_album'), '#new_album_pane', {:class => "button", :id => "add_album_button"}
.yo{:style => "display:none;" }
#new_album_pane
@ -34,4 +34,4 @@
#content_bottom
.back
= link_to "⇧ home", root_path
= link_to "⇧ #{t('.home')}", root_path

View file

@ -11,33 +11,32 @@
});
= content_for :page_title do
= link_to "◂ Albums", albums_path(:aspect => @aspect)
= link_to "◂ #{t('.albums')}", albums_path(:aspect => @aspect)
- content_for :left_pane do
= render "shared/aspect_friends"
- content_for :publish do
-if current_user.owns? @album
.right
=render 'photos/new_photo'
= link_to t('.edit_album'), edit_album_path(@album), :class => 'button'
%h1
= @album.name
="updated #{how_long_ago(@album)}"
="#{t('.updated')} #{how_long_ago(@album)}"
.album_id{:id => @album.id, :style => "display:hidden;"}
-unless current_user.owns? @album
%h4= "by #{@album.person.real_name}"
%h4= "#{t('.by')} #{@album.person.real_name}"
#thumbnails
- for photo in @album_photos
.image_thumb
= link_to (image_tag photo.url(:thumb_medium)), object_path(photo)
-if current_user.owns? @album
=render 'photos/new_photo'
#content_bottom
.back
= link_to "⇧ albums", albums_path
-if current_user.owns? @album
.right
= link_to 'Edit Album', edit_album_path(@album), :class => 'button'
= link_to "⇧ #{t('.albums')}", albums_path

View file

@ -3,10 +3,10 @@
-# the COPYRIGHT file.
%h1 Add a new aspect
%h1=t('.add_a_new_aspect')
= form_for Aspect.new do |f|
= f.error_messages
%p
= f.label :name
= f.text_field :name
= f.submit 'create', :class => 'button'
= f.submit t('.create'), :class => 'button'

View file

@ -4,7 +4,7 @@
- content_for :page_title do
= link_to "photos", albums_path(:aspect => @aspect)
= link_to t('.photos'), albums_path(:aspect => @aspect)
- content_for :left_pane do

View file

@ -8,24 +8,26 @@
= javascript_include_tag 'aspect-edit.js'
- content_for :left_pane do
%h1
Requests
%h1=t('.requests')
.requests
%ul
- for request in @remote_requests
%li.requested_person{:id => request.person.id, :request_id => request.id}
= person_image_tag(request.person)
.name
= request.person.real_name
%h1
Ignore/Remove
%ul.dropzone
- if @remote_requests.size < 1
%li.grey No new requests
- else
- for request in @remote_requests
%li.requested_person{:id => request.person.id, :request_id => request.id}
= person_image_tag(request.person)
.name
= request.person.real_name
%h1=t('.ignore_remove')
%li.remove
%ul
%ul.dropzone
%li.grey Drag to ignore/remove
- content_for :publish do
= link_to("add a new aspect", "#add_aspect_pane", :id => "add_aspect_button", :class => "new_aspect button", :title => "Add a new aspect")
= link_to(t('.add_a_new_aspect'), "#add_aspect_pane", :id => "add_aspect_button", :class => "new_aspect button", :title => t('.add_a_new_aspect'))
@ -34,14 +36,16 @@
%li.aspect
.aspect_name
%h1{:contenteditable => true}= aspect.name
%span.edit_name_field
%h1{:contenteditable => true}= aspect.name
%span.tip click to edit
.tools
= link_to "add a new friend", "#add_request_pane_#{aspect.id}", :class => 'add_request_button'
|
= link_to "show", aspect_path(aspect)
%ul.tools
%li= link_to t('.add_a_new_friend'), "#add_request_pane_#{aspect.id}", :class => 'add_request_button'
%li= link_to t('.show'), aspect_path(aspect)
%li!= remove_link(aspect)
%ul{:id => aspect.id}
%ul.dropzone{:id => aspect.id}
-if aspect.people.size < 1
%li.grey Drag to add people
@ -52,13 +56,9 @@
%li.person{:id => person.id, :from_aspect_id => aspect.id}
= person_image_tag(person)
.name
= person.real_name
= link_to person.real_name, person
.yo{:style => 'display:none'}
%div{:id => "add_request_pane_#{aspect.id}"}
= render "requests/new_request", :aspect => aspect
%p
%br
= link_to 'Update Aspects', '#', :class => 'button', :id => "move_friends_link"
#content_bottom

View file

@ -4,7 +4,7 @@
- content_for :page_title do
= link_to "photos", albums_path(:aspect => @aspect)
= link_to t('.photos'), albums_path(:aspect => @aspect)
- content_for :left_pane do
= render "shared/aspect_friends"

View file

@ -7,6 +7,6 @@
= person_image_tag(post.person)
%span.from
= link_to post.person.real_name, post.person
= auto_link post.text
= post.text
%div.time
= "#{time_ago_in_words(post.updated_at)} ago"
= "#{time_ago_in_words(post.updated_at)} #{t('.ago')}"

View file

@ -9,4 +9,4 @@
= f.text_area :text, :rows => 1, :id => "comment_text_on_#{post.id}", :class => "comment_box"
= f.hidden_field :post_id, :value => post.id
%p{:style => "text-align:right;"}
= f.submit "Comment", :class => "comment_submit button"
= f.submit t('.comment'), :class => "comment_submit button"

View file

@ -1,10 +1,16 @@
%h1
This is a technology preview, do not provide any private information.
%h3
your account may be deleted until we move into a more stable development period.
%h3
USE AT YOUR OWN RISK!!
= form_for(resource, :as => resource_name, :url => session_path(resource_name)) do |f|
#user
%p.username
= f.label :username
= f.text_field :username
%p.user_network
="@#{request.host}"
="@#{APP_CONFIG[:terse_pod_url]}"
%p
= f.label :password
@ -14,6 +20,7 @@
/ = f.check_box :remember_me
/ = f.label :remember_me
= f.submit "Sign in"
= link_to "Have a problem? Find an answer here", 'http://diaspora.shapado.com/'
%p
= render :partial => "devise/shared/links"

View file

@ -9,7 +9,7 @@
$(document).ready(function(){
function debug(str){ $("#debug").append("<p>" + str); };
ws = new WebSocket("ws://#{request.host}:8080/#{CGI::escape(current_user.id.to_s)}");
ws = new WebSocket("ws://#{request.host}:#{APP_CONFIG[:socket_port]}/#{CGI::escape(current_user.id.to_s)}");
//Attach onmessage to websocket
ws.onmessage = function(evt) {

View file

@ -50,8 +50,8 @@
= text_field_tag 'q'
%li= link_to current_user.real_name, current_user.person
%li= link_to "edit profile", edit_user_path(current_user)
%li= link_to "logout", destroy_user_session_path
%li= link_to t('.edit_profile'), edit_user_path(current_user)
%li= link_to t('.logout.'), destroy_user_session_path
= render "shared/aspect_nav"
= render "shared/sub_header"

View file

@ -0,0 +1,27 @@
-# Copyright (c) 2010, Diaspora Inc. This file is
-# licensed under the Affero General Public License version 3. See
-# the COPYRIGHT file.
%li.message{:id => person.id}
= person_image_link(person)
.content
%span.from
= link_to person.real_name, person_path(person)
.info
= person.diaspora_handle
.right{ :style => "display:inline;top:0;" }
- if person.id == current_user.person.id
thats you!
- elsif current_user.friends.include?(person)
Already friends
- elsif current_user.pending_requests.find_by_person_id(person.id)
= link_to =t('.pending_request'), aspects_manage_path
- else
= form_for Request.new do |f|
= f.select(:aspect_id, @aspects_dropdown_array)
= f.hidden_field :destination_url, :value => person.diaspora_handle
= f.submit t('.add_friend')

View file

@ -8,43 +8,18 @@
Search
=form_tag '/people', :method => "get" do
= text_field_tag :q
= text_field_tag :q, params[:q]
= submit_tag "search"
- content_for :left_pane do
\.
= (@people.count).to_s + search_or_index
%table
%tr
%th real name
%th diaspora handle
%th url
- for person in @people
%tr
- if current_user.friends.include? person
%td= link_to person.real_name, person
- else
%td= person.real_name
%h1
search results for
%u= params[:q]
%td= person.diaspora_handle
%td= person.url
-if current_user.friends.include? person
- elsif person.id == current_user.person.id
%td
%td that's you!
-elsif current_user.pending_requests.find_by_person_id(person.id)
%td
%td ^-you have a friend request from this person
-elsif current_user.pending_requests.find_by_url(person.receive_url)
%td
%td friend request pending
-else
%td
%td
= form_for Request.new do |f|
= f.select(:aspect_id, @aspects_dropdown_array)
= f.hidden_field :destination_url, :value => person.diaspora_handle
= f.submit "add friend"
%ul#stream
- for person in @people
= render 'people/person', :person => person
= will_paginate @people

View file

@ -3,7 +3,7 @@
-# the COPYRIGHT file.
- title "New Person"
- title=t('.new_person')
= form_for @person do |f|
= f.error_messages
@ -29,4 +29,4 @@
= f.submit
%p= link_to "Back to List", people_path
%p= link_to t('.back_to_list'), people_path

View file

@ -4,7 +4,7 @@
- content_for :page_title do
= @person.real_name
profile
- content_for :left_pane do
#profile
@ -13,19 +13,19 @@
%ul
-unless @posts.first.nil?
%li
%i= "last seen: #{how_long_ago(@posts.first)}"
%i= t(".last_seen",:how_long_ago => how_long_ago(@posts.first))
- if @person != current_user.person && current_user.friends.include?(@person)
%li
%i= "friends since: #{how_long_ago(@person)}"
%i= t(".friends_since",:how_long_ago => how_long_ago(@person))
%li
= form_tag move_friend_path
= select :to, :to, @aspects_dropdown_array, :selected => @aspects_with_person.first.id
= hidden_field_tag :from, :from, :value => @aspects_with_person.first.id
= hidden_field_tag :friend_id, :friend_id, :value => @person.id
= submit_tag "save"
= submit_tag t('.save')
- if @person != current_user.person && current_user.friends.include?(@person)
= link_to 'remove friend', @person, :confirm => 'Are you sure?', :method => :delete, :class => "button"
= link_to t('.remove_friend'), @person, :confirm => t('.are_you_sure'), :method => :delete, :class => "button"
.span-20.last
@ -36,4 +36,4 @@
= render type_partial(post), :post => post unless post.class == Album
= will_paginate @posts
- else
%h3 no posts to display!
%h3=t('no posts to display!')

View file

@ -8,8 +8,8 @@
var uploader = new qq.FileUploader({
element: document.getElementById('file-upload'),
params: {'album_id' : "#{@album.id}"},
allowedExtensions: ['jpg', 'jpeg', 'png'],
action: "/photos"
allowedExtensions: ['jpg', 'jpeg', 'png', 'gif'],
action: "#{photos_path}"
});
}
window.onload = createUploader;

View file

@ -11,7 +11,7 @@
%span.from
= link_to post.person.real_name, post.person
%b
posted a new photo to
=t('.posted_a_new_photo_to')
= link_to post.album.name, object_path(post.album)
%br
@ -21,5 +21,5 @@
.info
= link_to(how_long_ago(post), photo_path(post))
\--
= link_to "show comments (#{post.comments.count})", '#', :class => "show_post_comments"
= link_to "#{t('.show_comments')} (#{post.comments.count})", '#', :class => "show_post_comments"
= render "comments/comments", :post => post

View file

@ -6,7 +6,7 @@
%h1.big_text
.back
= link_to "⇧ #{@album.name}", album_path(@album)
= "Editing #{@photo.image}"
= "#{t('.editing')} #{@photo.image}"
%div{:id => @photo.id}
@ -22,5 +22,5 @@
= link_to "⇧ #{@album.name}", album_path(@album)
-if current_user.owns? @album
.button.right
= link_to 'Delete Photo', @photo, :confirm => 'Are you sure?', :method => :delete
= link_to t('.delete_photo'), @photo, :confirm => t('.are_you_sure'), :method => :delete

View file

@ -3,12 +3,12 @@
-# the COPYRIGHT file.
- title "New Photo"
- title t('.new_photo')
= form_for( @photo, :html => {:multipart => true}) do |f|
= f.error_messages
%p
= f.file_field :image
= f.submit 'post it!', :class => 'button'
= f.submit t('.post_it'), :class => 'button'
%p= link_to "Back to List", photos_path
%p= link_to t('.back_to_list'), photos_path

View file

@ -25,15 +25,15 @@
%h1
= @photo.image
= link_to "<< prev", url_to_prev(@photo, @album)
= link_to "<< #{t('.prev')}", url_to_prev(@photo, @album)
|
= link_to "full size", @photo.url
= link_to "#{t('.full_size')}", @photo.url
|
= link_to "next >>", url_to_next(@photo, @album)
= link_to "#{t('.next')} >>", url_to_next(@photo, @album)
.right
-if current_user.owns? @album
= link_to 'Edit Photo', edit_photo_path(@photo), :class => "button"
= link_to t('.edit_photo'), edit_photo_path(@photo), :class => "button"
%div{:id => @photo.id}
@ -48,9 +48,9 @@
-if current_user.owns? @album
.right
= link_to 'Delete Photo', @photo, :confirm => 'Are you sure?', :method => :delete, :class => 'button'
= link_to t('.delete_photo'), @photo, :confirm => t('.are_you_sure'), :method => :delete, :class => 'button'
%h4{:class => "show_post_comments"}
= "comments (#{@photo.comments.count})"
= "#{t('.comments')} (#{@photo.comments.count})"
= render "comments/comments", :post => @photo

View file

@ -7,6 +7,9 @@
%h5 DEBUG INFO
#debug_more{ :style => "display:none;" }
%ul
%li
%b
= GIT_INFO
%li
%b params
= params.inspect
@ -14,3 +17,4 @@
%b websocket status
#debug
.msg

View file

@ -2,7 +2,6 @@
= form_for(resource, :as => resource_name, :url => registration_path(resource_name)) do |f|
= f.hidden_field :url, :value => request.host
%p
= f.label :username
= f.text_field :username
@ -17,8 +16,6 @@
= f.password_field :password_confirmation
= f.fields_for :person do |p|
= p.hidden_field :url, :value => request.host
= p.fields_for :profile do |pr|
%p
= pr.label :first_name
@ -27,5 +24,5 @@
= pr.label :last_name
= pr.text_field :last_name
= f.submit "Sign up"
= f.submit t('.sign_up')
= render :partial => "devise/shared/links"

View file

@ -4,18 +4,18 @@
%h1
Add a new friend to
=t('.add_a_new_friend_to')
%i= aspect.name
= form_for Request.new do |f|
= f.error_messages
Enter a Diaspora username:
=t('.enter_a_diaspora_username')
%br
%i= "Your Diaspora username is: #{current_user.diaspora_handle}"
%i= t '.your_diaspora_username_is', :diaspora_handle => current_user.diaspora_handle
%p
= f.label :destination_url, "Friend's username"
= f.label :destination_url, t(".friends_username")
= f.text_field :destination_url
= f.hidden_field :aspect_id, :value => aspect.id
= f.submit

View file

@ -16,5 +16,5 @@
= render "requests/new_request", :aspect => @aspect
-else
.clear
= link_to "add friends", aspects_manage_path
= link_to t('.add_friends'), aspects_manage_path

View file

@ -6,15 +6,15 @@
#aspect_nav
%ul
- for aspect in @aspects
%li{:id => aspect.id, :class => ("selected" if current_aspect?(aspect))}
%li{:class => ("selected" if current_aspect?(aspect))}
= link_for_aspect aspect
%ul{ :style => "position:absolute;right:0;bottom:0.01em;"}
%li{:class => ("selected" if @aspect == :all)}
= link_to "All Aspects", root_url
= link_to t('.all_aspects'), root_url
%li{ :style => "margin-right:0;", :class => ("selected" if @aspect == :manage)}
= link_to ( (@request_count == 0)? "manage" : "manage (#{@request_count})"), {:controller => :aspects, :action => :manage}, :class => "edit_aspect_button", :class => new_request(@request_count), :title => "Manage your Aspects"
= link_to ( (@request_count == 0)? t('.manage') : "#{t('.manage')} (#{@request_count})"), {:controller => :aspects, :action => :manage}, :class => "edit_aspect_button", :class => new_request(@request_count), :title => t('.manage_your_aspects')
.yo{ :style => "display:none;"}
#add_aspect_pane

View file

@ -10,7 +10,7 @@
= f.error_messages
%p
%label{:for => "status_message_message"} Message
= f.text_area :message, :rows => 2
= f.text_area :message, :rows => 2, :value => params[:prefill]
%ul.aspect_selector{ :style => "display:none;"}
going to...
@ -19,4 +19,4 @@
= check_box_tag("aspect_ids[]", aspect.id, @aspect == :all || current_aspect?(aspect) )
= aspect.name
= f.submit "Share"
= f.submit t('.share')

View file

@ -0,0 +1,27 @@
-# Copyright (c) 2010, Diaspora Inc. This file is
-# licensed under the Affero General Public License version 3. See
-# the COPYRIGHT file.
:javascript
$(".reshare_button").toggle(function(e){
e.preventDefault();
$(this).parent(".reshare_pane").children(".reshare_box").fadeIn(200);
}, function(e) {
e.preventDefault();
$(this).parent(".reshare_pane").children(".reshare_box").fadeOut(200);
});
.reshare_pane
%span.reshare_button
= link_to "Reshare", "#"
%ul.reshare_box
- for aspect in current_user.aspects_with_post( post.id )
%li.currently_sharing= aspect.name
- for aspect in current_user.aspects
- unless aspect.posts.include? post
%li.aspect_to_share= link_to aspect, :controller => "aspects", :action => "show", :id => aspect.id, :prefill => post.message

View file

@ -7,9 +7,9 @@
- else
%h1
- if @aspect == :all
= link_to "All Aspects", root_path
= link_to t('.all_aspects'), root_path
- elsif @aspect == :manage
= link_to "Manage Aspects", root_path
= link_to t('.manage_aspects'), root_path
- else
= link_to @aspect.name, @aspect

View file

@ -6,5 +6,5 @@
= form_for StatusMessage.new, :remote => true do |f|
= f.error_messages
%p
= f.text_field :message, :value => "tell me something good"
= f.submit 'oh yeah!', :class => 'button'
= f.text_field :message, :value => t('.tell_me_something_good')
= f.submit t('.oh_yeah'), :class => 'button'

View file

@ -10,16 +10,16 @@
.content
%span.from
= link_to post.person.real_name, post.person
= auto_link sanitize post.message
= post.message
.info
= link_to(how_long_ago(post), object_path(post))
%span.time= link_to(how_long_ago(post), object_path(post))
\--
= link_to "show comments (#{post.comments.count})", '#', :class => "show_post_comments"
= render "comments/comments", :post => post
= link_to "#{t('.show_comments')} (#{post.comments.count})", '#', :class => "show_post_comments"
= render "comments/comments", :post => post
- if current_user.owns?(post)
.destroy_link
= link_to 'Delete', status_message_path(post), :confirm => 'Are you sure?', :method => :delete, :remote => true, :class => "delete"
= link_to t('.delete'), status_message_path(post), :confirm => t('.are_you_sure'), :method => :delete, :remote => true, :class => "delete"
= render "shared/reshare", :post => post, :current_user => current_user

View file

@ -2,21 +2,13 @@
-# licensed under the Affero General Public License version 3. See
-# the COPYRIGHT file.
- title "Status Message"
%p
%strong Message:
%h1
= link_to @status_message.person.real_name, @status_message.person
= @status_message.message
%p
%strong Owner:
= @status_message.person.real_name
%h4= "comments (#{@status_message.comments.count})"
%h4= "#{t('.comments')} (#{@status_message.comments.count})"
= render "comments/comments", :post => @status_message
%p
= link_to "Destroy", @status_message, :confirm => 'Are you sure?', :method => :delete
|
= link_to "View All", status_messages_path
- if current_user.owns? @status_message
= link_to t('.destroy'), @status_message, :confirm => t('are_you_sure?'), :method => :delete

View file

@ -4,8 +4,7 @@
- content_for :publish do
%h1
Editing profile
%h1="#{t('.editing_profile')}"
- content_for :left_pane do
\.
@ -15,13 +14,13 @@
= f.fields_for :profile do |p|
%h3 Picture
%h3="#{t('.picture')}"
%div#image_picker
= p.hidden_field :image_url, :value => (@profile.image_url.sub(@user.url,'/') if @profile.image_url), :id => 'image_url_field'
= p.hidden_field :image_url, :value => (@profile.image_url if @profile.image_url), :id => 'image_url_field'
- unless @photos.nil? || @photos.empty?
- for photo in @photos
- if @profile.image_url && (photo.url(:thumb_medium) == @profile.image_url.sub(@user.url,'/'))
- if @profile.image_url && @profile.image_url.include?(photo.url(:thumb_medium))
%div.small_photo{:id => photo.url(:thumb_medium), :class=>'selected'}
= check_box_tag 'checked_photo', true, true
= link_to image_tag(photo.url(:thumb_medium)), "#"
@ -31,19 +30,19 @@
= link_to image_tag(photo.url(:thumb_medium)), "#"
- else
You don't have any photos! Go to the
= link_to "albums", albums_path(:aspect => 'all')
page to upload some.
=t('.you_dont_have_any_photos')
= link_to t('.albums'), albums_path(:aspect => 'all')
=t('.page_to_upload_some')
=will_paginate @photos
%br
%h3 Info
%h3="#{t('.info')}"
%p
%b
DIASPORA USERNAME:
="#{t('.diaspora_username')}:"
= @user.diaspora_handle
%p
@ -53,15 +52,11 @@
= p.label :last_name
= p.text_field :last_name, :value => @profile.last_name
%p
= f.label :email
= f.text_field :email
#submit_block
= link_to "Cancel", root_path
= link_to t('.cancel'), root_path
or
= f.submit "Update Profile"
= f.submit t('.update_profile')
#content_bottom
.back
= link_to "⇧ home", root_path
= link_to "⇧ #{t('.home')}", root_path

View file

@ -3,21 +3,21 @@
# the COPYRIGHT file.
development:
default:
pod_url: "http://example.org/"
debug: false
socket_debug : false
socket_host: 0.0.0.0
socket_port: 8080
socket_collection_name: 'websocket'
pubsub_server: 'https://pubsubhubbub.appspot.com/'
mongo_host: 'localhost'
mongo_port: 27017
development:
test:
debug: false
socket_debug : false
pod_url: "http://example.org/"
socket_port: 8081
pubsub_server: 'https://pubsubhubbub.appspot.com/'
production:
debug: false
socket_debug : false
socket_port: 8080
pubsub_server: 'https://pubsubhubbub.appspot.com/'

View file

@ -6,9 +6,9 @@
require File.expand_path('../boot', __FILE__)
require "action_controller/railtie"
require "action_mailer/railtie"
require "active_resource/railtie"
require 'action_controller/railtie'
require 'action_mailer/railtie'
require 'active_resource/railtie'
# If you have a Gemfile, require the gems listed there, including any gems
# you've limited to :test, :development, or :production.
Bundler.require(:default, Rails.env) if defined?(Bundler)
@ -51,5 +51,6 @@ module Diaspora
# Configure sensitive parameters which will be filtered from the log file.
config.filter_parameters += [:password]
config.filter_parameters += [:xml]
end
end

View file

@ -39,8 +39,6 @@ backers.each{ |backer|
# Start Nginx
after "deploy:cold" do
run("nginx stop")
run("killall nginx")
#run("nginx")
end
@ -55,9 +53,19 @@ namespace :deploy do
run "ln -s -f #{shared_path}/bundle #{current_path}/vendor/bundle"
end
task :symlink_config do
run "touch #{shared_path}/app_config.yml"
run "ln -s -f #{shared_path}/app_config.yml #{current_path}/config/app_config.yml"
end
task :start do
start_mongo
start_thin
start_websocket
end
task :start_websocket do
run("cd #{current_path} && bundle exec ruby ./script/websocket_server.rb > /dev/null&")
end
task :start_mongo do
@ -147,4 +155,4 @@ namespace :db do
end
after "deploy:symlink", "deploy:symlink_images", "deploy:symlink_bundle"
after "deploy:symlink", "deploy:symlink_images", "deploy:symlink_bundle", 'deploy:symlink_config'

View file

@ -7,7 +7,7 @@
cross_server:
deploy_to: '/usr/local/app/diaspora'
user: 'root'
repo: 'git@github.com:diaspora/diaspora.git'
repo: 'git://github.com/diaspora/diaspora.git'
branch: 'master'
default_env: 'development'
servers:

View file

@ -7,6 +7,7 @@
# Load the rails application
require File.expand_path('../application', __FILE__)
Haml::Template.options[:format] = :html5
Haml::Template.options[:escape_html] = true
# Initialize the rails application
Diaspora::Application.initialize!

View file

@ -21,8 +21,19 @@ Diaspora::Application.configure do
config.action_controller.perform_caching = false
# Don't care if the mailer can't send
config.action_mailer.raise_delivery_errors = false
config.action_mailer.raise_delivery_errors = true
config.active_support.deprecation = :log
config.middleware.use MongoMapper::ClearDevMemory
#config.threadsafe!
config.action_mailer.delivery_method = :smtp
config.action_mailer.default_url_options = {:host => 'localhost:3000'}
config.action_mailer.smtp_settings = {
:address => 'smtp.gmail.com',
:port => 587,
:domain => 'mail.joindiaspora.com',
:authentication => 'plain',
:user_name => 'diaspora-pivots@joindiaspora.com',
:password => "xy289|]G+R*-kA",
:enable_starttls_auto => true
}
end

View file

@ -15,12 +15,12 @@ Diaspora::Application.configure do
config.action_controller.perform_caching = true
# Specifies the header that your server uses for sending files
config.action_dispatch.x_sendfile_header = "X-Sendfile"
#config.action_dispatch.x_sendfile_header = "X-Sendfile"
config.active_support.deprecation = :notify
# For nginx:
# config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect'
config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect'
# If you have no front-end server that supports something like X-Sendfile,
# just comment this out and Rails will serve the files
@ -36,7 +36,7 @@ Diaspora::Application.configure do
# Disable Rails's static asset server
# In production, Apache or nginx will already do this
config.serve_static_assets = true
#config.serve_static_assets = true
# Enable serving of images, stylesheets, and javascripts from an asset server
# config.action_controller.asset_host = "http://assets.example.com"
@ -44,12 +44,20 @@ Diaspora::Application.configure do
# Disable delivery errors, bad email addresses will be ignored
# config.action_mailer.raise_delivery_errors = false
# Enable threaded mode
# config.threadsafe!
# Enable locale fallbacks for I18n (makes lookups for any locale fall back to
# the I18n.default_locale when a translation can not be found)
config.i18n.fallbacks = true
config.threadsafe!
config.action_mailer.delivery_method = :smtp
config.action_mailer.default_url_options = {:host => 'pivots.joindiaspora.com'}
config.action_mailer.smtp_settings = {
:address => 'smtp.gmail.com',
:port => 587,
:domain => 'mail.joindiaspora.com',
:authentication => 'plain',
:user_name => 'diaspora-pivots@joindiaspora.com',
:password => "xy289|]G+R*-kA",
:enable_starttls_auto => true
}
end

View file

@ -0,0 +1,26 @@
# Copyright (c) 2010, Diaspora Inc. This file is
# licensed under the Affero General Public License version 3. See
# the COPYRIGHT file.
def load_config_yaml filename
YAML.load(File.read(filename))
end
if File.exist? "#{Rails.root}/config/app_config.yml"
all_envs = load_config_yaml "#{Rails.root}/config/app_config.yml"
all_envs = load_config_yaml "#{Rails.root}/config/app_config.yml.example" unless all_envs
else
puts "WARNING: No config/app_config.yml found! Look at config/app_config.yml.example for help."
all_envs = load_config_yaml "#{Rails.root}/config/app_config.yml.example"
end
if all_envs[Rails.env.to_s]
APP_CONFIG = all_envs['default'].merge(all_envs[Rails.env.to_s]).symbolize_keys
else
APP_CONFIG = all_envs['default'].symbolize_keys
end
APP_CONFIG[:terse_pod_url] = APP_CONFIG[:pod_url].gsub(/(https?:|www\.)\/\//, '')
APP_CONFIG[:terse_pod_url].chop! if APP_CONFIG[:terse_pod_url][-1, 1] == '/'
puts "WARNING: Please modify your app_config.yml to have a proper pod_url!" if APP_CONFIG[:terse_pod_url] == "example.org" && Rails.env != :test

View file

@ -5,7 +5,7 @@
if ENV['MONGOHQ_URL']
MongoMapper.config = {RAILS_ENV => {'uri' => ENV['MONGOHQ_URL']}}
else
MongoMapper.connection = Mongo::Connection.new('localhost', 27017)
MongoMapper.connection = Mongo::Connection.new(APP_CONFIG['mongo_host'], APP_CONFIG['mongo_port'])
end
MongoMapper.database = "diaspora-#{Rails.env}"
@ -16,3 +16,4 @@ if defined?(PhusionPassenger)
end
end
Magent.connection = Mongo::Connection.new(APP_CONFIG['mongo_host'], APP_CONFIG['mongo_port'])

View file

@ -3,5 +3,4 @@
# the COPYRIGHT file.
raw_config = File.read("#{Rails.root}/config/app_config.yml")
APP_CONFIG = YAML.load(raw_config)[Rails.env].symbolize_keys
GIT_INFO = `git show`

View file

@ -0,0 +1,8 @@
# Copyright (c) 2010, Diaspora Inc. This file is
# licensed under the Affero General Public License version 3. See
# the COPYRIGHT file.
# The default locale is :en and all translations from config/locales/*.rb,yml are auto loaded.
I18n.load_path += Dir[Rails.root.join('config', 'locales', '**', '*.{rb,yml}')]
I18n.default_locale = :en

View file

@ -1,26 +0,0 @@
# Copyright (c) 2010, Diaspora Inc. This file is
# licensed under the Affero General Public License version 3. See
# the COPYRIGHT file.
require 'em-websocket'
require 'eventmachine'
require File.expand_path("../../../lib/diaspora/websocket", __FILE__)
EM.next_tick {
Diaspora::WebSocket.initialize_channels
EventMachine::WebSocket.start(
:host => "0.0.0.0",
:port => APP_CONFIG[:socket_port],
:debug =>APP_CONFIG[:socket_debug]) do |ws|
ws.onopen {
sid = Diaspora::WebSocket.subscribe(ws.request['Path'].gsub('/',''), ws)
ws.onmessage { |msg| SocketsController.new.incoming(msg) }
ws.onclose { Diaspora::WebSocket.unsubscribe(ws.request['Path'].gsub('/',''), sid) }
}
end
}

View file

@ -1,41 +0,0 @@
# Copyright (c) 2010, Diaspora Inc. This file is
# licensed under the Affero General Public License version 3. See
# the COPYRIGHT file.
en:
errors:
messages:
not_found: "not found"
already_confirmed: "was already confirmed"
not_locked: "was not locked"
devise:
failure:
unauthenticated: 'You need to sign in or sign up before continuing.'
unconfirmed: 'You have to confirm your account before continuing.'
locked: 'Your account is locked.'
invalid: 'Invalid email or password.'
invalid_token: 'Invalid authentication token.'
timeout: 'Your session expired, please sign in again to continue.'
inactive: 'Your account was not activated yet.'
sessions:
signed_in: 'Signed in successfully.'
signed_out: 'Signed out successfully.'
passwords:
send_instructions: 'You will receive an email with instructions about how to reset your password in a few minutes.'
updated: 'Your password was changed successfully. You are now signed in.'
confirmations:
send_instructions: 'You will receive an email with instructions about how to confirm your account in a few minutes.'
confirmed: 'Your account was successfully confirmed. You are now signed in.'
registrations:
signed_up: 'You have signed up successfully. If enabled, a confirmation was sent to your e-mail.'
updated: 'You updated your account successfully.'
destroyed: 'Bye! Your account was successfully cancelled. We hope to see you again soon.'
unlocks:
send_instructions: 'You will receive an email with instructions about how to unlock your account in a few minutes.'
unlocked: 'Your account was successfully unlocked. You are now signed in.'
mailer:
confirmation_instructions: 'Confirmation instructions'
reset_password_instructions: 'Reset password instructions'
unlock_instructions: 'Unlock Instructions'

View file

@ -0,0 +1,41 @@
# Copyright (c) 2010, Diaspora Inc. This file is
# licensed under the Affero General Public License version 3. See
# the COPYRIGHT file.
cs:
errors:
messages:
not_found: "nenalezeno"
already_confirmed: "již bylo potvrzeno"
not_locked: "nebylo zamčeno"
devise:
failure:
unauthenticated: 'Pro pokračování se musíte přihlásit nebo si vytvořit účet.'
unconfirmed: 'Před pokračováním musíte potvrdit svůj účet.'
locked: 'Váš účet je uzamčen.'
invalid: 'Neplatný email nebo heslo.'
invalid_token: 'Neplatný autentizační token.'
timeout: 'Vaše sezení vypršelo, pro pokračování se prosím přihlašte znovu.'
inactive: 'Váš účet ještě nebyl aktivován.'
sessions:
signed_in: 'Přihlášení proběhlo úspěšně.'
signed_out: 'Odhlášení proběhlo úspěšně.'
passwords:
send_instructions: 'Běhěm několika minut obdržíte email s instrukcemi k resetnutí hesla.'
updated: 'Vaše heslo bylo úspěšně změněno. Nyní jste přihlášeni'
confirmations:
send_instructions: 'Během několika minut obdržíte email s instrukcemi k potvrzení vašeho účtu.'
confirmed: 'Váš účet byl uspěšně potvrzen. Nyní jste přihlášeni.'
registrations:
signed_up: 'Úspěšně jste vytvořili účet. Pokud je tak server nastaven, byl vám zaslán potvrzovací email.'
updated: 'Úspěšně jste upravili svůj účet.'
destroyed: 'Sbohem! Váš účet byl úspěšně zrušen. Brzy naviděnou.'
unlocks:
send_instructions: 'Během několika minut obdržíte email s instrukcemi k odemknutí vašeho účtu.'
unlocked: 'Váš účet byl úspěšně odemknut. Nyní jste přihlášeni.'
mailer:
confirmation_instructions: 'Instrukce k potvrzení'
reset_password_instructions: 'Instrukce k resetnutí hesla'
unlock_instructions: 'Instrukce k odemčení'

View file

@ -0,0 +1,42 @@
# Copyright (c) 2010, Diaspora Inc. This file is
# licensed under the Affero General Public License version 3. See
# the COPYRIGHT file.
cy:
errors:
messages:
not_found: "ni chanfuwyd"
already_confirmed: "cadarnhawyd eisioes"
not_locked: "heb ei gloi"
devise:
failure:
unauthenticated: "Mae angen i chi arwyddo i mewn neu ymuno cyn parhau."
unconfirmed: "Rhaid i chi gadarnhau eich cyfrif cyn parhau."
locked: "Mae eich cyfrif wedi'i gloi."
invalid: "E-bost neu gyfrinair annilys."
invalid_token: "Tocyn dilysu annilys."
timeout: "Mae eich sesiwn wedi dod i ben, arwyddwch i mewn eto i barhau."
inactive: "Nid yw eich cyfrif wedi'i actifadu."
sessions:
signed_in: "Arwyddwyd i fewn yn llwyddiannus."
signed_out: "Arwyddwyd allan yn llwyddiannus."
passwords:
send_instructions: "Byddwch yn derbyn e-bost â chyfarwyddiadau ar sut i gadarnhau eich cyfrif mewn ychydig funudau."
updated: "Newidiwyd eich cyfrinair yn llwyddiannus. Rydych chi wedi arwyddo i fewn."
confirmations:
send_instructions: "Byddwch yn derbyn e-bost â chyfarwyddiadau ar sut i gadarnhau eich cyfrif mewn ychydig funudau."
confirmed: "Cadarnhawyd eich cyfrif yn llwyddiannus. Rydych chi wedi arwyddo i fewn."
registrations:
signed_up: "Rydych chi wedi arwyddo i fyny yn llwyddiannus. Anfonwyd cadarnhad at eich e-bost os yw wedi'i alluogi."
updated: "Diweddarwyd eich cyfrif yn llwyddiannus."
destroyed: "Hwyl fawr! Canslwyd eich cyfrif yn llwyddiannus. Rydym yn gobeithio gweld chi eto yn fuan."
unlocks:
send_instructions: "Byddwch yn derbyn e-bost gyda cyfarwyddiadau ar sut i agor eich cyfrif mewn ychydig funudau."
unlocked: "Datglowyd eich cyfrif yn llwyddiannus. Rydych chi wedi arwyddo i fewn."
mailer:
confirmation_instructions: "Cyfarwyddiadau cadarnhad."
reset_password_instructions: "Ailosod cyfarwyddiadau cyfrinair"
unlock_instructions: "Cyfarwyddiadau Datgloi"

View file

@ -0,0 +1,41 @@
# Copyright (c) 2010, Diaspora Inc. This file is
# licensed under the Affero General Public License version 3. See
# the COPYRIGHT file.
de:
errors:
messages:
not_found: "nicht gefunden"
already_confirmed: "wurde bereits bestätigt"
not_locked: "war nicht gesperrt"
devise:
failure:
unauthenticated: 'Du musst dich anmelden oder registrieren um fortzufahren.'
unconfirmed: 'Du musst dein Konto bestätigen um fortzufahren.'
locked: 'Dein Konto ist gesperrt.'
invalid: 'Ungültige E-Mail-Adresse oder Passwort.'
invalid_token: 'Ungültiger Authentifizierungstoken.'
timeout: 'Deine Sitzung ist abgelaufen, bitte melde dich erneut an um fortzufahren.'
inactive: 'Dein Konto wurde noch nicht aktiviert.'
sessions:
signed_in: 'Erfolgreich angemeldet.'
signed_out: 'Erfolgreich abgemeldet.'
passwords:
send_instructions: 'Du wirst in ein paar Minuten eine E-Mail erhalten, die beschreibt, wie du dein Passwort zurücksetzt.'
updated: 'Dein Passwort wurde erfolgreich geändert. Du bist nun angemeldet.'
confirmations:
send_instructions: 'Du wirst in ein paar Minuten eine E-Mail erhalten, die beschreibt, wie du dein Konto bestätigst.'
confirmed: 'Dein Konto wurde erfolgreich bestätigt. Du bist nun angemeldet.'
registrations:
signed_up: 'Du hast dich erfolgreich registriert. Sofern aktiviert, wurde dir eine Bestätigung per E-Mail gesendet.'
updated: 'Dein Konto wurde aktualisiert.'
destroyed: 'Tschüss! Dein Konto wurde erfolgreich gekündigt. Wir hoffen dich bald wiederzusehen.'
unlocks:
send_instructions: 'Du wirst in ein paar Minuten eine E-Mail erhalten, die beschreibt, wie du dein Konto entsperren kannst.'
unlocked: 'Dein Konto wurde erfolgreich entsperrt. Du bist nun angemeldet.'
mailer:
confirmation_instructions: 'Instruktionen zur Bestätigung'
reset_password_instructions: 'Instruktionen zum Zurücksetzen des Passworts'
unlock_instructions: 'Instruktionen zum Entsperren'

View file

@ -0,0 +1,41 @@
# Copyright (c) 2010, Diaspora Inc. This file is
# licensed under the Affero General Public License version 3. See
# the COPYRIGHT file.
en:
errors:
messages:
not_found: "not found"
already_confirmed: "was already confirmed"
not_locked: "was not locked"
devise:
failure:
unauthenticated: "You need to sign in or sign up before continuing."
unconfirmed: "You have to confirm your account before continuing."
locked: "Your account is locked."
invalid: "Invalid email or password."
invalid_token: "Invalid authentication token."
timeout: "Your session expired, please sign in again to continue."
inactive: "Your account was not activated yet."
sessions:
signed_in: "Signed in successfully."
signed_out: "Signed out successfully."
passwords:
send_instructions: "You will receive an email with instructions about how to reset your password in a few minutes."
updated: "Your password was changed successfully. You are now signed in."
confirmations:
send_instructions: "You will receive an email with instructions about how to confirm your account in a few minutes."
confirmed: "Your account was successfully confirmed. You are now signed in."
registrations:
signed_up: "You have signed up successfully. If enabled, a confirmation was sent to your e-mail."
updated: "You updated your account successfully."
destroyed: "Bye! Your account was successfully cancelled. We hope to see you again soon."
unlocks:
send_instructions: "You will receive an email with instructions about how to unlock your account in a few minutes."
unlocked: "Your account was successfully unlocked. You are now signed in."
mailer:
confirmation_instructions: "Confirmation instructions"
reset_password_instructions: "Reset password instructions"
unlock_instructions: "Unlock Instructions"

View file

@ -0,0 +1,42 @@
es:
errors:
messages:
not_found: 'no encontrado'
already_confirmed: 'ya ha sido confirmada'
not_locked: 'no está bloqueada'
devise:
failure:
unauthenticated: 'Necesitas acceder a tu cuenta o registrarte antes de continuar.'
unconfirmed: 'Necesitas confirmar tu cuenta antes de continuar.'
locked: 'Tu cuenta esta bloqueada.'
invalid: 'Contraseña o Email incorrecto.'
invalid_token: 'Token de autenticación incorrecto.'
timeout: 'Tu sesión ha expirado, por favor accede de nuevo para continuar.'
inactive: 'Tu cuenta no ha sido activada.'
sessions:
signed_in: 'Has ingresado correctamente.'
signed_out: 'Has salido correctamente.'
passwords:
send_instructions: 'Recibirás un email con instrucciones para cambiar tu contraseña en pocos minutos.'
updated: 'Tu contraseña ha sido modificada. Ya has accedido a tu cuenta.'
confirmations:
send_instructions: 'Recibirás un email con instrucciones para confirmar tu cuenta en pocos minutos.'
confirmed: 'Tu cuenta ha sido confirmada. Ya has accedido a tu cuenta.'
registrations:
signed_up: 'Te has registrado correctamente. Si está disponible, te habremos enviado un email de confirmación.'
updated: 'Has actualizado tu cuenta correctamente.'
destroyed: '!Adiós! Tu cuenta ha sido cancelada. Esperamos verte pronto.'
unlocks:
send_instructions: 'Recibirás un email con instrucciones para desbloquear tu cuenta en pocos minutos.'
unlocked: 'Tu cuenta ha sido desbloqueada. Ya has accedido a tu cuenta.'
oauth_callbacks:
success: 'Has sido autorizado satisfactoriamente de la cuenta %{kind}.'
failure: 'No has sido autorizado en la cuenta %{kind} porque "%{reason}".'
mailer:
confirmation_instructions:
subject: 'Instrucciones de confirmación'
reset_password_instructions:
subject: 'Instrucciones para cambiar tu contraseña'
unlock_instructions:
subject: 'Instrucciones para desbloquear tu cuenta'

View file

@ -0,0 +1,41 @@
# Copyright (c) 2010, Diaspora Inc. This file is
# licensed under the Affero General Public License version 3. See
# the COPYRIGHT file.
# Translator: jarkko moilanen, jm60697@gmail.com
fi:
errors:
messages:
not_found: "ei löytynyt"
already_confirmed: "oli jo varmistettu"
not_locked: "ei ollut lukittu"
devise:
failure:
unauthenticated: 'Kirjaudu tai rekisteröidy ennen kuin voit jatkaa.'
unconfirmed: 'Sinun täytyy vahvistaa käyttäjätilisi ennen kuin voit jatkaa'
locked: 'Käyttäjätilisi on lukittu.'
invalid: 'Väärä sähköpostiosoite tai salasana.'
invalid_token: 'Viallinen todennus.'
timeout: 'Istunto on vanhentunut, kirjaudu uudelleen.'
inactive: 'Käyttätiliäsi ei ole vielä vahvistettu.'
sessions:
signed_in: 'Sisäänkirjautuminen onnistui.'
signed_out: 'Uloskirjautuminen onnistui.'
passwords:
send_instructions: 'Saat hetken päästä sähköpostiisi ohjeet siitä miten määrität salasanasi uudelleen.'
updated: 'Salasanasi on vaihdettu. Olet nyt kirjautunut sisään.'
confirmations:
send_instructions: 'Saat hetken päästä sähköpostiisi ohjeet siitä miten vahvistat käyttäjätilisi luonnin.'
confirmed: 'Käyttäjätilisi luonti on vahvistettu. Olet nyt kirjautunut sisään.'
registrations:
signed_up: 'Käyttäjätilin luominen onnistui. Mahdollinen vahvistuspyyntö on lähetetty sähköpostiisi.'
updated: 'Käyttäjätilisi on päivitetty.'
destroyed: 'Näkemiin! Käyttäjätilisi on poistettu. Toivottavasti näemme sinut pian uudelleen.'
unlocks:
send_instructions: 'Saat muutaman minuutin kuluttua sähköpostiisi ohjeet siitä miten avaat lukituksen.'
unlocked: 'Käyttäjätilisi lukitus on avattu. Olet nyt kirjautunut sisään.'
mailer:
confirmation_instructions: 'Ohjeet vahvistamiseen/todentamiseen'
reset_password_instructions: 'Ohjeet salananan uudelleenmäärittämiseksi'
unlock_instructions: 'Ohjeet lukituksen poistamiseksi'

View file

@ -0,0 +1,41 @@
# Copyright (c) 2010, Diaspora Inc. This file is
# licensed under the Affero General Public License version 3. See
# the COPYRIGHT file.
fr-informal:
errors:
messages:
not_found: "introuvable"
already_confirmed: "a déjà été confirmé"
not_locked: "na pas été verrouillé"
devise:
failure:
unauthenticated: 'Tu dois te connecter ou tinscrire avant de continuer.'
unconfirmed: 'Tu dois confirmer ton compte avant de continuer.'
locked: 'Ton compte est verrouillé.'
invalid: 'Adresse e-mail ou mot de passe invalide.'
invalid_token: 'Jeton dauthentification invalide.'
timeout: 'Ta session a expiré, merci de te connecter de nouveau afin de continuer.'
inactive: 'Ton compte na pas encore été activé.'
sessions:
signed_in: 'Connecté avec succès.'
signed_out: 'Déconnecté avec succès.'
passwords:
send_instructions: 'Tu vas recevoir dans quelques minutes un e-mail contenant des instructions texpliquant comment réinitialiser ton mot de passe.'
updated: 'Ton mot de passe a été modifié avec succès. Tu es à présent connecté.'
confirmations:
send_instructions: 'Tu vas recevoir dans quelques minutes un e-mail contenant des instructions texpliquant comment confirmer ton compte.'
confirmed: 'Ton compte a été confirmé avec succès. Tu es à présent connecté.'
registrations:
signed_up: 'Tu tes inscrit avec succès. Si activée, une confirmation a été envoyée sur ton adresse e-mail.'
updated: 'Tu as mis à jour ton compte avec succès.'
destroyed: 'Au revoir ! Ton compte a été résilié avec succès. Nous espérons te revoir très bientôt.'
unlocks:
send_instructions: 'Tu vas recevoir dans quelques minutes un e-mail contenant des instructions texpliquant comment déverrouiller ton compte.'
unlocked: 'Ton compte a été déverrouillé avec succès. Tu es à présent connecté.'
mailer:
confirmation_instructions: 'Instructions de confirmation'
reset_password_instructions: 'Réinitialiser les instructions du mot de passe'
unlock_instructions: 'Instructions de déverrouillage'

View file

@ -0,0 +1,41 @@
# Copyright (c) 2010, Diaspora Inc. This file is
# licensed under the Affero General Public License version 3. See
# the COPYRIGHT file.
fr:
errors:
messages:
not_found: "introuvable"
already_confirmed: "a déjà été confirmé"
not_locked: "na pas été verrouillé"
devise:
failure:
unauthenticated: 'Vous devez vous connecter ou vous inscrire avant de continuer.'
unconfirmed: 'Vous devez confirmer votre compte avant de continuer.'
locked: 'Votre compte est verrouillé.'
invalid: 'E-mail ou mot de passe invalide.'
invalid_token: 'Jeton dauthentification invalide.'
timeout: 'Votre session a expiré, veuillez vous connecter de nouveau afin de continuer.'
inactive: 'Votre compte na pas encore été activé.'
sessions:
signed_in: 'Connecté avec succès.'
signed_out: 'Déconnecté avec succès.'
passwords:
send_instructions: 'Vous allez recevoir dans quelques minutes un e-mail contenant des instructions vous expliquant comment réinitialiser votre mot de passe.'
updated: 'Votre mot de passe a été modifié avec succès. Vous êtes à présent connecté.'
confirmations:
send_instructions: 'Vous allez recevoir dans quelques minutes un e-mail contenant des instructions vous expliquant comment confirmer votre compte.'
confirmed: 'Votre compte a été confirmé avec succès. Vous êtes à présent connecté.'
registrations:
signed_up: 'Vous vous êtes inscrit avec succès. Si activée, une confirmation a été envoyée sur votre adresse e-mail.'
updated: 'Vous avez mis à jour votre compte avec succès.'
destroyed: 'Au revoir ! Votre compte a été résilié avec succès. Nous espérons vous revoir très bientôt.'
unlocks:
send_instructions: 'Vous allez recevoir dans quelques minutes un e-mail contenant des instructions vous expliquant comment déverrouiller votre compte.'
unlocked: 'Votre compte a été déverrouillé avec succès. Vous êtes à présent connecté.'
mailer:
confirmation_instructions: 'Instructions de confirmation'
reset_password_instructions: 'Réinitialiser les instructions du mot de passe'
unlock_instructions: 'Instructions de déverrouillage'

View file

@ -0,0 +1,41 @@
# Copyright (c) 2010, Diaspora Inc. This file is
# licensed under the Affero General Public License version 3. See
# the COPYRIGHT file.
it:
errors:
messages:
not_found: "non trovato"
already_confirmed: "è già stato confermato"
not_locked: "non era bloccato"
devise:
failure:
unauthenticated: "Devi effettuare l'accesso o registrarti prima di continuare."
unconfirmed: "Devi confermare il tuo account prima di continuare."
locked: "Il tuo account è bloccato."
invalid: "Email o password errati."
invalid_token: "Token di autenticazione errato."
timeout: "La tua sessione è scaduta, effettua di nuovo l'accesso per continuare."
inactive: "Il tuo account non è ancora stato attivato."
sessions:
signed_in: "Accesso effettuato con successo."
signed_out: "Disconnessione effettuata con successo."
passwords:
send_instructions: "Tra pochi minuti riceverai una email con le istruzioni su come cambiare la tua password."
updated: "La tua password è stata modificata. Hai appena effettuato l'accesso."
confirmations:
send_instructions: "Tra pochi minuti riceverai una email per confermare il tuo account."
confirmed: "Il tuo account è stato confermato con successo. Hai appena effettuato l'accesso."
registrations:
signed_up: "Ti sei iscritto. Se il servizio è disponibile, riceverai una conferma via email."
updated: "Hai aggiornato il tuo account."
destroyed: "Ciao! Il tuo account è stato rimosso. Speriamo che tu torni a trovarci presto."
unlocks:
send_instructions: "Tra pochi minuti riceverai una mail con le istruzioni su come sbloccare il tuo account."
unlocked: "Il tuo account è stato sbloccato. Hai appena effettuato l'accesso."
mailer:
confirmation_instructions: "Istruzioni sulla conferma"
reset_password_instructions: "Istruzioni su come cambiare la password"
unlock_instructions: "Istruzioni su come sbloccare l'account"

View file

@ -0,0 +1,41 @@
# Copyright (c) 2010, Diaspora Inc. This file is
# licensed under the Affero General Public License version 3. See
# the COPYRIGHT file.
lt:
errors:
messages:
not_found: "nerasta"
already_confirmed: "jau patvirtinta"
not_locked: "nebuvo užrakinta"
devise:
failure:
unauthenticated: 'Norint tęsti, reikia prisijungti arba susikurti paskyrą.'
unconfirmed: 'Norint prisijungti, reikia patvirtinti savo paskyrą.'
locked: 'Jūsų paskyra yra užrakinta.'
invalid: 'Neteisingas el. pašto adresas arba slaptažodis.'
invalid_token: 'Neteisingas prisijungimo raktas.'
timeout: 'Sesija baigėsi. Norint tęsti, reikia prisijungti iš naujo.'
inactive: 'Paskyra dar neaktyvuota.'
sessions:
signed_in: 'Sėkmingai prisijungta.'
signed_out: 'Sėkmingai atsijungta.'
passwords:
send_instructions: 'Netrukus gausite el. laišką su nurodymais slaptažodžiui atstatyti.'
updated: 'Slaptažodis pakeistas sėkmingai. Jūs esate prisijungęs.'
confirmations:
send_instructions: 'Netrukus gausite el. laišką su nurodymais paskyros patvirtinimui.'
confirmed: 'Paskyra patvirtinta. Prisijungėte.'
registrations:
signed_up: 'Prisijungta sėkmingai. Jei nustatyta, patvirtinimas išsiųstas į jūsų el. paštą.'
updated: 'Paskyra atnaujinta sėkmingai.'
destroyed: 'Paskyra sėkmingai atšaukta. Iki pasimatymo!'
unlocks:
send_instructions: 'Netrukus gausite el. laišką su nurodymais paskyros atrakinimui.'
unlocked: 'Paskyra atrakinta. Prisijungėte.'
mailer:
confirmation_instructions: 'Nurodymai patvirtinimui'
reset_password_instructions: 'Nurodymai slaptažodžio atstatymui'
unlock_instructions: 'Nurodymai paskyros atrakinimui'

View file

@ -0,0 +1,41 @@
# Copyright (c) 2010, Diaspora Inc. This file is
# licensed under the Affero General Public License version 3. See
# the COPYRIGHT file.
pl:
errors:
messages:
not_found: "nie znaleziono"
already_confirmed: "potwierdzono wcześniej"
not_locked: "nie był zablokowany"
devise:
failure:
unauthenticated: 'By kontynuować musisz się zalogować lub zarejestrować.'
unconfirmed: 'Musisz aktywować swoje konto.'
locked: 'Twoje konto jest zablokowane.'
invalid: 'Nieprawidłowy adres email lub hasło.'
invalid_token: 'Nieprawidłowy kod identyfikacyjny.'
timeout: 'Twoja sesja wygasła, zaloguj się ponownie by kontynuować.'
inactive: 'Twoje konto nie zostało jeszcze aktywowane.'
sessions:
signed_in: 'Zalogowano pomyślnie.'
signed_out: 'Wylogowano.'
passwords:
send_instructions: 'W ciągu kilku minut otrzymasz maila zawierającego instrukcjie dotyczące zresetowania hasła.'
updated: 'Twoje hasło zostało zmienione, zostałeś zalogowany.'
confirmations:
send_instructions: 'W ciągu kilku minut otrzymasz maila zawierającego instrukcje dotyczące aktywacji konta.'
confirmed: 'Twoje konto zostało aktywowane, zostałeś zalogowany.'
registrations:
signed_up: 'Zostałeś zarejestrowany. Jeśli aktywowano odpowiednią opcję, wyślemy do Ciebie email potwierdzający rejestrację.'
updated: 'Pomyślnie zaktualizowano informacje o Twoim koncie.'
destroyed: 'Żegnaj! Twoje konto zostało usunięte.'
unlocks:
send_instructions: 'W ciągu kilku minut otrzymasz email z instrukcjami odblokowania konta.'
unlocked: 'Twoje konto zostało odblokowane, jesteś zalogowany.'
mailer:
confirmation_instructions: 'Instrukcje aktywacji'
reset_password_instructions: 'Instrukcje zmiany hasła'
unlock_instructions: 'Instrukcje odblokowania'

View file

@ -0,0 +1,41 @@
# Copyright (c) 2010, Diaspora Inc. This file is
# licensed under the Affero General Public License version 3. See
# the COPYRIGHT file.
pt-BR:
errors:
messages:
not_found: "não encontrado"
already_confirmed: "já foi confirmado"
not_locked: "não foi bloqueado"
devise:
failure:
unauthenticated: 'Você precisa fazer login ou se cadastrar antes de continuar.'
unconfirmed: 'Você tem que confirmar a sua conta antes de continuar.'
locked: 'Sua conta está bloqueada.'
invalid: 'E-mail ou senha inválida.'
invalid_token: 'Token de autenticação inválida.'
timeout: 'Sua sessão expirou, por favor logue-se novamente para continuar.'
inactive: 'Sua conta ainda não foi ativada.'
sessions:
signed_in: 'Você entrou com sucesso.'
signed_out: 'Você saiu com sucesso.'
passwords:
send_instructions: 'Você receberá um email com instruções sobre como redefinir sua senha em alguns minutos.'
updated: 'Sua senha foi alterada com sucesso.'
confirmations:
send_instructions: 'Você receberá um email em alguns minutos com as instruções sobre como confirmar a sua conta.'
confirmed: 'Sua conta foi confirmada com sucesso. Você já pode continuar navegando.'
registrations:
signed_up: 'Você se inscreveu com êxito. Se habilitado, a confirmação foi enviada para seu e-mail.'
updated: 'Você atualizou a sua conta com sucesso.'
destroyed: 'Sua conta foi cancelada com sucesso. Esperamos vê-lo novamente em breve.'
unlocks:
send_instructions: 'Você receberá um email em alguns minutos com as instruções sobre como desbloquear a sua conta.'
unlocked: 'Sua conta foi desbloqueada com sucesso. Você já pode continuar navegando.'
mailer:
confirmation_instructions: 'Instruções para confirmarção'
reset_password_instructions: 'Instruções para redefinir a senha'
unlock_instructions: 'Instruções para o desbloqueio'

View file

@ -0,0 +1,41 @@
# Copyright (c) 2010, Diaspora Inc. This file is
# licensed under the Affero General Public License version 3. See
# the COPYRIGHT file.
pt-PT:
errors:
messages:
not_found: "não foi encontrado"
already_confirmed: "já foi confirmado"
not_locked: "não foi bloqueado"
devise:
failure:
unauthenticated: 'Faça login ou registre-se antes de continuar.'
unconfirmed: 'Confirme a sua conta antes de continuar.'
locked: 'A sua conta foi bloqueada.'
invalid: 'Endereço de correio ou senha inválida.'
invalid_token: 'Token de autenticação inválido.'
timeout: 'A sua sessão expirou, por favor faça login novamente para continuar.'
inactive: 'A sua conta ainda não foi activada.'
sessions:
signed_in: 'Login com sucesso.'
signed_out: 'Logout com sucesso.'
passwords:
send_instructions: 'Vai receber um email com instruções sobre como alterar a sua senha dentro de alguns minutos.'
updated: 'A sua senha foi alterada com sucesso. Está on-line.'
confirmations:
send_instructions: 'Vai receber um email com instruções sobre como confirmar a sua conta dentro de alguns minutos.'
confirmed: 'A sua conta foi confirmada com sucesso. Está on-line.'
registrations:
signed_up: 'Registou-se com sucesso. Se ligado, a confirmação foi enviada para o seu email.'
updated: 'Actualizou a sua conta com sucesso.'
destroyed: 'Adeus! A sua conta foi cancelada com sucesso. Esperamos vê-lo de novo brevemente.'
unlocks:
send_instructions: 'Vai receber uma mensagem sobre como desbloquear a sua conta dentro de alguns minutos.'
unlocked: 'A sua conta foi desbloqueada com sucesso. Está on-line.'
mailer:
confirmation_instructions: 'Instruções de confirmação'
reset_password_instructions: 'Instruções para alterar a sua senha'
unlock_instructions: 'Instruções para desbloquear'

View file

@ -0,0 +1,41 @@
# Copyright (c) 2010, Diaspora Inc. This file is
# licensed under the Affero General Public License version 3. See
# the COPYRIGHT file.
ro:
errors:
messages:
not_found: "inexistent"
already_confirmed: "a fost deja confirmat"
not_locked: "nu a fost blocat"
devise:
failure:
unauthenticated: 'Pentru a continuna, înregistrați-vă.'
unconfirmed: 'Pentru a continua, confirmați contul dvs.'
locked: 'Contul dvs. este blocat.'
invalid: 'Email sau parolă incorectă.'
invalid_token: 'Cheie de autentificare invalidă.'
timeout: 'Sesiunea dvs. a expirat, autentificați-vă din nou pentru a continua.'
inactive: 'Contul dvs. încă nu a fost activat.'
sessions:
signed_in: 'Autentificare cu succes.'
signed_out: 'Deconectare cu succes.'
passwords:
send_instructions: 'În scurt timp veți primi un email cu instrucțiuni pentru resetarea parolei.'
updated: 'Parolă schimbată cu success. Sunteți acum autentificat(ă).'
confirmations:
send_instructions: 'În scurt timp veți primi un email cu instrucțiuni pentru confirmarea contului.'
confirmed: 'Contul dvs. a fost confirmat cu succes. Sunteți acum autentificat(ă).'
registrations:
signed_up: 'Sunteți autentificat(ă). Dacă este cazul, un mesaj de confirmare a fost trimis pe email-ul dvs.'
updated: 'Cont actualizat cu succes.'
destroyed: 'Pa! Contul dvs. a fost dezactivat cu succes. Sperăm să vă revedem în curând.'
unlocks:
send_instructions: 'În scurt timp veți primi un email cu instrucțiuni pentru deblocarea contului.'
unlocked: 'Cont deblocat cu succes. Sunteți acum autentificat(ă).'
mailer:
confirmation_instructions: 'Instrucțiuni pentru confirmarea contului.'
reset_password_instructions: 'Instrucțiuni pentru resetarea parolei.'
unlock_instructions: 'Instrucțiuni pentru deblocare contului.'

View file

@ -0,0 +1,41 @@
# Copyright (c) 2010, Diaspora Inc. This file is
# licensed under the Affero General Public License version 3. See
# the COPYRIGHT file.
ru:
errors:
messages:
not_found: "не найден(о)"
already_confirmed: "уже подтвержден(о)"
not_locked: "не заблокирован(о)"
devise:
failure:
unauthenticated: 'Вам нужно войти либо зарегистрироваться, чтобы продолжить.'
unconfirmed: 'Вам нужно подтвердить вашу учётную запись, чтобы продолжить.'
locked: 'Ваша учётная запись заблокирована.'
invalid: 'Неверный e-mail или пароль.'
invalid_token: 'Неверный ключ аутентификации.'
timeout: 'Срок вашего сеанса истёк, пожалуйста, войдите в систему снова.'
inactive: 'Ваша учётная запись ещё не активирована.'
sessions:
signed_in: 'Вход в систему выполнен успешно.'
signed_out: 'Выход из системы выполнен успешно.'
passwords:
send_instructions: 'Вы получите e-mail с указаниями по сбросу пароля в течение нескольких минут.'
updated: 'Ваш пароль был изменён. Вы вошли в систему.'
confirmations:
send_instructions: 'Вы получите e-mail с указаниями по подтверждению учётной записи в течение нескольких минут.'
confirmed: 'Ваша учётная запись была подтверждена. Вы вошли в систему.'
registrations:
signed_up: 'Регистрация выполнена успешно. В зависимости от настроек, вам может прийти e-mail с подтверждением.'
updated: 'Обновление вашей учётной записи выполнено успешно.'
destroyed: 'До свидания! Ваша учётная запись была удалена. Надеемся, что вскоре вас увидим снова.'
unlocks:
send_instructions: 'Вы получите e-mail с указаниями по разблокированию учётной записи в течение нескольких минут.'
unlocked: 'Ваша учётная запись была разблокирована. Вы вошли в систему.'
mailer:
confirmation_instructions: 'Подтверждение учётной записи'
reset_password_instructions: 'Сброс пароля'
unlock_instructions: 'Разблокирование учётной записи'

View file

@ -0,0 +1,40 @@
# Copyright (c) 2010, Diaspora Inc. This file is
# licensed under the Affero General Public License version 3. See
# the COPYRIGHT file.
sv:
errors:
messages:
not_found: "kan ej hitta"
not_locked: "var ej låst"
devise:
failure:
unauthenticated: 'Du måste logga in innan du kan fortsätta.'
unconfirmed: 'Du måste verifiera ditt konto innan du kan fortsätta.'
locked: 'Ditt konto är låst.'
invalid: 'Felaktig användare eller lösenord.'
invalid_token: 'Ogiltig identifiering.'
timeout: 'Din session är avslutad, var vänlig logga in igen.'
inactive: 'Ditt konto är inte aktiverat.'
sessions:
signed_in: 'Inloggning ok.'
signed_out: 'Utloggning ok.'
passwords:
send_instructions: 'Du kommer att få ett ebrev med instruktioner för att återställa lösenordet inom några minuter.'
updated: 'Ditt lösenord har ändrats och du är inloggad.'
confirmations:
send_instructions: 'Du kommer att få ett ebrev med instruktioner för att verifiera ditt konto inom några minuter.'
confirmed: 'Ditt konto har verifierats och du är inloggad.'
registrations:
signed_up: 'Du har skapat ett konto. Beroende på inställningar kan ett ebrev ha skickats till dig.'
updated: 'Ditt konto har uppdateras.'
destroyed: 'Ditt konto är avslutat. Välkommen åter!'
unlocks:
send_instructions: 'Du kommer att få ett ebrev med instruktioner för att låsa upp ditt konto inom några minuter.'
unlocked: 'Ditt konto har är nu upplåst och du är inloggad'
mailer:
confirmation_instructions: 'Instruktioner för att verifiera ditt konto.'
reset_password_instructions: 'Instruktioner för att terställa ditt lösenord.'
unlock_instructions: 'Instruktioner för att låsa upp ditt konto.'

View file

@ -0,0 +1,10 @@
# Copyright (c) 2010, Diaspora Inc. This file is
# licensed under the Affero General Public License version 3. See
# the COPYRIGHT file.
# Sample localization file for Lithuanian. Add more files in this directory for other locales.
# See http://github.com/svenfuchs/rails-i18n/tree/master/rails%2Flocale for starting points.
cs:
hello: "Dobrý Den"

View file

@ -0,0 +1,143 @@
# Copyright (c) 2010, Diaspora Inc. This file is
# licensed under the Affero General Public License version 3. See
# the COPYRIGHT file.
# Sample localization file for English. Add more files in this directory for other locales.
# See http://github.com/svenfuchs/rails-i18n/tree/master/rails%2Flocale for starting points.
cy:
hello: "Helo byd"
layouts:
application:
edit_profile: "golygu proffil"
logout: "arwyddo allan"
shared:
aspect_nav:
all_aspects: "Pob agwedd"
manage: "Rheoli"
manage_your_aspects: "Rheoli eich agweddau"
sub_header:
all_aspects: "Pob agwedd"
manage_aspects: "Rheloi agweddau"
publisher:
share: "Rhannu"
aspect_friends:
add_friends: "ychwanegu ffrindiau"
albums:
album:
you: "chi"
new_album:
create: "creu"
add_a_new_album: "Ychwanegu albwm newydd"
show:
edit_album: "Golygu Albwm"
albums: "albymau"
updated: "diweddarwyd"
by: "gan"
edit:
editing: "Wrthi'n golygu"
updated: "diweddarwyd"
are_you_sure: "Ydych chi'n sicr?"
delete_album: "Dileu Albwm"
cancel: "Cancel"
index:
home: "adref"
new_album: "Albwm Newydd"
create:
success: "Chi wedi creu albwm a'i enwi'n %{name}."
update:
success: "Mae albwm %{name} wedi'i olygu yn llwyddiannus."
failure: "Wedi methu golygu albwm %{name}."
destroy:
success: "Wedi dileu albwm %{name}."
aspects:
index:
photos: "lluniau"
show:
photos: "lluniau"
manage:
add_a_new_aspect: "Ychwanegwch agwedd"
add_a_new_friend: "Ychwanegwch ffrind newydd"
show: "Dangos"
update_aspects: "Diweddaru Agweddau"
requests: "Ceisiadau"
ignore_remove: "Anwybyddu/Tynnu"
new_aspect:
add_a_new_aspect: "Ychwanegwch agwedd newydd"
create: "Creu"
create:
success:"Cliciwch ar y plus ar y chwith i ddweud wrth Diaspora pwy all weld eich agwedd newydd."
users:
edit:
cancel: "Cancel"
update_profile: "Diweddaru Proffil"
home: "Adref"
diaspora_username: "FFUGENW DIASPORA"
info: "Gwybodaeth"
picture: "Llun"
editing_profile: "Golygu proffil"
albums: "Albymau"
you_dont_have_any_photos: "Does gennych chi ddim lluniau! Ewch i'r"
page_to_upload_some: "dudalen i uwchlwytho rhai."
comments:
comment:
ago: "yn ol"
new_comment:
comment: "Sylw"
photos:
show:
prev: "blaenorol"
full_size: "maint llawn"
next: "neasf"
edit_photo: "Golygu Llun"
delete_photo: "Dileu Llun"
are_you_sure: "Ydych chi'n sicr?"
comments: "sylwadau"
edit:
editing: "Golygu"
are_you_sure: "Ydych chi'n sicr?"
delete_photo: "Dileu Llun"
photo:
show_comments: "dangos sylwadau"
posted_a_new_photo_to: "postiwyd llun newydd i"
new:
new_photo: "Llun Newydd"
back_to_list: "Nol i'r Rhestr"
post_it: "postiwch e!"
registrations:
new:
sign_up: "Cofrestrwch"
status_messages:
new_status_message:
tell_me_something_good: "Dwi eisiau clywed rhwbeth da"
oh_yeah: "oh yeah!"
status_message:
show_comments: "dangos sylwadau"
delete: "Dileu"
are_you_sure: "Ydych chi'n sicr?"
show:
status_message: "Neges Statws"
comments: "sylwadau"
are_you_sure: "Ydych chi'n sicr?"
destroy: "Dinistrio"
view_all: "Gweld Pob Un"
message: "Neges"
owner: "Perchennog"
people:
index:
add_friend: "ychwanegu ffrind"
real_name: "enw llawn"
diaspora_handle: "bachyn diaspora"
thats_you: "dyna chi!"
friend_request_pending: "cais ffrind dan ystyriaeth"
you_have_a_friend_request_from_this_person: "mae'r person yma eisiau bod yn ffrind i chi"
new:
new_person: "Person Newydd"
back_to_list: "Nol i'r Rhestr"
show:
last_seen: "gwelwyd diwethaf: %{how_long_ago}"
friends_since: "yn ffrindiau ers: %{how_long_ago}"
save: "arbed"
are_you_sure: "Ydych chi'n sicr?"
remove_friend: "dileu ffrind"

View file

@ -0,0 +1,197 @@
# Copyright (c) 2010, Diaspora Inc. This file is
# licensed under the Affero General Public License version 3. See
# the COPYRIGHT file.
# Localization file for German. Add more files in this directory for other locales.
# See http://github.com/svenfuchs/rails-i18n/tree/master/rails%2Flocale for starting points.
de:
hello: "Hallo Welt"
application:
helper:
unknown_person: "unbekannte Person"
new_requests: "neue Anfrage"
dashboards:
helper:
home: "home"
error_messages:
helper:
invalid_fields: "Ungültige Felder"
correct_the_following_errors_and_try_again: "Korrigiere die folgenden Fehler und probier es erneut."
people:
helper:
results_for: " resultados para %{params}"
people_on_pod_are_aware_of: " gente en pod estan al tanto de "
layouts:
application:
edit_profile: "Profil bearbeiten"
logout: "Abmelden"
shared:
aspect_nav:
all_aspects: "Alle Aspekte"
manage: "Verwalten"
manage_your_aspects: "Aspekte verwalten"
sub_header:
all_aspects: "Alle Aspekte"
manage_aspects: "Aspekte verwalten"
publisher:
share: "Teilen"
aspect_friends:
add_friends: "Freunde hinzufügen"
albums:
album:
you: "dir"
new_album:
create: "erstellen"
add_a_new_album: "Album hinzufügen"
show:
edit_album: "Album bearbeiten"
albums: "Alben"
updated: "aktualisiert"
by: "von"
edit:
editing: "Bearbeite"
updated: "geändert"
are_you_sure: "Bist du sicher?"
delete_album: "Album löschen"
cancel: "Abbrechen"
index:
home: "Startseite"
new_album: "Neues Album"
create:
success: "Du hast das Album %{name} erstellt."
update:
success: "Album %{name} erfolgreich geändert."
failure: "%{name} wurde nicht geändert."
destroy:
success: "Album %{name} gelöscht."
helper:
friends_albums: "Alben von Freunden"
your_albums: "Deine Alben"
aspects:
index:
photos: "Fotos"
show:
photos: "Fotos"
manage:
add_a_new_aspect: "Neuen Aspekt erstellen"
add_a_new_friend: "Freund hinzufügen"
show: "Anzeigen"
update_aspects: "Aspekte aktualisieren"
requests: "Anfragen"
ignore_remove: "Ignorieren/Entfernen"
new_aspect:
add_a_new_aspect: "Neuen Aspekt erstellen"
create: "Erstellen"
create:
success: "Klicke auf das Plus auf der rechten Seite um Diaspora mitzuteilen wer deinen neuen Aspekt sehen kann."
destroy:
success: "%{name} wurde erfolgreich gelöscht."
update:
success: "Dein Aspekt, %{name}, wurde erfolgreich geändert."
move_friends:
failure: "Aspect editing failed for friend %{real_name}."
success: "Aspekt erfolgreich geändert."
move_friend:
error: "didn't work %{inspect}"
notice: "You are now showing your friend a different aspect of yourself."
helper:
remove: "remove"
aspect_not_empty: "Aspekt ist nicht leer"
users:
edit:
cancel: "Abbrechen"
update_profile: "Profil aktualisieren"
home: "Startseite"
diaspora_username: "Diaspora Benutzername"
info: "Info"
picture: "Bild"
editing_profile: "Profil bearbeiten"
albums: "Alben"
you_dont_have_any_photos: "#TODO"
page_to_upload_some: "#TODO"
comments:
comment:
# this won't work in german at all. Needs more thorough I18n
ago: "ago"
new_comment:
comment: "Kommentar"
photos:
show:
prev: "zurück"
full_size: "volle Größe"
next: "vor"
edit_photo: "Foto bearbeiten"
delete_photo: "Foto löschen"
are_you_sure: "Bist du sicher?"
comments: "Kommentare"
edit:
editing: "Bearbeite"
are_you_sure: "Bist du sicher?"
delete_photo: "Foto löschen"
photo:
show_comments: "Kommentare anzeigen"
posted_a_new_photo_to: "posted a new photo to"
new:
new_photo: "Foto erstellen"
back_to_list: "Zurück zur Liste"
post_it: "Hochladen"
create:
runtime_error: "Photo upload failed. Are you sure that your seatbelt is fastened?"
integrity_error: "Photo upload failed. Are you sure that was an image?"
type_error: "Photo upload failed. Are you sure an image was added?"
update:
notice: "Foto erfolgreich aktualisiert."
error: "Failed to edit photo."
destroy:
notice: "Foto gelöscht."
registrations:
new:
sign_up: "Anmelden"
create:
success: "Du bist Diaspora beigetreten!"
status_messages:
new_status_message:
tell_me_something_good: "Erzähl' mir was schönes!"
oh_yeah: "Hey, super!"
status_message:
show_comments: "Kommentare anzeigen"
delete: "Löschen"
are_you_sure: "Bist du sicher?"
show:
status_message: "Statusmeldung"
comments: "Kommentare"
are_you_sure: "Bist du sicher?"
destroy: "Löschen"
view_all: "Alle anzeigen"
message: "Nachricht"
owner: "Besitzer"
helper:
no_message_to_display: "No message to display."
people:
index:
add_friend: "Freund hinzufügen"
real_name: "real name"
diaspora_handle: "diaspora handle"
thats_you: "das bist du!"
friend_request_pending: "Freundschaftsanfrage ausstehend"
you_have_a_friend_request_from_this_person: "du hast eine Freundschaftsanfrage von dieser Person"
new:
new_person: "Neue Person"
back_to_list: "Zurück zur Liste"
show:
last_seen: "zuletzt gesehen: %{how_long_ago}"
friends_since: "Freunde seit: %{how_long_ago}"
save: "save"
are_you_sure: "Bist du sicher?"
remove_friend: "remove friend"
destroy:
success: "Ihr seid jetzt Freunde."
error: "Bitte wähle einen Aspekt aus!"
ignore: "Freundschaftsanfrage ignorieren."
create:
error: "No diaspora seed found with this email!"
already_friends: "Du bist bereits mit %{destination_url} befreundet!"
success: "Eine Freundschaftsanfrage wurde an %{destination_url} gesendet."
horribly_wrong: "Etwas ging tierisch schief."

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