Merge branch 'master' of github.com:locomotivecms/engine

This commit is contained in:
Dirk Kelly 2011-02-28 12:49:54 +08:00
commit 70104e8f9d
32 changed files with 1182 additions and 12 deletions

View File

@ -35,17 +35,17 @@ See the "official website":http://www.locomotivecms.com
h2. Team
* Developers: "Didier Lafforgue":http://www.nocoffee.fr, "Jacques Crocker":http://www.railsjedi.com
* Contributors: "Dirk Kelly":http://www.dirkkelly.com, "Mario Visic":http://www.mariovisic.com, "Raphael Costa":http://raphaelcosta.net (Brazilian Portuguese translations)
* Contributors: "Dirk Kelly":http://www.dirkkelly.com, "Mario Visic":http://www.mariovisic.com, "Raphael Costa":http://raphaelcosta.net (Brazilian Portuguese translation), "Bernd Hauser":http://www.designhunger.de (German translation)
* UI Designer: "Sacha Greif":http://www.sachagreif.com
h2. Credits
"Rodrigo Alvarez":http://blog.codecaster.es/ for his plugin named Congo which gave us a good starting point and for his availability for (very late) tech discussions.
"Emmanuel Grard":http://www.grardesign.com designed the awesome locomotive illustration in the LocomotiveApp.org landing page.
"Emmanuel Grard":http://www.grardesign.com designed the awesome locomotive illustration in the locomotivecms.com landing page.
h2. Contact
Feel free to contact me at didier at nocoffee dot fr.
Copyright (c) 2010 NoCoffee, released under the MIT license
Copyright (c) 2011 NoCoffee, released under the MIT license

View File

@ -13,7 +13,7 @@ module Admin
end
def destroy
@site = current_admin.sites.detect { |s| s._id == params[:id] }
@site = current_admin.sites.find(params[:id])
if @site != current_site
@site.destroy

View File

@ -48,4 +48,3 @@
%h3!= t('.medias')
%ul.list.theme-assets
= render :partial => 'asset', :collection => @assets[:medias]

View File

@ -19,6 +19,7 @@ javascripts:
- public/javascripts/admin/plugins/growl.js
- public/javascripts/admin/plugins/cookie.js
- public/javascripts/admin/plugins/selectmenu.js
- public/javascripts/admin/locales/datepicker_de.js
- public/javascripts/admin/locales/datepicker_fr.js
- public/javascripts/admin/locales/datepicker_pt-BR.js
- public/javascripts/admin/application.js

View File

@ -37,7 +37,7 @@ Locomotive.configure do |config|
# If you do not mind about importing theme without DelayedJob, disable it.
config.delayed_job = false
# default locale (for now, only en, fr and pt-BR are supported)
# default locale (for now, only en, de, fr and pt-BR are supported)
config.default_locale = :en
# Configure the e-mail address which will be shown in the DeviseMailer, NotificationMailer, ...etc

View File

@ -0,0 +1,302 @@
de:
admin:
buttons:
login: Einloggen
send_password: Senden
change_password: Update
new_item: "+ hinzufügen"
switch_to_site: Los
messages:
confirm: Bist du sicher ?
shared:
header:
welcome: Willkommen, %{name}
see: Webseite ansehen
logout: Ausloggen
menu:
contents: Inhalte
assets: Assets
settings: Einstellungen
pages: Seiten
snippets: Snippets
account: Mein Account
site: Webseite
theme_assets: Templates
footer:
who_is_behind: "Dienst entwickelt von %{development} und entworfen von <a href=\"http://www.sachagreif.com\">Sacha Greif</a>"
form_actions:
back: Ohne Speichern zurück
create: Neu
update: Speichern
send: Senden
errors:
"500":
title: Anwendungs-Fehler
notice: "Entschuldigung, irgendetwas ist hier schief gelaufen."
link: "&rarr; Zurück zur Anwendung"
"404":
title: Seite nicht gefunden
notice: "Die angefragte Seite existiert nicht."
link: "&rarr; Zurück zur Anwendung"
notifications:
new_content_instance:
subject: "[%{type}] neu"
title: "Hi %{name}, nur damit du Bescheid weist, dass eine neue Instanz am %{date} erstellt wurde."
type: "Model: %{type}"
custom_fields:
edit:
title: Benutzerdefinierte Felder bearbeiten
kind:
string: Einfache Texteingabe
text: Text
category: Auswahlbox
boolean: Checkbox
date: Datum
file: Datei
text_formatting:
none: Keine
html: HTML
edit_field:
title: Feld bearbeiten
edit_category:
title: Bearbeitungs-Optionen
help: Organisiere alle Optionen für die Auswahlbox.
collection_label: Liste der Optionen
custom_form:
edit_categories: Bearbeitungs-Optionen
delete_file: Datei löschen
sessions:
new:
title: Login
link: "Ich habe mein Passwort vergessen"
email: "Email"
password: "Passwort"
passwords:
new:
title: Passwort vergessen
link: "&rarr; Zurück zur Login-Seite"
email: "Deine Email"
edit:
title: Passwort bearbeiten
link: "&rarr; Zurück zur Login-Seite"
password: "Dein neues Passwort"
password_confirmation: "Wiederholung deines neuen Passworts"
pages:
index:
title: Seiten anzeigen
help: "Seiten sind als Baum organisiert. Du kannst die Seiten also wie Ordner sortieren und verschachteln."
no_items: "Momentan gibt es keine Seiten. Klicke einfach <a href='%{url}'>hier</a>, um die erste Seite zu erstellen."
new: neue Seite
lastest_items: Neueste Seiten
new:
title: Neue Seite
help: "Fülle das folgende Formular aus, um eine neue Seite zu erstellen. Nur zur Info: Die Seite wird nicht standardmäßig publiziert!"
page:
updated_at: bearbeitet am
edit:
show: anzeigen
help: "Der Seiten-Titel kann durch anklicken bearbeitet werden."
ask_for_title: "Bitte gib den neuen Seiten-Titel ein"
form:
delete_file: Datei löschen
default_block: Standard
cache_strategy:
none: Keine
simple: Einfach
hour: 1 Stunde
day: 1 Tag
week: 1 Woche
month: 1 Monat
snippets:
index:
title: Snipptes anzeigen
help: "Snippets sind HTML-Code Ausschnitte, die an verschiedenen Stellen der Webseite eingesetzt werden können (z.B. die Fußzeile)."
no_items: "Momentan gibt es keine Snippets. Klicke einfach <a href='%{url}'>hier</a>, um das erste Snippet zu erstellen."
new: neues Snippet
new:
title: Neues Snippet
help: "Fülle das folgende Formular aus, um ein neues Snippet zu erstellen."
edit:
title: Snippet bearbeiten
help: "Fülle das folgende Formular aus, um dein Snippet zu aktualisieren."
snippet:
updated_at: Aktualisiert am
sites:
new:
title: Neue Webseite
help: "Fülle das folgende Formular aus, um eine neue Webseite zu erstellen."
current_sites:
edit:
import: Importieren
new_membership: Account hinzufügen
help: "Der Name der Webseite kann durch anklicken bearbeitet werden."
ask_for_name: "Bitte gib den neuen Namen der Webseite an"
memberships:
new:
title: Neuer Account
help: "Bitte gib eine Email für den neuen Account an. Wenn diese noch nicht registriert ist, wirst du zu einem Formular zur Erstellung weitergeleitet."
accounts:
new:
title: Neuer Account
help: "Fülle das folgende Formular aus, um einen neuen Account anzulegen."
my_accounts:
edit:
help: "Deinen Namen kannst du durch darauf klicken ändern."
new_site: Neue Webseite
en: Englisch
de: Deutsch
fr: Französisch
pt-BR: "Bras. Portugisisch"
ask_for_name: "Bitte gib deinen neuen Namen an"
theme_assets:
index:
title: Template-Dateien
help: "In diesem Bereich kannst du alle Dateien organisieren, die für dein Layout verwendet werden. Wenn du eine Bilder-Galerie organisieren möchtest, dann gehe dazu in den Assets-Abschnitt."
all: alle Assets
new: neue Datei
snippets: Snippets
css_and_js: Style und Javascript
fonts: Fonts
images: Bilder
medias: Medien
no_items: "Momentan gibt es keine Dateien. Klicke einfach <a href='%{url}'>hier</a>, um die erste Datei zu erstellen."
asset:
updated_at: Aktualisiert am
new:
title: Neue Datei
help: "Du hast die Wahl entweder eine neue Datei hochzuladen oder ein bestehendes Stylesheet / Javascript als Text einzufügen."
edit:
title: "Bearbeite %{file}"
help: "Dieses Asset kann über folgende URL erreicht werden: <a href='%{url}'>%{url}</a>"
form:
picker_link: Füge eine Datei in den Code ein
choose_file: Datei auswählen
choose_plain_text: Text einfügen
images:
title: Bilder anzeigen
no_items: "Momentan gibt es keine Bilder."
asset_collections:
index:
title: Asset Sammlung
help: "Der Name der Sammlung kann durch darauf klicken bearbeitet werden. Du kannst Assets in einer Sammlung bearbeiten, indem du neue Felder hinzufügst."
new: neue Sammlung
no_items: "Momentan gibt es keine Sammlungen. Klicke einfach <a href='%{url}'>hier</a>, um eine neue Sammlung zu erstellen."
new:
title: Neue Kollektion
help: "Gib erst mal einen Namen ein. Alle anderen Einstellungen kannst du vornehmen, sobald das Formular abgesendet ist."
edit:
help: "Der Name der Sammlung kann durch darauf klicken bearbeitet werden. Du kannst Assets in einer Sammlung bearbeiten, indem du neue Felder hinzufügst."
add_asset: Asset hinzufügen
destroy: Sammlung löschen
no_items: "Momentan gibt es keine Assets. Klicke einfach <a href='%{url}'>hier</a>, um das erste Asset zu erstellen."
ask_for_name: "Gib den neuen Namen ein"
assets:
new:
title: Neues Asset
help: "Fülle das folgende Formular aus, um dein Asset zu erstellen."
edit:
title: Asset bearbeiten
help: "Fülle das folgende Formular aus, um dein Asset zu aktualisieren."
content_types:
index:
new: Neuer Baustein
new:
title: Neuer Baustein
help: "Erstelle deine eigenen Baustein (Projekte, Leute, ...usw). Dein Baustein muss mindestens ein Feld haben. Das erste Feld ist dabei immer verpflichtend auszufüllen."
edit:
title: Vorlage bearbeiten
help: "Deine Vorlage muss mindestens ein Feld haben. Das erste Feld ist dabei immer verpflichtend auszufüllen."
show_items: zeige Elemente
new_item: neues Element
form:
order_by:
created_at: '"Erstellt am" Datum'
updated_at: '"Aktualisiert am" Datum'
position_in_list: Manuell
contents:
index:
title: '"%{type}" anzeigen'
edit: Bausteine bearbeiten
destroy: Baustein löschen
download: Elemente herunterladen
new: neues Element
category_noname: "Kein Name"
lastest_items: "Neueste Elemente"
updated_at: "Aktualisiert am"
list:
no_items: "Momentan gibt es keine Elemente. Klicke einfach <a href='%{url}'>hier</a>, um das erste Element zu erstellen."
new:
title: '%{type} &mdash; neues Element'
edit:
title: '%{type} &mdash; Element bearbeiten'
image_picker:
link: Füge ein Bild in den Code ein
cross_domain_sessions:
new:
title: Cross-Domain Authentifizierung
notice: Du wirst zu der Webseite in ein paar Sekunden weitergeleitet.
imports:
new:
title: Import
help: "Passe bitte auf, wenn du ein neues Template für deine bestehende Webseite hochlädst. Deine bestehenden Daten könnten verändert oder gelöscht werden!"
show:
title: Import am Laufen
help: "Deine Webseite wird gerade mit deinem hochgeladenen Template aktualisiert. Bitte habe noch ein paar Sekunden Geduld."
steps:
site: Webseiten-Informationen
content_types: Benutzerdefinierte Inhalts-Typen
assets: Template-Dateien
asset_collections: Asset-Sammlung
snippets: Snippets
pages: Seiten
messages:
success: "Deine Webseite wurde erfolgreich aktualisiert."
failure: "Der Import war leider nicht erfolgreich."
installation:
common:
title: Erst-Installation von getbenga
next: Weiter
step_1:
title: Schritt 1/3
explanations: Dies ist der erste Schritt zur Installation von getbenga. Bitte lies die folgenden Texte genau durch.
database:
label: "Datenbank-Name: <em>%{name}</em>"
notes: "All Verbindungseinstellungen für mongodb findest du in der <b>config/mongoid.yml</b> Datei."
default_domain:
label: "Standard Domain-Name: <em>%{name}</em>"
notes: "Basically, Locomotive is a multi websites platform. Each site instance has a default entry, also called subdomain and based on the default domain name. Obviously, you are free to map other domains to your site instance working like aliases. <br/>The default domain name value can be found in the <b>config/initializers/locomotive.rb</b> file."
step_2:
title: "Schritt 2/3 &mdash; Account erstellen"
name: Account-Name
email: Email
password: Passwort
password_confirmation: Passwort-Bestätigung
done: "Du hast bereits einen Account hinzugefügt:<br/><strong>%{name}</strong>, <em>%{email}</em>"
next: Account erstellen
step_3:
title: "Schritt 3/3 &mdash; Erstelle deine erste Webseite"
explanations: "Dies ist der letzte Schritt der Installation. Du kannst nun ein fertiges Template als zip-Datei hochladen. <a href=\'http://www.locomotivecms.com/support/themes\'>Hier</a> findest du ein paar kostenlose Templates, die du gerne kostenlos verwenden kannst."
next: Webseite erstellen

View File

@ -158,6 +158,7 @@ en:
help: "Your name can be updated by clicking it."
new_site: new site
en: English
de: German
fr: French
pt-BR: "Brazilian Portuguese"
ask_for_name: "Please type your new name"

View File

@ -158,8 +158,9 @@ fr:
help: "Votre nom est modifiable en cliquant dessus."
new_site: nouveau site
en: en Anglais
de: en Allemand
fr: en Français
pt-BR: "en Portugaise"
pt-BR: "en Portugais"
ask_for_name: "Veuillez entrer le nouveau nom"
theme_assets:

View File

@ -158,6 +158,7 @@ pt-BR:
help: "Seu nome pode ser atualizado clicando nele."
new_site: novo site
en: Inglês
de: Alemão
fr: Francês
pt-BR: "Português do Brasil"
ask_for_name: "Por favor preencha o novo nome"

View File

@ -0,0 +1,4 @@
de:
carrierwave:
errors:
integrity: 'ist kein erlaubter Datei-Typ.'

View File

@ -0,0 +1,230 @@
de:
errors:
# The default format use in full error messages.
format: "%{attribute} %{message}"
# The values :model, :attribute and :value are always available for interpolation
# The value :count is available when applicable. Can be used for pluralization.
messages:
inclusion: "nicht in der Liste inbegriffen"
exclusion: "nicht verfügbar"
invalid: "ungültig"
confirmation: "ne concorde pas avec la confirmation"
accepted: "akzeptiert"
empty: "leer"
blank: "leer"
too_long: "zu lang (nicht mehr als %{count} Zeichen)"
too_short: "zu kurz (mindestens %{count} Zeichen)"
wrong_length: "ungültige Länge (muss %{count} Zeichen lang sein)"
taken: "nicht verfügbar"
not_a_number: "ist keine Zahl"
greater_than: "größer als %{count}"
greater_than_or_equal_to: "gleich oder größer als %{count}"
equal_to: "gleich %{count}"
less_than: "weniger als %{count}"
less_than_or_equal_to: "gleich oder weniger als %{count}"
odd: "ungerade"
even: "gerade"
domain_taken: "%{value} wird bereits verwendet"
invalid_domain: "%{value} ist ungültig"
needs_admin_account: "Ein Admin-Account wird mindestens benötigt"
protected_page: "Du kannst keine Index oder 404 Seiten löschen"
extname_changed: "Die neue Datei hat nicht die originale Dateiendung"
array_too_short: "ist zu kurz (minimale Element-Zahl ist %{count})"
liquid_syntax: "Liquid Syntax-Fehler, bitte überprüfe die Syntax"
liquid_extend: "Die Seite verwendet eine Vorlage, die gar nicht existiert"
invalid_theme_file: "darf nicht leer sein oder ist keine zip-Datei"
attributes:
defaults:
pages:
index:
title: "Startseite"
body: "Inhalt der Startseite"
"404":
title: "Seite nicht gefunden"
body: "Inhalt der 404 Seite"
other:
body: "Inhalte kommen hier rein"
activemodel:
attributes:
page:
title: Titel
parent: Parent
slug: Slug
templatized: Templatized
published: Veröffentlicht
cache_strategy: Cache
content_type:
name: Name
description: Beschreibung
slug: Slug
order_by: Sortieren nach
highlighted_field_name: Hervorgehobener Feld-Name
group_by_field_name: Gruppierung nach Feld-Name
api_enabled: API aktiviert
asset_collection:
name: Name
slug: Slug
asset:
name: Name
source: Quelle
account:
email: Email
name: Name
language: Sprache
new_password: "Neues Passwort"
new_password_confirmation: "Bestätigung des neuen Passworts"
snippet:
body: Code
slug: Slug
name: Name
theme_asset:
content_type: Inhalts-Typ
site:
name: Name der Webseite
domain_name: Domain
subdomain: Subdomain
restricted_access: Aktiviert ?
access_login: Benutzernamen
access_password: "Passwort"
pagination:
previous: "&laquo; Zurück"
next: "Vor &raquo;"
date:
formats:
default: "%d/%m/%Y"
short: "%e %b"
long: "%e %B %Y"
long_ordinal: "%e %B %Y"
only_day: "%e"
day_names: [Sonntag, Montag, Dienstag, Mittwoch, Donnerstag, Freitag, Samstag]
abbr_day_names: [So, Mo, Di, Mi, Do, Fr, Sa]
month_names: [~, Januar, Februar, März, April, Mai, Juni, Juli, August, September, Oktober, November, Dezember]
abbr_month_names: [~, Jan., Feb., Mär., Apr., Mai, Juni, Juli, Aug., Sept., Okt., Nov., Dez.]
order: [ :day, :month, :year ]
pagination:
previous: "&laquo; Zurück"
next: "Vor &raquo;"
time:
formats:
default: "%d %B %Y %H:%M"
time: "%H:%M"
short: "%d %b %H:%M"
long: "%A %d %B %Y %H:%M:%S %Z"
long_ordinal: "%A %d %B %Y %H:%M:%S %Z"
only_second: "%S"
am: 'vormittags'
pm: 'nachmittags'
datetime:
distance_in_words:
half_a_minute: 'eine halbe Minute'
less_than_x_seconds:
one: 'weniger als eine Sekunde'
other: 'weniger als %{count} Sekunden'
x_seconds:
one: 'eine Sekunde'
other: '%{count} Sekunden'
less_than_x_minutes:
one: 'weniger als eine Minute'
other: 'weniger als %{count} Minuten'
x_minutes:
one: 'eine Minute'
other: '%{count} Minuten'
about_x_hours:
one: 'etwa eine Stunde'
other: 'etwa %{count} Stunden'
x_days:
one: 'ein Tag'
other: '%{count} Tage'
about_x_months:
one: 'etwa ein Monat'
other: 'etwa %{count} Monate'
x_months:
one: 'ein Monat'
other: '%{count} Monate'
almost_x_years:
one: 'fast ein Jahr'
other: 'fast %{count} Jahre'
about_x_years:
one: 'etwa ein Jahr'
other: 'etwa %{count} Jahre'
over_x_years:
one: 'mehr als ein Jahr'
other: 'mehr als %{count} Jahre'
prompts:
second: "Sekunden"
minute: "Minuten"
hour: "Stunden"
day: "Tag"
month: "Monat"
year: "Jahr"
number:
format:
precision: 2
separator: ','
delimiter: '.'
significant: false
strip_insignificant_zeros: false
currency:
format:
unit: '€'
format: '%n%u'
separator: ","
delimiter: ""
precision: 2
significant: false
strip_insignificant_zeros: false
percentage:
format:
delimiter: ""
precision:
format:
delimiter: ""
human:
format:
delimiter: ""
precision: 1
significant: true
strip_insignificant_zeros: true
storage_units:
# Storage units output formatting.
# %u is the storage unit, %n is the number (default: 2 MB)
format: "%n %u"
units:
byte:
one: "Byte"
other: "Bytes"
kb: "KB"
mb: "MB"
gb: "GB"
tb: "TB"
decimal_units:
format: "%n %u"
units:
unit: ""
thousand: Tausend
million: Millionen
billion:
one: Milliarde
others: Milliarden
trillion: Billionen
quadrillion:
one: Billiarde
others: Billiarden
support:
array:
sentence_connector: 'und'
skip_last_comma: true
words_connector: ", "
two_words_connector: " und "
last_word_connector: " und "

View File

@ -0,0 +1,62 @@
de:
errors:
messages:
not_found: "nicht gefunden"
already_confirmed: "wurde bereits bestätigt"
not_locked: "wurde nicht gesperrt"
devise:
failure:
admin:
unauthenticated: 'Du musst dich einloggen oder registrieren bevor es weiter geht.'
unconfirmed: 'Du musst deinen Account aktivieren bevor es weiter geht.'
locked: 'Dein Account ist gesperrt.'
invalid: 'Ungültige Email oder falsches Passwort.'
invalid_token: 'Ungültiges Authentifizierungs-Merkmal.'
timeout: 'Deine Session ist abgelaufe. Bitte logge dich erneut ein, dann geht es weiter.'
inactive: 'Dein Account wurde noch nicht aktiviert.'
sessions:
admin:
signed_in: 'Willkommen zu Hause!'
signed_out: 'Bis zum nächsten Mal.'
passwords:
admin:
send_instructions: 'Du bekommst in ein paar Minuten eine Email mit einer genauen Anleitung, wie du dein Passwort zurücksetzen kannst.'
updated: 'Dein Passwort wurde erfolgreich geändert. Du bist nun eingeloggt.'
confirmations:
admin:
send_instructions: 'Du bekommst in ein paar Minuten eine Email mit einer genauen Anleitung, wie du deinen Account aktivieren kannst.'
confirmed: 'Dein Account wurde erfolgreich aktiviert. Du bist nun eingeloggt.'
registrations:
admin:
signed_up: 'Du hast dich erfolgreich registriert.'
updated: 'Du hast deinen Account erfolgreich aktualisiert.'
destroyed: 'Tschüss! Dein Account wurder erfolgreich gelöscht. Hoffentlich sehen wir dich bald wieder!'
unlocks:
admin:
send_instructions: 'Du bekommst in ein paar Minuten eine Email mit einer genauen Anleitung, wie du deinen Account entsperren kannst.'
unlocked: 'Dein Account wurder erfolgreich entsperrt. Du bist nun eingeloggt.'
mailer:
admin:
confirmation_instructions: 'Anleitung zur Aktivierung'
reset_password_instructions: 'Anleitung zum Zurücksetzen deines Passworts'
unlock_instructions: 'Anleitung zur Entsperrung'
admin:
mailer:
common:
hello: Hallo
confirmation_instructions:
you_can_confirm_your_account_through_the_link_below: "Du kannst deinen Account mit folgenden Link aktivieren:"
confirm_my_account: "Aktivieren deinen Account"
reset_password_instructions:
reset_password_instruction: "Irgendwer hat eine Anfrage zur Änderung deines Passworts beantragt. Mit folgendem Link kannst du genau das erreichen:"
change_my_password: "Ändere mein Passwort"
wrong_request_instruction: "Wenn du diese nicht selbst angefordert hast, dann ignoriere diese Email bitte."
unchange_password_message: "Dein Passwort ändert sich nicht, bevor du auf den Link klickst und ein neues erstellst."
unlock_instructions:
locked_account_message: "Dein Account wurde leider gesperrt, weil unzählige Male vergeblich versucht wurde sich einzuloggen."
unlock_account_instruction: "Klicke auf den folgenden Link, um deinen Account zu entsperren:"
unlock_my_account: "Entsperre meinen Account"

View File

@ -12,6 +12,7 @@ en:
unconfirmed: 'You have to confirm your account before continuing.'
locked: 'Your account is locked.'
invalid: 'Invalid email or password.'
no_membership: 'Your account is not a member of this site, please contact the site administrator to gain access.'
invalid_token: 'Invalid authentication token.'
timeout: 'Your session expired, please sign in again to continue.'
inactive: 'Your account was not activated yet.'

116
config/locales/flash.de.yml Normal file
View File

@ -0,0 +1,116 @@
de:
flash:
admin:
pages:
create:
notice: "Seite wurde erfolgreich erstellt."
alert: "Seite wurde nicht erstellt."
update:
notice: "Seite wurde erfolreich aktualisiert."
alert: "Seite wurde nicht aktualisiert."
sort:
notice: "Seiten wurden erfolgreich sortiert."
destroy:
notice: "Seite wurde erfolgreich gelöscht."
contents:
create:
notice: "Inhalt wurde erfolgreich erstellt."
alert: "Inhalt wurde nicht erstellt."
update:
notice: "Inhalt wurde erfolreich aktualisiert."
alert: "Inhalt wurde nicht aktualisiert."
sort:
notice: "Inhalte wurden erfolgreich sortiert."
destroy:
notice: "Inhalt wurde erfolgreich gelöscht."
content_types:
create:
notice: "Baustein wurde erfolgreich erstellt."
alert: "Baustein wurde nicht erstellt."
update:
notice: "Baustein wurde erfolreich aktualisiert."
alert: "Baustein wurde nicht aktualisiert."
destroy:
notice: "Baustein wurde erfolgreich gelöscht."
current_sites:
update:
notice: "Meine Webseite wurde erfolreich aktualisiert."
alert: "Meine Webseite wurde nicht aktualisiert."
snippets:
create:
notice: "Snippet wurde erfolgreich erstellt."
alert: "Snippet wurde nicht erstellt."
update:
notice: "Snippet wurde erfolreich aktualisiert."
alert: "Snippet wurde nicht aktualisiert."
destroy:
notice: "Snippet wurde erfolgreich gelöscht."
accounts:
create:
notice: "Account wurde erfolgreich erstellt."
alert: "Account wurde nicht erstellt."
my_accounts:
update:
notice: "Mein Account wurde erfolreich aktualisiert."
alert: "Mein Account wurde nicht aktualisiert."
sites:
create:
notice: "Webseite wurde erfolgreich erstellt."
alert: "Webseite wurde nicht erstellt."
destroy:
notice: "Webseite wurde erfolgreich gelöscht."
memberships:
create:
notice: "Account wurde erfolgreich erstellt."
alert: "Account wurde nicht erstellt."
already_created: "Account wurde bereits zu dieser Webseite hinzugefügt."
asset_collections:
create:
notice: "Sammlung wurde erfolgreich erstellt."
alert: "Sammlung wurde nicht erstellt."
update:
notice: "Sammlung wurde erfolreich aktualisiert."
alert: "Sammlung wurde nicht aktualisiert."
destroy:
notice: "Sammlung wurde erfolgreich gelöscht."
assets:
create:
notice: "Asset wurde erfolgreich erstellt."
alert: "Asset wurde nicht erstellt."
update:
notice: "Asset wurde erfolreich aktualisiert."
alert: "Asset wurde nicht aktualisiert."
theme_assets:
create:
notice: "Datei wurde erfolgreich erstellt."
alert: "Datei wurde nicht erstellt."
update:
notice: "Datei wurde erfolreich aktualisiert."
alert: "Datei wurde nicht aktualisiert."
destroy:
notice: "Datei wurde erfolgreich gelöscht."
custom_fields:
update:
alert: "Feld nicht aktualisiert"
cross_domain_sessions:
create:
alert: "Du musst dich einloggen"
imports:
create:
done: "Deine Webseite wurde erfolreich aktualisiert."
notice: "Deine Webseite wird aktualisiert."
alert: "Der Import war nicht erfolgreich."

View File

@ -0,0 +1,68 @@
de:
formtastic:
titles:
information: Allgemeine Informationen
meta: Suchmaschinen-Metadaten
code: Code
raw_template: Vorlage
credentials: Persönliche Daten
language: Sprache
sites: Webseiten
access_points: Domains
memberships: Accounts
membership_email: Account Email
file: Datei
preview: Vorschau
options: Fortgeschrittene Optionen
custom_fields: Benutzerdefinierte Felder
other_fields: Weitere Informationen
presentation: Anzeige
attributes: Attribute
upload: Upload
labels:
theme_asset:
plain_text_name: Datei-Name
content_type: Datei-Typ
new:
source: Datei
edit:
source: Datei ersetzen
custom_fields:
field:
_alias: Alias
import:
new:
source: Datei
samples: Beispiele kopieren
reset: Webseite zurücksetzen
content_type:
api_accounts: Benachrichtigte Accounts
hints:
page:
published: "Nur authentifizierte Accounts können nicht publizierte Seiten ansehen."
cache_strategy: "Cache die Seiten, um eine bessere Geschwindigkeit zu erzielen. Die 'Einfach' Option ist ein guter Kompromiss."
templatized: "Nutze diese Seite als Vorlage für einen Baustein, den du erstellt hast."
listed: "Regele, ob die Seite in den generierten Menüs angezeigt werden soll."
content_type_id: "Der Baustein für den diese Seite als Vorlage dienen soll."
snippet:
slug: "You need to know it in order to insert the snippet inside a page"
site:
meta_keywords: "Meta-Schlagworte, die im HEAD-Berecih der Webseite genutzt werden. Die einzelnen Wörter werden durch eine Leertaste getrennt. Diese werden für die Suchmaschinen benötigt."
meta_description: "Meta-Beschreibung, die im HEAD-Bereich der Webseite genutzt wird. Diese wird für die Suchmaschinen benötigt."
domain_name: "z.B: getbenga.com"
theme_asset:
slug: "Du musst die Dateiendung nicht angeben (.css or .js)"
edit:
source: "Du kannst diese Datei durch eine Datei mit gleicher Dateiendung ersetzen"
custom_fields:
field:
_alias: "Merkmal verfügbar in den liquid-Templates"
hint: "Hilfe-Text, der im Formular des Bausteins direkt unter dem jeweiligen Feld angezeigt wird"
import:
source: "Eine zip-Datei, die eine databse.yml, Assets und Templates enthält"
samples: "Bei Aktivierung werden auch Inhalte und Assets importiert"
reset: "Bei Aktivierung werden alle Daten deiner Webseite gelöscht, bevor die neue Webseite importiert wird"
content_type:
api_enabled: "Dies wird genutzt, um Besuchern deiner Webseite die Möglichkeit zu geben neue Elemente zu erstellen (z.B: Nachrichten in einem Kontakt-Formular)"
api_accounts: "Sobald ein Besucher ein neues Element erstellt, wird eine Benachrichtigungs-Email an alle unten aufgeführten Accounts gesendet"

View File

@ -1,5 +1,6 @@
defaults: &defaults
host: localhost
port: 27017
# slaves:
# - host: slave1.local
# port: 27018

View File

@ -1,9 +1,12 @@
BOARD:
x pull requests #31 et #32
- duostack version
- bugs
- editable_elements slug becomes nil
- pull requests #31 et #32
- uploading videos http://groups.google.com/group/carrierwave/browse_thread/thread/6e211d98f1ff4bc0/51717c2167695ca2?lnk=gst&q=version#51717c2167695ca2
- editable_elements not updated (doesn't use index anymore)
- custom_fields not deleted (doesn't use index anymore)
- editable_elements: inheritable: false (Mattias)
- 2 different sites on the same main domain (one in www, the other one in something else) (Raphael Costa)

View File

@ -35,7 +35,7 @@ Locomotive.configure do |config|
# If you do not mind about importing theme without DelayedJob, disable it.
config.delayed_job = false
# default locale (for now, only en, fr and pt-BR are supported)
# default locale (for now, only en, de, fr and pt-BR are supported)
config.default_locale = :en
# Configure the e-mail address which will be shown in the DeviseMailer, NotificationMailer, ...etc

View File

@ -7,7 +7,7 @@ module Locomotive
:reserved_subdomains => %w{www admin email blog webmail mail support help site sites},
# :forbidden_paths => %w{layouts snippets stylesheets javascripts assets admin system api},
:reserved_slugs => %w{stylesheets javascripts assets admin images api pages edit},
:locales => %w{en fr pt-BR},
:locales => %w{en de fr pt-BR},
:cookie_key => '_locomotive_session',
:enable_logs => false,
:heroku => false,

View File

@ -9,6 +9,10 @@ module Locomotive
@index ||= @source.pages.root.first
end
def pages
@pages ||= @source.pages.to_a.collect(&:to_liquid)
end
end
end
end

View File

@ -38,8 +38,11 @@ module Locomotive
end
def validate_site_membership
return if current_site && current_site.accounts.include?(current_admin)
sign_out_and_redirect(current_admin)
return true if current_site.present? && current_site.accounts.include?(current_admin)
sign_out(current_admin)
flash[:alert] = I18n.t(:no_membership, :scope => [:devise, :failure, :admin])
redirect_to new_admin_session_url and return false
end
end

Binary file not shown.

After

Width:  |  Height:  |  Size: 215 B

View File

@ -158,6 +158,14 @@ var InlineEditorToolbar = {
'back': 'edition done',
'saving': 'saving'
},
'de': {
'home': 'admin',
'edit': 'bearbeiten',
'save': 'speichern',
'cancel': 'schließen',
'back': 'bearbeiten abschließen',
'saving': 'am Speichern'
},
'fr': {
'home': 'admin',
'edit': 'editer',

View File

@ -0,0 +1,18 @@
/* French initialisation for the jQuery UI date picker plugin. */
/* Written by Keith Wood (kbwood@virginbroadband.com.au) and Stéphane Nahmani (sholby@sholby.net). */
jQuery(function($){
$.datepicker.regional['de'] = {
closeText: 'Schließen',
prevText: '&#x3c;Zurück',
nextText: 'Vor&#x3e;',
currentText: 'Aktuell',
monthNames: ['Januar','Februar','März','April','Mai','Juni',
'Juli','August','September','Oktober','November','Dezember'],
monthNamesShort: ['Jan','Feb','Mar','Apr','Mai','Jun',
'Jul','Aug','Sep','Okt','Nov','Dez'],
dayNames: ['Sonntag','Montag','Dienstag','Mittwoch','Donnerstag','Freitag','Samstag'],
dayNamesShort: ['Son','Mon','Die','Mit','Don','Fre','Sam'],
dayNamesMin: ['So','Mo','Di','Mi','Do','Fr','Sa'],
dateFormat: 'dd.mm.yy', firstDay: 1,
isRTL: false};
});

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,9 @@
tinyMCE.addI18n('de.locoimage_dlg',{
dialog_title: 'Bild einfügen',
upload: 'Bild hochladen',
loading: 'Laden...',
uploading: 'Hochladen...',
destroying: 'Löschen...',
confirm: 'Bist du sicher ?',
no_items: 'Momentan gibt es hier keine Bilder.'
});

View File

@ -0,0 +1 @@
tinyMCE.addI18n('de.advanced',{underline_desc:"Unterstrichen (Strg+U)",italic_desc:"Kursiv (Strg+I)",bold_desc:"Fett (Strg+B)",dd:"Definitionsbeschreibung",dt:"Definitionsbegriff",samp:"Beispiel",code:"Code",blockquote:"Zitatblock",h6:"\u00dcberschrift 6",h5:"\u00dcberschrift 5",h4:"\u00dcberschrift 4",h3:"\u00dcberschrift 3",h2:"\u00dcberschrift 2",h1:"\u00dcberschrift 1",pre:"Rohdaten",address:"Adresse",div:"Zusammenh\u00e4ngender Bereich",paragraph:"Absatz",block:"Vorlage",fontdefault:"Schriftart",font_size:"Schriftgr\u00f6\u00dfe",style_select:"Format",anchor_delta_width:"13",more_colors:"Weitere Farben",toolbar_focus:"Zur Werkzeugleiste springen: Alt+Q; Zum Editor springen: Alt-Z; Zum Elementpfad springen: Alt-X",newdocument:"Wollen Sie wirklich den ganzen Inhalt l\u00f6schen?",path:"Pfad",clipboard_msg:"Kopieren, Ausschneiden und Einf\u00fcgen sind im Mozilla Firefox nicht m\u00f6glich.\nWollen Sie mehr \u00fcber dieses Problem erfahren?",blockquote_desc:"Zitatblock",help_desc:"Hilfe",newdocument_desc:"Neues Dokument",image_props_desc:"Bildeigenschaften",paste_desc:"Einf\u00fcgen",copy_desc:"Kopieren",cut_desc:"Ausschneiden",anchor_desc:"Anker einf\u00fcgen/ver\u00e4ndern",visualaid_desc:"Hilfslinien und unsichtbare Elemente ein-/ausblenden",charmap_desc:"Sonderzeichen einf\u00fcgen",backcolor_desc:"Hintergrundfarbe",forecolor_desc:"Textfarbe",custom1_desc:"Benutzerdefinierte Beschreibung",removeformat_desc:"Formatierungen zur\u00fccksetzen",hr_desc:"Trennlinie einf\u00fcgen",sup_desc:"Hochgestellt",sub_desc:"Tiefgestellt",code_desc:"HTML-Quellcode bearbeiten",cleanup_desc:"Quellcode aufr\u00e4umen",image_desc:"Bild einf\u00fcgen/ver\u00e4ndern",unlink_desc:"Link entfernen",link_desc:"Link einf\u00fcgen/ver\u00e4ndern",redo_desc:"Wiederholen (Strg+Y)",undo_desc:"R\u00fcckg\u00e4ngig (Strg+Z)",indent_desc:"Einr\u00fccken",outdent_desc:"Ausr\u00fccken",numlist_desc:"Sortierte Liste",bullist_desc:"Unsortierte Liste",justifyfull_desc:"Blocksatz",justifyright_desc:"Rechtsb\u00fcndig",justifycenter_desc:"Zentriert",justifyleft_desc:"Linksb\u00fcndig",striketrough_desc:"Durchgestrichen",anchor_delta_height:"",charmap_delta_height:"",charmap_delta_width:"",colorpicker_delta_height:"",colorpicker_delta_width:"",link_delta_height:"",link_delta_width:"",image_delta_height:"",image_delta_width:""});

View File

@ -0,0 +1 @@
tinyMCE.addI18n('de.advanced_dlg',{link_list:"Linkliste",link_is_external:"Diese Adresse scheint ein externer Link zu sein. M\u00f6chten Sie das dazu ben\u00f6tigte \"http://\" voranstellen?",link_is_email:"Diese Adresse scheint eine E-Mail-Adresse zu sein. M\u00f6chten Sie das dazu ben\u00f6tigte \"mailto:\" voranstellen?",link_titlefield:"Titel",link_target_blank:"Neues Fenster \u00f6ffnen",link_target_same:"Im selben Fenster \u00f6ffnen",link_target:"Fenster",link_url:"Adresse",link_title:"Link einf\u00fcgen/bearbeiten",image_align_right:"Rechts",image_align_left:"Links",image_align_textbottom:"Unten im Text",image_align_texttop:"Oben im Text",image_align_bottom:"Unten",image_align_middle:"Mittig",image_align_top:"Oben",image_align_baseline:"Zeile",image_align:"Ausrichtung",image_hspace:"Horizontaler Abstand",image_vspace:"Vertikaler Abstand",image_dimensions:"Abmessungen",image_alt:"Alternativtext",image_list:"Bilderliste",image_border:"Rahmen",image_src:"Adresse",image_title:"Bild einf\u00fcgen/bearbeiten",charmap_title:"Sonderzeichen",colorpicker_name:"Name:",colorpicker_color:"Farbe:",colorpicker_named_title:"Benannte Farben",colorpicker_named_tab:"Benannte Farben",colorpicker_palette_title:"Farbpalette",colorpicker_palette_tab:"Palette",colorpicker_picker_title:"Farbwahl",colorpicker_picker_tab:"Farbwahl",colorpicker_title:"Farbe",code_wordwrap:"Automatischer Zeilenumbruch",code_title:"HTML-Quellcode bearbeiten",anchor_name:"Name des Ankers",anchor_title:"Anker einf\u00fcgen/ver\u00e4ndern",about_loaded:"Geladene Plugins",about_version:"Version",about_author:"Urheber",about_plugin:"Plugin",about_plugins:"Plugins",about_license:"Lizenzbedingungen",about_help:"Hilfe",about_general:"\u00dcber",about_title:"\u00dcber TinyMCE",anchor_invalid:"Bitte spezifizieren Sie einen g\u00fcltigen Namen f\u00fcr den Anker!"});

View File

@ -0,0 +1 @@
tinyMCE.addI18n('de.simple',{cleanup_desc:"Quellcode aufr\u00e4umen",redo_desc:"Wiederholen (Strg+Y)",undo_desc:"R\u00fcckg\u00e4ngig (Strg+Z)",numlist_desc:"Nummerierung",bullist_desc:"Aufz\u00e4hlung",striketrough_desc:"Durchgestrichen",underline_desc:"Unterstrichen (Strg+U)",italic_desc:"Kursiv (Strg+I)",bold_desc:"Fett (Strg+B)"});

View File

@ -0,0 +1,32 @@
require 'spec_helper'
describe Locomotive::Liquid::Drops::Site do
before(:each) do
@site = Factory.build(:site)
page_1 = Factory.build(:page, :site => @site)
page_2 = Factory.build(:page, :site => @site, :title => 'About us', :slug => 'about_us')
@site.stubs(:pages).returns([page_1, page_2])
end
context '#pages' do
it 'has access to all the pages' do
render_template('{{ site.pages.size }}').should == '2'
end
it 'loops thru the pages' do
render_template('{% for page in site.pages %}{{ page.title }} {% endfor %}').should == 'Home page About us '
end
end
def render_template(template = '', assigns = {})
assigns = {
'site' => @site
}.merge(assigns)
Liquid::Template.parse(template).render(::Liquid::Context.new({}, assigns, { :site => @site }))
end
end

View File

@ -0,0 +1,247 @@
require 'spec_helper'
class MyController < ActionController::Base
include Locomotive::Routing::SiteDispatcher
end
describe Locomotive::Routing::SiteDispatcher do
before :each do
@controller = MyController.new
end
context 'inheriting the site dispatcher' do
before :each do
@controller = MyController.new
end
it 'adds a helper method for current site' do
@controller.should respond_to :current_site
end
end
describe '#fetch_site' do
before :each do
@request = Object.new
@site = Factory.build(:site)
@controller.stubs(:request).returns(@request)
@request.stubs(:host).returns('host')
@request.stubs(:env).returns({})
end
it 'returns the current site instance if available' do
@controller.instance_variable_set(:@current_site, @site)
@controller.send(:fetch_site).should == @site
end
it 'returns the site with matching domain if there is no current site instance' do
Site.expects(:match_domain).with('host').returns([@site])
@controller.send(:fetch_site).should == @site
end
end
describe '#current_site' do
before :each do
@site = Factory.build(:site)
end
it 'returns the current site instance if available' do
@controller.instance_variable_set(:@current_site, @site)
@controller.send(:current_site).should == @site
end
it 'runs fetch site if no instance is available' do
@controller.stubs(:fetch_site).returns(@site)
@controller.send(:current_site).should == @site
end
end
describe '#require_site' do
context 'when there is a current site' do
before :each do
@controller.expects(:current_site).returns(true)
end
it 'returns true' do
@controller.send(:require_site).should be_true
end
end
context 'when there are no accounts' do
before :each do
Account.expects(:count).returns(0)
@controller.instance_variable_set('@_response', ActionDispatch::Response.new)
@controller.expects(:current_site).returns(false)
@controller.stubs(:admin_installation_url).returns('/admin/install/url/')
@controller.stubs(:redirect_to).with('/admin/install/url/')
end
it 'returns false' do
@controller.send(:require_site).should be_false
end
it 'redirects to the admin installation url' do
@controller.expects(:redirect_to).with('/admin/install/url/')
@controller.send(:require_site)
end
end
context 'when there are no sites' do
before :each do
Account.expects(:count).returns(1)
Site.expects(:count).returns(0)
@controller.instance_variable_set('@_response', ActionDispatch::Response.new)
@controller.expects(:current_site).returns(false)
@controller.stubs(:admin_installation_url).returns('/admin/install/url/')
@controller.stubs(:redirect_to).with('/admin/install/url/')
end
it 'returns false' do
@controller.send(:require_site).should be_false
end
it 'redirects to the admin installation url' do
@controller.expects(:redirect_to).with('/admin/install/url/')
@controller.send(:require_site)
end
end
context 'when there is no current site' do
before :each do
Account.expects(:count).returns(1)
Site.expects(:count).returns(1)
@controller.instance_variable_set('@_response', ActionDispatch::Response.new)
@controller.expects(:current_site).returns(false)
end
it 'returns false' do
@controller.send(:require_site).should be_false
end
it 'renders the no site error' do
@controller.expects(:render_no_site_error)
@controller.send(:require_site)
end
end
end
describe '#render_no_site_error' do
it 'renders the no site template with no layout' do
@controller.expects(:render).with(:template => '/admin/errors/no_site', :layout => false)
@controller.send(:render_no_site_error)
end
end
describe '#validate_site_membership' do
before :each do
@account = Factory.build(:account)
@site = Factory.build(:site)
@request = ActionDispatch::Request.new({})
@controller.instance_variable_set('@_response', ActionDispatch::Response.new)
@controller.stubs(:request).returns(@request)
@controller.stubs(:current_admin).returns(@account)
@controller.stubs(:sign_out).with(@account)
@controller.stubs(:new_admin_session_url).returns('/new/admin/session')
end
context 'when a site is present' do
before :each do
@controller.stubs(:current_site).returns(@site)
end
context 'and the user has a membership' do
before :each do
@site.stubs(:accounts).returns([@account])
end
it 'returns true' do
@controller.send(:validate_site_membership).should be_true
end
end
context 'and the user does not have a membership' do
before :each do
@site.stubs(:accounts).returns([])
end
it 'signs out the user' do
@controller.expects(:sign_out).with(@account)
@controller.send(:validate_site_membership)
end
it 'adds a flash message for no membership' do
@controller.send(:validate_site_membership)
@controller.flash[:alert].should be_present
end
it 'redirects to the new session url' do
@controller.expects(:redirect_to).with('/new/admin/session')
@controller.send(:validate_site_membership)
end
it 'returns false' do
@controller.send(:validate_site_membership).should be_false
end
end
end
context 'when no site is present' do
before :each do
@controller.stubs(:current_site).returns(nil)
end
it 'signs out the user' do
@controller.expects(:sign_out).with(@account)
@controller.send(:validate_site_membership)
end
it 'adds a flash message for no membership' do
@controller.send(:validate_site_membership)
@controller.flash[:alert].should be_present
end
it 'redirects to the new session url' do
@controller.expects(:redirect_to).with('/new/admin/session')
@controller.send(:validate_site_membership)
end
it 'returns false' do
@controller.send(:validate_site_membership).should be_false
end
end
end
end

View File

@ -0,0 +1,55 @@
require 'spec_helper'
describe EditableElement do
before(:each) do
@site = Factory(:site)
@home = @site.pages.root.first
@home.update_attributes :raw_template => "{% block body %}{% editable_short_text 'body' %}Lorem ipsum{% endeditable_short_text %}{% endblock %}"
@sub_page_1 = Factory(:page, :slug => 'sub_page_1', :parent => @home, :raw_template => "{% extends 'parent' %}")
@sub_page_2 = Factory(:page, :slug => 'sub_page_2', :parent => @home, :raw_template => "{% extends 'parent' %}")
@sub_page_1_1 = Factory(:page, :slug => 'sub_page_1_1', :parent => @sub_page_1, :raw_template => "{% extends 'parent' %}")
end
context 'in sub pages level #1' do
before(:each) do
@sub_page_1.reload
@sub_page_2.reload
end
it 'exists' do
@sub_page_1.editable_elements.size.should == 1
@sub_page_2.editable_elements.size.should == 1
end
it 'has a non-nil slug' do
@sub_page_1.editable_elements.first.slug.should == 'body'
end
end
context 'in sub pages level #2' do
before(:each) do
@sub_page_1_1.reload
end
it 'exists' do
@sub_page_1_1.editable_elements.size.should == 1
end
it 'has a non-nil slug' do
@sub_page_1_1.editable_elements.first.slug.should == 'body'
end
it 'removes editable elements' do
@sub_page_1_1.editable_elements.destroy_all
@sub_page_1_1.reload
@sub_page_1_1.editable_elements.size.should == 0
end
end
end