From 676bd764fa602048c1a81d94943f45dcb1a75c76 Mon Sep 17 00:00:00 2001 From: Unknwon Date: Sun, 31 Aug 2014 21:03:16 +0800 Subject: UI: SSH/HTTPS address switch and copy --- conf/locale/locale_en-US.ini | 6 ++++++ conf/locale/locale_zh-CN.ini | 6 ++++++ 2 files changed, 12 insertions(+) (limited to 'conf') diff --git a/conf/locale/locale_en-US.ini b/conf/locale/locale_en-US.ini index 3dfbdc3aad..a99eb92e7e 100644 --- a/conf/locale/locale_en-US.ini +++ b/conf/locale/locale_en-US.ini @@ -185,6 +185,7 @@ migrate_type = Migration Type migrate_type_helper = This repository will be a Mirror migrate_repo = Migrate Repository +copy_link = Copy clone_helper = Need help cloning? Visit Help! unwatch = Unwatch watch = Watch @@ -192,6 +193,11 @@ unstar = Unstar star = Star fork = Fork +quick_guide = Quick Guide +clone_this_repo = Clone this repository +create_new_repo_command = Create a new repository on the command line +push_exist_repo = Push an existing repository from the command line + settings = Settings settings.options = Options settings.collaboration = Collaboration diff --git a/conf/locale/locale_zh-CN.ini b/conf/locale/locale_zh-CN.ini index d498da9c10..21442539ab 100644 --- a/conf/locale/locale_zh-CN.ini +++ b/conf/locale/locale_zh-CN.ini @@ -185,6 +185,7 @@ migrate_type = 迁移类型 migrate_type_helper = 本仓库将是 镜像 migrate_repo = 迁移仓库 +copy_link = 复制链接 clone_helper = 不知道如何操作?访问 此处 查看帮助! unwatch = 取消关注 watch = 关注 @@ -192,6 +193,11 @@ unstar = 取消点赞 star = 点赞 fork = 派生 +quick_guide = 快速帮助 +clone_this_repo = 克隆当前仓库 +create_new_repo_command = 从命令行创建一个新的仓库 +push_exist_repo = 从命令行推送已经创建的仓库 + settings = 仓库设置 settings.options = 基本设置 settings.collaboration = 管理协作者 -- cgit v1.2.3 From c30063eefbfc58a811695ccb7d0a46d1ffcc95f5 Mon Sep 17 00:00:00 2001 From: fanningert Date: Sun, 31 Aug 2014 15:18:29 +0200 Subject: Update locale_de-DE.ini --- conf/locale/locale_de-DE.ini | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) (limited to 'conf') diff --git a/conf/locale/locale_de-DE.ini b/conf/locale/locale_de-DE.ini index b40c7b7894..9fc03ee630 100644 --- a/conf/locale/locale_de-DE.ini +++ b/conf/locale/locale_de-DE.ini @@ -113,10 +113,10 @@ last_org_owner = The user to remove is the last member in owner team. There must invalid_ssh_key = Leider sind wir nicht in der Lage, Ihren SSH-Schlüssel zu überprüfen: %s auth_failed = Authentifizierung fehlgeschlagen: %v -still_own_repo = Your account still have ownership of repository, you have to delete or transfer them first. -org_still_own_repo = This organization still have ownership of repository, you have to delete or transfer them first. +still_own_repo = Ihr Konto ist noch immer der Eigentümer vom Repositorie, Sie müssen es zuerst löschen oder übertragen. +org_still_own_repo = Diese Organisation ist noch immer der Eigentümer vom Repositorie, Sie müssen es zuerst löschen oder übertragen. -still_own_user = This authentication still has used by some users, you should move them and then delete again. +still_own_user = Diese Authentifizierung wird noch immer von einigen Benutzern verwendet, Sie sollten sie verschieben und dann erneut löschen. [settings] profile = Profil @@ -132,7 +132,7 @@ full_name = Vollständiger Name website = Website location = Standort update_profile = Profil aktualisieren -update_profile_success = Your profile has been successfully updated. +update_profile_success = Ihr Profil wurde erfolgreich aktualisiert. change_password = Kennwort ändern old_password = Aktuelles Kennwort @@ -185,6 +185,7 @@ migrate_type = Migrationstyp migrate_type_helper = Dieses Repository wird ein Mirror migrate_repo = Repositorie migrieren +copy_link = Copy clone_helper = Need help cloning? Visit Help! unwatch = Beobachtung beenden watch = Beobachtung @@ -192,13 +193,18 @@ unstar = Markierung aufheben star = Markierung fork = Abspaltung +quick_guide = Kurzanleitung +clone_this_repo = Dieses Repositorie klonen +create_new_repo_command = Erstellen Sie ein neues Repositorie mittels der Kommandozeile +push_exist_repo = Push an existing repository from the command line + settings = Einstellungen settings.options = Optionen settings.collaboration = Zusammenarbeit settings.hooks = Webhooks settings.deploy_keys = Schlüssel bereitstellen settings.basic_settings = Grundeinstellungen -settings.danger_zone = Danger Zone +settings.danger_zone = Gefahrenzone settings.site = Offizielle Website settings.update_settings = Aktualisierungseinstellungen settings.transfer = Eigentum übertragen @@ -207,7 +213,7 @@ settings.delete = Dieses Repository löschen settings.delete_desc = Sobald Sie ein Repository löschen, gibt es keinen Weg zurück. Bitte seien Sie sicher. settings.update_settings_success = Repository Optionen wurde erfolgreich aktualisiert. settings.transfer_owner = Neuer Besitzer -settings.make_transfer = Make Transfer +settings.make_transfer = Übertragung erstellen settings.confirm_delete = Löschung bestätigen settings.add_collaborator = Neuer Mitarbeiter hinzufügen settings.add_collaborator_success = Neuer Mitarbeiter wurde hinzugefügt. @@ -348,7 +354,6 @@ dashboard.gc_times = GC Takt users.user_manage_panel = User Manage Panel users.new_account = Neues Konto erstellen users.name = Name -users.email = E-mail users.activated = Aktiviert users.admin = Admin users.repos = Repos -- cgit v1.2.3 From 80447f1168f06d4ffe80d9d9cb4eeb2bc1a42d66 Mon Sep 17 00:00:00 2001 From: fanningert Date: Sun, 31 Aug 2014 16:10:02 +0200 Subject: Update german translation with PR #404 --- conf/locale/locale_de-DE.ini | 344 +++++++++++++++++++++---------------------- 1 file changed, 172 insertions(+), 172 deletions(-) (limited to 'conf') diff --git a/conf/locale/locale_de-DE.ini b/conf/locale/locale_de-DE.ini index 9fc03ee630..07fe5f9162 100644 --- a/conf/locale/locale_de-DE.ini +++ b/conf/locale/locale_de-DE.ini @@ -1,4 +1,4 @@ -app_desc = Ein schmerzloses selbst gehostetes Git-Service welches in Go geschrieben wurde +app_desc = Ein einfacher, selbst gehostetes Git-Service, geschrieben in Go. home = Home dashboard = Dashboard @@ -12,16 +12,16 @@ register = Registrieren website = Webseite version = Version page = Seite -template = Template +template = Vorlage language = Sprache username = Benutzername -email = E-mail -password = Kennwort -re_type = neu tippen +email = E-Mail +password = Passwort +re_type = wiederholen captcha = Captcha -repository = Repositorie +repository = Repository organization = Organisation mirror = Spiegel new_repo = Neues Repository @@ -39,154 +39,154 @@ issues = Issues cancel = Abbrechen [home] -uname_holder = Benutzername oder E-mail -password_holder = Kennwort +uname_holder = Benutzername oder E-Mail +password_holder = Passwort switch_dashboard_context = Switch Dashboard Context -my_repos = Meine Repositories -collaborative_repos = Collaborative Repositories +my_repos = Meine Repositorys +collaborative_repos = Gemeinschaftliche Repositorys my_orgs = Meine Organisationen my_mirrors = Meine Spiegel [auth] create_new_account = Neues Konto erstellen -register_hepler_msg = Sie haben bereits ein Konto? Jetzt anmelden! -social_register_hepler_msg = Sie haben bereits ein Konto? Verknüpfe es jetzt! -disable_register_prompt = Es tut uns leid, die Registrierung wurde deaktiviert. Bitte wende Sie sich an den Administrator. -disable_register_mail = Es tut uns leid, die Registrierung E-Mail Bestätigung wurde deaktiviert. -remember_me = Erinnere mich -forgot_password= Kennwort vergessen -forget_password = Kennwort vergessen? -sign_up_now = Benötigen Sie ein Konto? Registrieren Sie sich jetzt. +register_hepler_msg = Du hast schon ein Konto? Jetzt anmelden! +social_register_hepler_msg = Du hast schon ein Konto? Jetzt verknüpfen! +disable_register_prompt = Es tut uns leid, die Registrierung wurde deaktiviert. Bitte wende dich an den Administrator. +disable_register_mail = Es tut uns leid, die Bestätigung der Registrierungs-E-Mail wurde deaktiviert. +remember_me = angemeldet bleiben +forgot_password= Passwort vergessen +forget_password = Passwort vergessen? +sign_up_now = Du willst ein Konto? Jetzt registrieren! confirmation_mail_sent_prompt = A new confirmation e-mail has been sent to %s, please check your inbox within the next %d hours to complete your registration. -sign_in_email = Melden Sie sich mit Ihrer E-Mailadresse an -active_your_account = Aktivieren Sie Ihr Konto +sign_in_email = Melden dich mit deiner E-Mail-Adresse an +active_your_account = Aktivieren dein Konto resent_limit_prompt = Sorry, you are sending an activation e-mail too frequently. Please wait 3 minutes. has_unconfirmed_mail = Hi %s, you have an unconfirmed email address(%s). If you haven't received a confirmation e-mail or need to resend a new one, please click on the button below. -resend_mail = Klicken Sie hier, um Ihre Aktivierungs-E-Mail erneut senden +resend_mail = Klicke hier, um deine Aktivierungs-E-Mail nochmal zu senden email_not_associate = Diese E-Mail-Adresse ist mit keinen Konto verknüpft. -send_reset_mail = Klicken Sie hier, um sich das E-Mail zum Kennwort zurücksetzen erneut zu senden -reset_password = Ihr Kennwort zurücksetzen -invalid_code = Es tut uns leid, Ihre Bestätigungscode abgelaufen ist oder nicht gültig. -reset_password_helper = Klicken Sie hier, um Ihr Kennwort zurückzusetzen -password_too_short = Passwortlänge kann nicht weniger als 6 sein. +send_reset_mail = Hier klicken, um die E-Mail zum Passwort-zurücksetzen erneut zu versenden +reset_password = Passwort zurücksetzen +invalid_code = Es tut uns leid, der Bestätigungscode ist abgelaufen oder ungültig. +reset_password_helper = Hier klicken, um das Passwort zurückzusetzen +password_too_short = Das Passwort muss mindenstens 6 Zeichen lang sein [form] UserName = Benutzername RepoName = Repository Name Email = E-Mail-Adresse -Password = Kennwort -Retype = Kennwort erneut eingeben -SSHTitle = SSH Schlüsselname -HttpsUrl = HTTPS URL +Password = Passwort +Retype = Passwort erneut eingeben +SSHTitle = SSH-Schlüsselname +HttpsUrl = HTTPS-URL PayloadUrl = Payload URL TeamName = Teamname AuthName = Authentifizierungsname require_error = ` darf nicht leer sein.` -alpha_dash_error = ` must be valid alpha or numeric or dash(-_) characters.` -alpha_dash_dot_error = ` must be valid alpha or numeric or dash(-_) or dot characters.` +alpha_dash_error = ` kann ausschließlich alphanumerische Zeichen und "-_" enthalten.` +alpha_dash_dot_error = ` kann ausschließlich alphanumerische Zeichen und ".-_" enthalten.` min_size_error = ` muss mindestens %s Zeichen enthalten.` max_size_error = ` darf höchstens %s Zeichen enthalten.` email_error = ` ist keine gültige E-Mail-Adresse.` url_error = ` ist keine gültige URL.` unknown_error = Unbekannter Fehler: captcha_incorrect = Captcha stimmt nicht überein. -password_not_match = Die Kennwörter stimmen nicht überein. +password_not_match = Die Passwörter stimmen nicht überein. username_been_taken = Benutzername ist bereits vergeben. repo_name_been_taken = Repository Name ist bereits vergeben. org_name_been_taken = Organisationsname ist bereits vergeben. team_name_been_taken = Teamname ist bereits vergeben. -email_been_used = E-Mail-Adresse ist bereits vergeben. -ssh_key_been_used = Public-Key Name wird bereits verwendet. +email_been_used = E-Mail-Adresse wird bereits verwendet. +ssh_key_been_used = SSH-Schlüsselname wird bereits verwendet. illegal_username = Ihr Benutzername enthält ungültige Zeichen. -illegal_repo_name = Repository Name enthält ungültige Zeichen. +illegal_repo_name = Repository-Name enthält ungültige Zeichen. illegal_org_name = Organisationsname enthält ungültige Zeichen. illegal_team_name = Teamname enthält ungültige Zeichen. -username_password_incorrect = Benutzername oder Kennwort ist nicht korrekt. -enterred_invalid_repo_name = Bitte stellen Sie sicher, dass der eingegeben Repository Name richtig ist. -enterred_invalid_owner_name = Bitte stellen Sie sicher, dass der eingegeben Eigentümername richtig ist. +username_password_incorrect = Benutzername oder Passwort ist nicht korrekt. +enterred_invalid_repo_name = Bitte stellen Sie sicher, dass der eingegeben Repository-Name richtig ist. +enterred_invalid_owner_name = Bitte stellen Sie sicher, dass der eingegeben Besitzername richtig ist. enterred_invalid_password = Bitte stellen Sie sicher, dass das eingegebene Passwort richtig ist. user_not_exist = Angegebener Benutzer existiert nicht. -last_org_owner = The user to remove is the last member in owner team. There must be another owner. +last_org_owner = Der zu entfernende Benutzer ist der letzte Teambesitzer. Es muss einen anderen Besitzer geben. invalid_ssh_key = Leider sind wir nicht in der Lage, Ihren SSH-Schlüssel zu überprüfen: %s auth_failed = Authentifizierung fehlgeschlagen: %v -still_own_repo = Ihr Konto ist noch immer der Eigentümer vom Repositorie, Sie müssen es zuerst löschen oder übertragen. -org_still_own_repo = Diese Organisation ist noch immer der Eigentümer vom Repositorie, Sie müssen es zuerst löschen oder übertragen. +still_own_repo = Dein Konto besitzt noch Repositorys. Diese müssen zuerst gelöscht oder übertragen werden. +org_still_own_repo = Diese Organisation besitzt noch Repositorys. Diese müssen zuerst gelöscht oder übertragen werden. -still_own_user = Diese Authentifizierung wird noch immer von einigen Benutzern verwendet, Sie sollten sie verschieben und dann erneut löschen. +still_own_user = Diese Authentifizierung wird noch von einigen Benutzern genutzt. Entferne diese zuvor und lösche erneut. [settings] profile = Profil -password = Kennwort +password = Passwort ssh_keys = SSH-Schlüssel -social = Social Konten +social = Soziale Konten orgs = Organisationen -delete = Delete Accoount +delete = Konto löschen public_profile = Öffentliches Profil profile_desc = Your Email address is public and will be used for any account related notifications, and any web based operations made via the site. full_name = Vollständiger Name -website = Website +website = Webseite location = Standort update_profile = Profil aktualisieren -update_profile_success = Ihr Profil wurde erfolgreich aktualisiert. +update_profile_success = Dein Profil wurde aktualisiert. -change_password = Kennwort ändern -old_password = Aktuelles Kennwort -new_password = Neues Kennwort -password_incorrect = Aktuelles Kennwort ist nicht korrekt. -change_password_success = Kennwort erfolgreich geändert. Sie können nun mittels des neuen Kennwortes anmelden. +change_password = Passwort ändern +old_password = Aktuelles Passwort +new_password = Neues Passwort +password_incorrect = Aktuelles Passwort ist nicht korrekt. +change_password_success = Passwort erfolgreich geändert. Du kannst dich jetzt mit dem neuen Passwort anmelden. manage_ssh_keys = SSH-Schlüssel verwalten -add_key = Schlüssel hinzufügen -ssh_desc = This is a list of SSH keys associated with your account. Remove any keys that you do not recognize. -ssh_helper = Need help? Check out our guide to generating SSH keys or troubleshoot common SSH Problems. +add_key = SSH-Schlüssel hinzufügen +ssh_desc = Dies ist eine Liste aller SSH-Schlüssel, die mit deinem Konto verküpft sind. Entferne alle Schlüssel, die du nicht kennst. +ssh_helper = Du brauchst Hilfe? Hier ist eine Anleitung zum Erzeugen von SSH-Schlüssel oder Problemlösung einfacher SSH-Probleme. add_new_key = SSH-Schlüssel hinzufügen key_name = Schlüsselname key_content = Inhalt -add_key_success = New SSH Key has been added! -delete_key = löschen +add_key_success = SSH-Schlüssel wurde hinzugefügt! +delete_key = SSH-Schlüssel löschen add_on = Hinzugefügt am last_used = Zuletzt verwendet auf no_activity = Keine neuen Aktivitäten -manage_social = Manage Associated Social Accounts -social_desc = This is a list of associated social accounts. Remove any binding that you do not recognize. +manage_social = Verküpfte soziale Konten verwalten +social_desc = Dies ist eine Liste verküpfter sozialer Konten. Entferne alle Verküpfungen, die du nicht kennst. unbind = Verknüpfung entfernen -unbind_success = Die Verknüpfung zum Social Konto wurde entfernt. +unbind_success = Die Verknüpfung zum sozialen Konto wurde entfernt. -delete_account = Löschen Sie Ihr Konto -delete_prompt = Die Operation wird Ihr Konto dauerhaft löschen und kann NICHT rückgängig gemacht werden! -confirm_delete_account = Löschung bestätigen +delete_account = Konto löschen +delete_prompt = Diese Aktion wird dein Konto dauerhaft löschen und kann NICHT rückgängig gemacht werden! +confirm_delete_account = Löschen bestätigen [repo] -owner = Eigentümer -repo_name = Repositorie Name -repo_name_helper = Tolle Repositorienamen sind kurz, einprägsam und einzigartig. +owner = Besitzer +repo_name = Repository-Name +repo_name_helper = Gute Repository-Namen sind kurz, einprägsam und einzigartig. visibility = Sichtbarkeit -visiblity_helper = Dieses Repositorie ist Privat +visiblity_helper = Dieses Repository ist Privat repo_desc = Beschreibung repo_lang = Sprache -repo_lang_helper = Wählen Sie eine .gitignore Datei +repo_lang_helper = Wähle eine .gitignore Datei license = Lizenz -license_helper = Wählen Sie eine Lizenzdatei aus -init_readme = Initialisieren dieses Repository mit einem README.md +license_helper = Wählen Sie eine Lizenz aus +init_readme = Repository mit README.md initialisieren create_repo = Repository erstellen -default_branch = Default Branch -mirror_interval = Mirror Intervall(Stunden) +default_branch = Standard-Branch +mirror_interval = Spiegel-Intervall (in Stunden) goget_meta = Go-Get Meta goget_meta_helper = This repository will be Go-Getable -need_auth = Berechtigung erforderlich +need_auth = Authorisierung benötigt migrate_type = Migrationstyp -migrate_type_helper = Dieses Repository wird ein Mirror -migrate_repo = Repositorie migrieren +migrate_type_helper = Dieses Repository wird ein Spiegel +migrate_repo = Repository migrieren -copy_link = Copy -clone_helper = Need help cloning? Visit Help! +copy_link = Klonen +clone_helper = Du brauchst Hilef beim klonen? Hier gibt esHilfe! unwatch = Beobachtung beenden watch = Beobachtung unstar = Markierung aufheben @@ -207,45 +207,45 @@ settings.basic_settings = Grundeinstellungen settings.danger_zone = Gefahrenzone settings.site = Offizielle Website settings.update_settings = Aktualisierungseinstellungen -settings.transfer = Eigentum übertragen -settings.transfer_desc = Transfer this repo to another user or to an organization where you have admin rights. -settings.delete = Dieses Repository löschen -settings.delete_desc = Sobald Sie ein Repository löschen, gibt es keinen Weg zurück. Bitte seien Sie sicher. -settings.update_settings_success = Repository Optionen wurde erfolgreich aktualisiert. +settings.transfer = Besitz übertragen +settings.transfer_desc = Übertrage dieses Repository einem anderen Benutzer oder einer Organisation. +settings.delete = Repository löschen +settings.delete_desc = Wenn dieses Repository gelöschet ist, gibt es keinen Weg zurück. Sei dir sicher! +settings.update_settings_success = Repository-Optionen wurde erfolgreich aktualisiert. settings.transfer_owner = Neuer Besitzer -settings.make_transfer = Übertragung erstellen -settings.confirm_delete = Löschung bestätigen -settings.add_collaborator = Neuer Mitarbeiter hinzufügen +settings.make_transfer = übertragen +settings.confirm_delete = Löschen bestätigen +settings.add_collaborator = Neuen Mitarbeiter hinzufügen settings.add_collaborator_success = Neuer Mitarbeiter wurde hinzugefügt. settings.remove_collaborator_success = Mitarbeiter wurde entfernt. settings.add_webhook = Webhook hinzufügen -settings.hooks_desc = Webhooks allow external services to be notified when certain events happen on Gogs. When the specified events happen, we'll send a POST request to each of the URLs you provide. Learn more in our Webhooks Guide. +settings.hooks_desc = Webhooks erlauben es externe Dienste zu informieren, wenn etwas bestimmtes in deinem Repository passiert. GoGS sendet dann eine POST-Request an alle angegebenen URLs. Erfahre mehr in unserem Webhooks Guide. settings.remove_hook_success = Webhook wurde entfernt. -settings.add_webhook_desc = We’ll send a POST request to the URL below with details of any subscribed events. You can also specify which data format you'd like to receive (JSON, x-www-form-urlencoded, etc). More information can be found in Webhooks Guide. +settings.add_webhook_desc = GoGS sendet einen POST-Request an die unten stehende URL mit Details aller abonierten Ereignisse. Du kannst auch angeben, welches Datenformat du erhalten willst (JSON, x-www-form-urlencoded, etc). Mehr Informationen findest du im Webhooks Guide. settings.payload_url = Payload URL settings.content_type = Inhaltstyp settings.secret = Geheimnis -settings.event_desc = Durch welche Ereignisse würden Sie gerne diesen Webhook auslösen? -settings.event_push_only = Just the push event. +settings.event_desc = Welche Ereignisse sollen diesen Webhook auslösen? +settings.event_push_only = Nur das push-Ereignis. settings.active = Aktiv -settings.active_helper = We will deliver event details when this hook is triggered. +settings.active_helper = Ereignisdetails werden ausgeliefert, wenn dieser Webhook ausgelöst wird. settings.add_hook_success = Neuer Webhook wurde hinzugefügt. settings.update_webhook = Webhook aktualisieren settings.update_hook_success = Webhook wurde aktualisiert. settings.delete_webhook = Webhook löschen -settings.recent_deliveries = Jüngste Zustellungen +settings.recent_deliveries = letzte Zustellungen [org] org_name_holder = Name der Organisation -org_name_helper = Namen großer Organisationen sind kurz und einprägsam. -org_email_helper = E-Mail der Organisation empfängt alle Benachrichtigungen und Bestätigungen. +org_name_helper = Gute Namen von Organisationen sind kurz und einprägsam. +org_email_helper = Das E-Mail-Konto der Organisation empfängt alle Benachrichtigungen. create_org = Organisation erstellen repo_updated = Aktualisiert people = Personen invite_someone = Jemanden einladen teams = Teams lower_members = Mitglieder -lower_repositories = Repositories +lower_repositories = Repositorys create_new_team = Neues Team erstellen org_desc = Beschreibung team_name = Teamname @@ -260,68 +260,68 @@ settings.full_name = Vollständiger Name settings.website = Webseite settings.location = Standort settings.update_settings = Aktualisierungseinstellungen -settings.update_setting_success = Einstellung der Organisation wurde erfolgreich aktualisiert. +settings.update_setting_success = Einstellungen der Organisation wurden aktualisiert. settings.delete = Organisation löschen settings.delete_account = Diese Organisation löschen -settings.delete_prompt = Die Operation wird diese Organisation dauerhaft löschen und kann NICHT rückgängig gemacht werden! -settings.confirm_delete_account = Löschung bestätigen +settings.delete_prompt = Die Organisation wird dauerhaft gelöscht. Dies kann NICHT rückgängig gemacht werden! +settings.confirm_delete_account = Löschen bestätigen members.public = Öffentlich members.public_helper = Privat machen members.private = Privat members.private_helper = Öffentlich machen -members.owner = Eigentümer +members.owner = Besitzer members.member = Mitglied members.conceal = Verbergen members.remove = Entfernen members.leave = Verlassen -members.invite_desc = Start typing a username to invite a new member to %s: +members.invite_desc = Benutzernamen eingeben, um ihn als neues Mitglied in %s einzuladen: members.invite_now = Jetzt einladen teams.join = Beitreten teams.leave = Verlassen teams.read_access = Lesezugriff -teams.read_access_helper = This team will be able to view and clone its repositories. +teams.read_access_helper = Dieses Team wird Repositorys einsehen und klonen können. teams.write_access = Schreibzugriff -teams.write_access_helper = This team will be able to read its repositories, as well as push to them. +teams.write_access_helper = Dieses Team wird die Repositorys einsehen und in sie hinein pushen können. teams.admin_access = Adminzugriff -teams.admin_access_helper = This team will be able to push/pull to its repositories, as well as add other collaborators to them. +teams.admin_access_helper = Dieses Team wird pull- und push-Rechte für die Repositorys haben und Mitarbeiter einladen können. teams.no_desc = Dieses Team hat keine Beschreibung teams.settings = Einstellungen -teams.owners_permission_desc = Owners have full access to all repositories and have admin rights to the organization. +teams.owners_permission_desc = Besitzer haben vollen Zugriff auf alle Repositorys und Admin Rechte für diese Organisation. teams.members = Teammitglieder teams.update_settings = Einstellungen aktualisieren teams.delete_team = Dieses Team löschen teams.add_team_member = Teammitglied hinzufügen -teams.delete_team_success = Das Team wurde erfolgreich gelöscht. -teams.read_permission_desc = This team grants Read access: members can view and clone the team's repositories. -teams.write_permission_desc = This team grants Write access: members can read from and push to the team's repositories. -teams.admin_permission_desc = This team grants Admin access: members can read from, push to, and add collaborators to the team's repositories. -teams.repositories = Team Repositories -teams.add_team_repository = Teamrepositorie hinzufügen +teams.delete_team_success = Team gelöscht +teams.read_permission_desc = Dieses Team erlaubt LesezugriffSchreibzugriff: Mitglieder können Team-Repositorys einsehen und hinein pushen. +teams.admin_permission_desc = Diese Team erlaubt Adminzugriff: Mitglieder dieses Teams können pullen, pushen und dem Team Mitarbeiter hinzufügen. +teams.repositories = Team Repositorys +teams.add_team_repository = Team-Repository hinzufügen teams.remove_repo = Entfernen [admin] dashboard = Dashboard users = Benutzer organizations = Organisationen -repositories = Repositories +repositories = Repositorys authentication = Authentifizierung config = Konfiguration monitor = Monitoring -prev = Prev. -next = Next +prev = zurück +next = vor dashboard.statistic = Statistik dashboard.operations = Operationen -dashboard.system_status = System Monitor Status -dashboard.statistic_info = Gogs database has %d users, %d organizations, %d public keys, %d repositories, %d watches, %d stars, %d actions, %d accesses, %d issues, %d comments, %d social accounts, %d follows, %d mirrors, %d releases, %d login sources, %d webhooks, %d milestones, %d labels, %d hook tasks, %d teams, %d update tasks, %d attachments. +dashboard.system_status = System-Monitor-Status +dashboard.statistic_info = GoGS Datenbank hat %d Benutzer, %d Organizationen, %d öffentliche Schlüssel, %d Repositorys, %d watches, %d stars, %d actions, %d Zugriffe, %d issues, %d Kommentare, %d soziale Konten, %d follows, %d Spiegel, %d Releases, %d Login-Quellen, %d Webhooks, %d Milestones, %d Labels, %d Hook-Tasks, %d Teams, %d Aktualisierungs-Tasks, %d Anhänge. dashboard.operation_name = Operation Name dashboard.operation_switch = Switch -dashboard.operation_run = Run -dashboard.clean_unbind_oauth = Clean unbound OAuthes -dashboard.delete_inactivate_accounts = Alle inaktiven Konten löschen -dashboard.server_uptime = Server Uptime +dashboard.operation_run = Ausführen +dashboard.clean_unbind_oauth = ungebundene OAuthes bereinigen +dashboard.delete_inactivate_accounts = inaktiven Konten löschen +dashboard.server_uptime = Server-Uptime dashboard.current_goroutine = Aktuelle Goroutines dashboard.current_memory_usage = Aktuelle Speichernutzung dashboard.total_memory_allocated = Zugeteilter Gesamtspeicher @@ -329,29 +329,29 @@ dashboard.memory_obtained = Erhaltener Speicher dashboard.pointer_lookup_times = Pointer Lookup Times dashboard.memory_allocate_times = Memory Allocate Times dashboard.memory_free_times = Memory Free Times -dashboard.current_heap_usage = Current Heap Usage -dashboard.heap_memory_obtained = Heap Memory Obtained -dashboard.heap_memory_idle = Heap Memory Idle -dashboard.heap_memory_in_use = Heap Memory In Use -dashboard.heap_memory_released = Heap Memory Released -dashboard.heap_objects = Heap Objects -dashboard.bootstrap_stack_usage = Bootstrap Stack Usage -dashboard.stack_memory_obtained = Stack Memory Obtained -dashboard.mspan_structures_usage = MSpan Structures Usage -dashboard.mspan_structures_obtained = MSpan Structures Obtained -dashboard.mcache_structures_usage = MCache Structures Usage -dashboard.mcache_structures_obtained = MCache Structures Obtained +dashboard.current_heap_usage = Aktuelle Heap-Auslastung +dashboard.heap_memory_obtained = erhaltener Heap-Memory +dashboard.heap_memory_idle = unbenutzter Heap-Memory +dashboard.heap_memory_in_use = benutzer Heap-Memory +dashboard.heap_memory_released = freigegebener Heap-Memory +dashboard.heap_objects = Heap-Objekte +dashboard.bootstrap_stack_usage = Bootstrap-Stack-Auslastung +dashboard.stack_memory_obtained = erhaltener Stack-Memory +dashboard.mspan_structures_usage = MSpan-Structures-Auslastung +dashboard.mspan_structures_obtained = erhaltene MSpan-Structures +dashboard.mcache_structures_usage = MCache-Structures-Auslastung +dashboard.mcache_structures_obtained = erhaltene MCache-Structures dashboard.profiling_bucket_hash_table_obtained = Profiling Bucket Hash Table Obtained -dashboard.gc_metadata_obtained = GC Metadada Obtained -dashboard.other_system_allocation_obtained = Other System Allocation Obtained -dashboard.next_gc_recycle = Next GC Recycle -dashboard.last_gc_time = Since Last GC Time -dashboard.total_gc_time = Total GC Pause -dashboard.total_gc_pause = Total GC Pause -dashboard.last_gc_pause = Last GC Pause -dashboard.gc_times = GC Takt - -users.user_manage_panel = User Manage Panel +dashboard.gc_metadata_obtained = erhaltene GC-Metadata +dashboard.other_system_allocation_obtained = andere erhaltene Sustem-Allokatoren +dashboard.next_gc_recycle = nächster GC-Zyklus +dashboard.last_gc_time = seit leztem GC-Zyklus +dashboard.total_gc_time = gesammte GC-Zeit +dashboard.total_gc_pause = gesammte GC-Pause +dashboard.last_gc_pause = letzte GC-Pause +dashboard.gc_times = GC-Takt + +users.user_manage_panel = Benutzerverwaltung users.new_account = Neues Konto erstellen users.name = Name users.activated = Aktiviert @@ -359,31 +359,31 @@ users.admin = Admin users.repos = Repos users.created = Erzeugt users.edit = Bearbeiten -users.auth_source = Auth Source +users.auth_source = Auth-Quelle users.local = Lokal -users.auth_login_name = Auth Login Name +users.auth_login_name = Auth-Login-Name users.update_profile_success = Kontoprofil wurde erfolgreich aktualisiert. users.edit_account = Konto bearbeiten users.is_activated = Dieses Konto ist aktiviert users.is_admin = Dieses Konto hat Administratorrechte -users.update_profile = Kontopprofil aktualisieren +users.update_profile = Kontoprofil aktualisieren users.delete_account = Dieses Konto löschen -users.still_own_repo = Dieses Konto ist noch Eigentümer von Repositories, Sie müssen zuerst diese löschen oder übertragen. +users.still_own_repo = Dieses Konto besitzt noch Repositorys. Diese müssen zuerst gelöscht oder übertragen werden. -orgs.org_manage_panel = Organization Manage Panel +orgs.org_manage_panel = Organisationenverwaltung orgs.name = Name orgs.teams = Teams orgs.members = Mitglieder -repos.repo_manage_panel = Repository Manage Panel -repos.owner = Eigentümer +repos.repo_manage_panel = Repositoryverwaltung +repos.owner = Besitzer repos.name = Name repos.private = Privat repos.watches = Watches repos.stars = Stars -repos.issues = Themen +repos.issues = Issues -auths.auth_manage_panel = Authorization Manage Panel +auths.auth_manage_panel = Authentifizierungsverwaltung auths.new = Neu Authentifizierungsquelle hinzufügen auths.name = Name auths.type = Typ @@ -408,20 +408,20 @@ auths.edit = Authentifizierungseinstellungen bearbeiten auths.activated = Diese Authentifizierung ist aktiviert auths.update_success = Authentifizierungseinstellungen wurde erfolgreich aktualisiert. auths.update = Authentifizierungseinstellungen aktualisieren -auths.delete = Diese Authentifizierung löschen +auths.delete = Authentifizierung löschen config.server_config = Server-Konfiguration config.app_name = Anwendungsname config.app_ver = Anwendungsversion -config.app_url = Anwendungs URL +config.app_url = Anwendungs-URL config.domain = Domain -config.offline_mode = Offline Mode -config.disable_router_log = Router Log deaktivieren -config.run_user = Run User -config.run_mode = Run Mode -config.repo_root_path = Repositorie Wurzelverzeichnis -config.static_file_root_path = Wurzelverzeichnis für statische Dateien -config.log_file_root_path = Wurzelverzeichnis für Log Dateien +config.offline_mode = Offline-Modus +config.disable_router_log = Router-Log deaktivieren +config.run_user = Laufzeit-Benutzer +config.run_mode = Laufzeit-Modus +config.repo_root_path = Repository-Verzeichnis +config.static_file_root_path = Verzeichnis für statische Dateien +config.log_file_root_path = Log-Verzeichnis config.script_type = Skript-Typ config.reverse_auth_user = Reverse Authentication User config.db_config = Datenbankkonfiguration @@ -429,7 +429,7 @@ config.db_type = Typ config.db_host = Host config.db_name = Name config.db_user = Benutzer -config.db_ssl_mode = SSL Modus +config.db_ssl_mode = SSL-Modus config.db_ssl_mode_helper = (nur für "postgres") config.db_path = Verzeichnis config.db_path_helper = (nur für "sqlite3") @@ -438,13 +438,13 @@ config.register_email_confirm = E-Mail Bestätigung bei Registrierung config.disable_register = Registrierung deaktivieren config.require_sign_in_view = Require Sign In View config.mail_notify = E-Mail Benachrichtigung -config.enable_cache_avatar = Avatar Cache avtivieren +config.enable_cache_avatar = Avatar-Cache aktivieren config.active_code_lives = Active Code Lives config.reset_password_code_lives = Reset Password Code Lives config.webhook_config = Webhook Einstellungen -config.task_interval = Task Intervall +config.task_interval = Task-Intervall config.deliver_timeout = Zeitlimit für Zustellung -config.mailer_config = Mailer Einstellungen +config.mailer_config = Mailer-Einstellungen config.mailer_enabled = Aktiviert config.mailer_name = Name config.mailer_host = Host @@ -460,23 +460,23 @@ config.session_provider = Session Provider config.provider_config = Provider Einstellungen config.cookie_name = Cookie Name config.enable_set_cookie = Enable Set Cookie -config.gc_interval_time = GC Interval Time +config.gc_interval_time = GC-Intervallzeit config.session_life_time = Session Lebensdauer config.https_only = nur HTTPS config.cookie_life_time = Cookie Lebensdauer -config.session_hash_function = Session ID Hash Function -config.session_hash_key = Session ID Hash Key -config.picture_config = Bildereinstellungen -config.picture_service = Bilderservice +config.session_hash_function = Session-ID Hashfunktion +config.session_hash_key = Session-ID Hashschlüssel +config.picture_config = Bildeinstellungen +config.picture_service = Bildservice config.disable_gravatar = Gravatar deaktivieren config.log_config = Log Einstellungen config.log_mode = Log Modus -monitor.cron = Cron Tasks +monitor.cron = Cron-Tasks monitor.name = Name monitor.schedule = Zeitplan -monitor.next = Next Time -monitor.previous = Previous Time +monitor.next = nächste Ausführung +monitor.previous = letzte Ausführung monitor.execute_times = Execute Times monitor.process = Laufende Prozesse monitor.desc = Beschreibung @@ -484,7 +484,7 @@ monitor.start = Startzeit monitor.execute_time = Ausführungszeit [action] -create_repo = Repositorie erstellen %s +create_repo = Repository erstellen %s commit_repo = pushed to %s at %s create_issue = opened issue %s#%s comment_issue = commented on issue %s#%s -- cgit v1.2.3 From df3621e0507da42eaad010134526ea0413b6c081 Mon Sep 17 00:00:00 2001 From: fanningert Date: Sun, 31 Aug 2014 17:30:53 +0200 Subject: Update locale_de-DE.ini and correct a wrong translation --- conf/locale/locale_de-DE.ini | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) (limited to 'conf') diff --git a/conf/locale/locale_de-DE.ini b/conf/locale/locale_de-DE.ini index 07fe5f9162..495a08d4fb 100644 --- a/conf/locale/locale_de-DE.ini +++ b/conf/locale/locale_de-DE.ini @@ -42,8 +42,8 @@ cancel = Abbrechen uname_holder = Benutzername oder E-Mail password_holder = Passwort switch_dashboard_context = Switch Dashboard Context -my_repos = Meine Repositorys -collaborative_repos = Gemeinschaftliche Repositorys +my_repos = Meine Repositories +collaborative_repos = Gemeinschaftliche Repositories my_orgs = Meine Organisationen my_mirrors = Meine Spiegel @@ -113,8 +113,8 @@ last_org_owner = Der zu entfernende Benutzer ist der letzte Teambesitzer. Es mus invalid_ssh_key = Leider sind wir nicht in der Lage, Ihren SSH-Schlüssel zu überprüfen: %s auth_failed = Authentifizierung fehlgeschlagen: %v -still_own_repo = Dein Konto besitzt noch Repositorys. Diese müssen zuerst gelöscht oder übertragen werden. -org_still_own_repo = Diese Organisation besitzt noch Repositorys. Diese müssen zuerst gelöscht oder übertragen werden. +still_own_repo = Dein Konto besitzt noch Repositories. Diese müssen zuerst gelöscht oder übertragen werden. +org_still_own_repo = Diese Organisation besitzt noch Repositories. Diese müssen zuerst gelöscht oder übertragen werden. still_own_user = Diese Authentifizierung wird noch von einigen Benutzern genutzt. Entferne diese zuvor und lösche erneut. @@ -245,7 +245,7 @@ people = Personen invite_someone = Jemanden einladen teams = Teams lower_members = Mitglieder -lower_repositories = Repositorys +lower_repositories = Repositories create_new_team = Neues Team erstellen org_desc = Beschreibung team_name = Teamname @@ -281,23 +281,23 @@ members.invite_now = Jetzt einladen teams.join = Beitreten teams.leave = Verlassen teams.read_access = Lesezugriff -teams.read_access_helper = Dieses Team wird Repositorys einsehen und klonen können. +teams.read_access_helper = Dieses Team wird Repositories einsehen und klonen können. teams.write_access = Schreibzugriff -teams.write_access_helper = Dieses Team wird die Repositorys einsehen und in sie hinein pushen können. +teams.write_access_helper = Dieses Team wird die Repositories einsehen und in sie hinein pushen können. teams.admin_access = Adminzugriff -teams.admin_access_helper = Dieses Team wird pull- und push-Rechte für die Repositorys haben und Mitarbeiter einladen können. +teams.admin_access_helper = Dieses Team wird pull- und push-Rechte für die Repositories haben und Mitarbeiter einladen können. teams.no_desc = Dieses Team hat keine Beschreibung teams.settings = Einstellungen -teams.owners_permission_desc = Besitzer haben vollen Zugriff auf alle Repositorys und Admin Rechte für diese Organisation. +teams.owners_permission_desc = Besitzer haben vollen Zugriff auf alle Repositories und Admin Rechte für diese Organisation. teams.members = Teammitglieder teams.update_settings = Einstellungen aktualisieren teams.delete_team = Dieses Team löschen teams.add_team_member = Teammitglied hinzufügen teams.delete_team_success = Team gelöscht -teams.read_permission_desc = Dieses Team erlaubt LesezugriffSchreibzugriff: Mitglieder können Team-Repositorys einsehen und hinein pushen. +teams.read_permission_desc = Dieses Team erlaubt Lesezugriff: Mitglieder können Team-Repositories einsehen und klonen. +teams.write_permission_desc = Dieses Team erlaubt Schreibzugriff: Mitglieder können Team-Repositories einsehen und hinein pushen. teams.admin_permission_desc = Diese Team erlaubt Adminzugriff: Mitglieder dieses Teams können pullen, pushen und dem Team Mitarbeiter hinzufügen. -teams.repositories = Team Repositorys +teams.repositories = Team Repositories teams.add_team_repository = Team-Repository hinzufügen teams.remove_repo = Entfernen @@ -305,7 +305,7 @@ teams.remove_repo = Entfernen dashboard = Dashboard users = Benutzer organizations = Organisationen -repositories = Repositorys +repositories = Repositories authentication = Authentifizierung config = Konfiguration monitor = Monitoring @@ -315,7 +315,7 @@ next = vor dashboard.statistic = Statistik dashboard.operations = Operationen dashboard.system_status = System-Monitor-Status -dashboard.statistic_info = GoGS Datenbank hat %d Benutzer, %d Organizationen, %d öffentliche Schlüssel, %d Repositorys, %d watches, %d stars, %d actions, %d Zugriffe, %d issues, %d Kommentare, %d soziale Konten, %d follows, %d Spiegel, %d Releases, %d Login-Quellen, %d Webhooks, %d Milestones, %d Labels, %d Hook-Tasks, %d Teams, %d Aktualisierungs-Tasks, %d Anhänge. +dashboard.statistic_info = GoGS Datenbank hat %d Benutzer, %d Organizationen, %d öffentliche Schlüssel, %d Repositories, %d watches, %d stars, %d actions, %d Zugriffe, %d issues, %d Kommentare, %d soziale Konten, %d follows, %d Spiegel, %d Releases, %d Login-Quellen, %d Webhooks, %d Milestones, %d Labels, %d Hook-Tasks, %d Teams, %d Aktualisierungs-Tasks, %d Anhänge. dashboard.operation_name = Operation Name dashboard.operation_switch = Switch dashboard.operation_run = Ausführen @@ -368,7 +368,7 @@ users.is_activated = Dieses Konto ist aktiviert users.is_admin = Dieses Konto hat Administratorrechte users.update_profile = Kontoprofil aktualisieren users.delete_account = Dieses Konto löschen -users.still_own_repo = Dieses Konto besitzt noch Repositorys. Diese müssen zuerst gelöscht oder übertragen werden. +users.still_own_repo = Dieses Konto besitzt noch Repositories. Diese müssen zuerst gelöscht oder übertragen werden. orgs.org_manage_panel = Organisationenverwaltung orgs.name = Name -- cgit v1.2.3 From 9554ad514e514b08f72c2b4b215ee68717ece38c Mon Sep 17 00:00:00 2001 From: fanningert Date: Sun, 31 Aug 2014 17:59:22 +0200 Subject: Change "Repositories" to "Repositorys" --- conf/locale/locale_de-DE.ini | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) (limited to 'conf') diff --git a/conf/locale/locale_de-DE.ini b/conf/locale/locale_de-DE.ini index 495a08d4fb..80b2245cd3 100644 --- a/conf/locale/locale_de-DE.ini +++ b/conf/locale/locale_de-DE.ini @@ -42,8 +42,8 @@ cancel = Abbrechen uname_holder = Benutzername oder E-Mail password_holder = Passwort switch_dashboard_context = Switch Dashboard Context -my_repos = Meine Repositories -collaborative_repos = Gemeinschaftliche Repositories +my_repos = Meine Repositorys +collaborative_repos = Gemeinschaftliche Repositorys my_orgs = Meine Organisationen my_mirrors = Meine Spiegel @@ -113,8 +113,8 @@ last_org_owner = Der zu entfernende Benutzer ist der letzte Teambesitzer. Es mus invalid_ssh_key = Leider sind wir nicht in der Lage, Ihren SSH-Schlüssel zu überprüfen: %s auth_failed = Authentifizierung fehlgeschlagen: %v -still_own_repo = Dein Konto besitzt noch Repositories. Diese müssen zuerst gelöscht oder übertragen werden. -org_still_own_repo = Diese Organisation besitzt noch Repositories. Diese müssen zuerst gelöscht oder übertragen werden. +still_own_repo = Dein Konto besitzt noch Repositorys. Diese müssen zuerst gelöscht oder übertragen werden. +org_still_own_repo = Diese Organisation besitzt noch Repositorys. Diese müssen zuerst gelöscht oder übertragen werden. still_own_user = Diese Authentifizierung wird noch von einigen Benutzern genutzt. Entferne diese zuvor und lösche erneut. @@ -245,7 +245,7 @@ people = Personen invite_someone = Jemanden einladen teams = Teams lower_members = Mitglieder -lower_repositories = Repositories +lower_Repositorys = Repositorys create_new_team = Neues Team erstellen org_desc = Beschreibung team_name = Teamname @@ -281,23 +281,23 @@ members.invite_now = Jetzt einladen teams.join = Beitreten teams.leave = Verlassen teams.read_access = Lesezugriff -teams.read_access_helper = Dieses Team wird Repositories einsehen und klonen können. +teams.read_access_helper = Dieses Team wird Repositorys einsehen und klonen können. teams.write_access = Schreibzugriff -teams.write_access_helper = Dieses Team wird die Repositories einsehen und in sie hinein pushen können. +teams.write_access_helper = Dieses Team wird die Repositorys einsehen und in sie hinein pushen können. teams.admin_access = Adminzugriff -teams.admin_access_helper = Dieses Team wird pull- und push-Rechte für die Repositories haben und Mitarbeiter einladen können. +teams.admin_access_helper = Dieses Team wird pull- und push-Rechte für die Repositorys haben und Mitarbeiter einladen können. teams.no_desc = Dieses Team hat keine Beschreibung teams.settings = Einstellungen -teams.owners_permission_desc = Besitzer haben vollen Zugriff auf alle Repositories und Admin Rechte für diese Organisation. +teams.owners_permission_desc = Besitzer haben vollen Zugriff auf alle Repositorys und Admin Rechte für diese Organisation. teams.members = Teammitglieder teams.update_settings = Einstellungen aktualisieren teams.delete_team = Dieses Team löschen teams.add_team_member = Teammitglied hinzufügen teams.delete_team_success = Team gelöscht -teams.read_permission_desc = Dieses Team erlaubt Lesezugriff: Mitglieder können Team-Repositories einsehen und klonen. -teams.write_permission_desc = Dieses Team erlaubt Schreibzugriff: Mitglieder können Team-Repositories einsehen und hinein pushen. +teams.read_permission_desc = Dieses Team erlaubt Lesezugriff: Mitglieder können Team-Repositorys einsehen und klonen. +teams.write_permission_desc = Dieses Team erlaubt Schreibzugriff: Mitglieder können Team-Repositorys einsehen und hinein pushen. teams.admin_permission_desc = Diese Team erlaubt Adminzugriff: Mitglieder dieses Teams können pullen, pushen und dem Team Mitarbeiter hinzufügen. -teams.repositories = Team Repositories +teams.Repositorys = Team Repositorys teams.add_team_repository = Team-Repository hinzufügen teams.remove_repo = Entfernen @@ -305,7 +305,7 @@ teams.remove_repo = Entfernen dashboard = Dashboard users = Benutzer organizations = Organisationen -repositories = Repositories +Repositorys = Repositorys authentication = Authentifizierung config = Konfiguration monitor = Monitoring @@ -315,7 +315,7 @@ next = vor dashboard.statistic = Statistik dashboard.operations = Operationen dashboard.system_status = System-Monitor-Status -dashboard.statistic_info = GoGS Datenbank hat %d Benutzer, %d Organizationen, %d öffentliche Schlüssel, %d Repositories, %d watches, %d stars, %d actions, %d Zugriffe, %d issues, %d Kommentare, %d soziale Konten, %d follows, %d Spiegel, %d Releases, %d Login-Quellen, %d Webhooks, %d Milestones, %d Labels, %d Hook-Tasks, %d Teams, %d Aktualisierungs-Tasks, %d Anhänge. +dashboard.statistic_info = GoGS Datenbank hat %d Benutzer, %d Organizationen, %d öffentliche Schlüssel, %d Repositorys, %d watches, %d stars, %d actions, %d Zugriffe, %d issues, %d Kommentare, %d soziale Konten, %d follows, %d Spiegel, %d Releases, %d Login-Quellen, %d Webhooks, %d Milestones, %d Labels, %d Hook-Tasks, %d Teams, %d Aktualisierungs-Tasks, %d Anhänge. dashboard.operation_name = Operation Name dashboard.operation_switch = Switch dashboard.operation_run = Ausführen @@ -368,7 +368,7 @@ users.is_activated = Dieses Konto ist aktiviert users.is_admin = Dieses Konto hat Administratorrechte users.update_profile = Kontoprofil aktualisieren users.delete_account = Dieses Konto löschen -users.still_own_repo = Dieses Konto besitzt noch Repositories. Diese müssen zuerst gelöscht oder übertragen werden. +users.still_own_repo = Dieses Konto besitzt noch Repositorys. Diese müssen zuerst gelöscht oder übertragen werden. orgs.org_manage_panel = Organisationenverwaltung orgs.name = Name -- cgit v1.2.3 From 2bce24068dc3c64ee5e501c48b7f080c48383970 Mon Sep 17 00:00:00 2001 From: Christopher Brickley Date: Sun, 24 Aug 2014 08:59:47 -0400 Subject: add Slack API webhook support --- cmd/web.go | 6 +- conf/locale/locale_en-US.ini | 5 ++ models/action.go | 35 ++++++-- models/slack.go | 114 ++++++++++++++++++++++++++ models/webhook.go | 86 +++++++++++++++----- modules/auth/repo_form.go | 24 ++++-- public/ng/css/gogs.css | 26 ++++-- public/ng/js/gogs.js | 18 ++++- public/ng/less/gogs/settings.less | 16 +++- routers/repo/setting.go | 126 ++++++++++++++++++++++++++++- templates/repo/settings/gogs_hook.tmpl | 23 ++++++ templates/repo/settings/hook_new.tmpl | 39 +-------- templates/repo/settings/hook_settings.tmpl | 15 ++++ templates/repo/settings/hook_types.tmpl | 11 +++ templates/repo/settings/slack_hook.tmpl | 20 +++++ 15 files changed, 485 insertions(+), 79 deletions(-) create mode 100644 models/slack.go create mode 100644 templates/repo/settings/gogs_hook.tmpl create mode 100644 templates/repo/settings/hook_settings.tmpl create mode 100644 templates/repo/settings/hook_types.tmpl create mode 100644 templates/repo/settings/slack_hook.tmpl (limited to 'conf') diff --git a/cmd/web.go b/cmd/web.go index e0ef3a76a3..275d3fb90e 100644 --- a/cmd/web.go +++ b/cmd/web.go @@ -284,9 +284,11 @@ func runWeb(*cli.Context) { r.Route("/collaboration", "GET,POST", repo.SettingsCollaboration) r.Get("/hooks", repo.Webhooks) r.Get("/hooks/new", repo.WebHooksNew) - r.Post("/hooks/new", bindIgnErr(auth.NewWebhookForm{}), repo.WebHooksNewPost) + r.Post("/hooks/gogs/new", bindIgnErr(auth.NewWebhookForm{}), repo.WebHooksNewPost) + r.Post("/hooks/slack/new", bindIgnErr(auth.NewSlackHookForm{}), repo.SlackHooksNewPost) r.Get("/hooks/:id", repo.WebHooksEdit) - r.Post("/hooks/:id", bindIgnErr(auth.NewWebhookForm{}), repo.WebHooksEditPost) + r.Post("/hooks/gogs/:id", bindIgnErr(auth.NewWebhookForm{}), repo.WebHooksEditPost) + r.Post("/hooks/slack/:id", bindIgnErr(auth.NewSlackHookForm{}), repo.SlackHooksEditPost) }) }, reqSignIn, middleware.RepoAssignment(true), reqTrueOwner) diff --git a/conf/locale/locale_en-US.ini b/conf/locale/locale_en-US.ini index a99eb92e7e..946d560461 100644 --- a/conf/locale/locale_en-US.ini +++ b/conf/locale/locale_en-US.ini @@ -234,6 +234,11 @@ settings.update_webhook = Update Webhook settings.update_hook_success = Webhook has been updated. settings.delete_webhook = Delete Webhook settings.recent_deliveries = Recent Deliveries +settings.hook_type = Hook Type +settings.add_slack_hook_desc = Add Slack integration to your repository. +settings.slack_token = Token +settings.slack_domain = Domain +settings.slack_channel = Channel [org] org_name_holder = Organization Name diff --git a/models/action.go b/models/action.go index b5f692c49f..d536c84dd0 100644 --- a/models/action.go +++ b/models/action.go @@ -266,14 +266,33 @@ func CommitRepoAction(userId, repoUserId int64, userName, actEmail string, continue } - p.Secret = w.Secret - CreateHookTask(&HookTask{ - Type: WEBHOOK, - Url: w.Url, - Payload: p, - ContentType: w.ContentType, - IsSsl: w.IsSsl, - }) + switch w.HookTaskType { + case SLACK: + { + s, err := GetSlackPayload(p, w.Meta) + if err != nil { + return errors.New("action.GetSlackPayload: " + err.Error()) + } + CreateHookTask(&HookTask{ + Type: w.HookTaskType, + Url: w.Url, + BasePayload: s, + ContentType: w.ContentType, + IsSsl: w.IsSsl, + }) + } + default: + { + p.Secret = w.Secret + CreateHookTask(&HookTask{ + Type: w.HookTaskType, + Url: w.Url, + BasePayload: p, + ContentType: w.ContentType, + IsSsl: w.IsSsl, + }) + } + } } return nil } diff --git a/models/slack.go b/models/slack.go new file mode 100644 index 0000000000..0a55740947 --- /dev/null +++ b/models/slack.go @@ -0,0 +1,114 @@ +// Copyright 2014 The Gogs Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package models + +import ( + "encoding/json" + "errors" + "fmt" + "strings" +) + +const ( + SLACK_COLOR string = "#dd4b39" +) + +type Slack struct { + Domain string `json:"domain"` + Token string `json:"token"` + Channel string `json:"channel"` +} + +type SlackPayload struct { + Channel string `json:"channel"` + Text string `json:"text"` + Username string `json:"username"` + IconUrl string `json:"icon_url"` + UnfurlLinks int `json:"unfurl_links"` + LinkNames int `json:"link_names"` + Attachments []SlackAttachment `json:"attachments"` +} + +type SlackAttachment struct { + Color string `json:"color"` + Text string `json:"text"` +} + +func GetSlackURL(domain string, token string) string { + return fmt.Sprintf( + "https://%s.slack.com/services/hooks/incoming-webhook?token=%s", + domain, + token, + ) +} + +func (p SlackPayload) GetJSONPayload() ([]byte, error) { + data, err := json.Marshal(p) + if err != nil { + return []byte{}, err + } + return data, nil +} + +func GetSlackPayload(p *Payload, meta string) (*SlackPayload, error) { + slack := &Slack{} + slackPayload := &SlackPayload{} + if err := json.Unmarshal([]byte(meta), &slack); err != nil { + return slackPayload, errors.New("GetSlackPayload meta json:" + err.Error()) + } + + // TODO: handle different payload types: push, new branch, delete branch etc. + // when they are added to gogs. Only handles push now + return getSlackPushPayload(p, slack) +} + +func getSlackPushPayload(p *Payload, slack *Slack) (*SlackPayload, error) { + // n new commits + refSplit := strings.Split(p.Ref, "/") + branchName := refSplit[len(refSplit)-1] + var commitString string + + // TODO: add commit compare before/after link when gogs adds it + if len(p.Commits) == 1 { + commitString = "1 new commit" + } else { + commitString = fmt.Sprintf("%d new commits", len(p.Commits)) + } + + text := fmt.Sprintf("[%s:%s] %s pushed by %s", p.Repo.Name, branchName, commitString, p.Pusher.Name) + var attachmentText string + + // for each commit, generate attachment text + for i, commit := range p.Commits { + attachmentText += fmt.Sprintf("<%s|%s>: %s - %s", commit.Url, commit.Id[:7], SlackFormatter(commit.Message), commit.Author.Name) + // add linebreak to each commit but the last + if i < len(p.Commits)-1 { + attachmentText += "\n" + } + } + + slackAttachments := []SlackAttachment{{Color: SLACK_COLOR, Text: attachmentText}} + + return &SlackPayload{ + Channel: slack.Channel, + Text: text, + Username: "gogs", + IconUrl: "https://raw.githubusercontent.com/gogits/gogs/master/public/img/favicon.png", + UnfurlLinks: 0, + LinkNames: 0, + Attachments: slackAttachments, + }, nil +} + +// see: https://api.slack.com/docs/formatting +func SlackFormatter(s string) string { + // take only first line of commit + first := strings.Split(s, "\n")[0] + // replace & < > + first = strings.Replace(first, "&", "&", -1) + first = strings.Replace(first, "<", "<", -1) + first = strings.Replace(first, ">", ">", -1) + return first +} diff --git a/models/webhook.go b/models/webhook.go index ced7936646..55ed4844ed 100644 --- a/models/webhook.go +++ b/models/webhook.go @@ -7,6 +7,7 @@ package models import ( "encoding/json" "errors" + "io/ioutil" "time" "github.com/gogits/gogs/modules/httplib" @@ -33,15 +34,17 @@ type HookEvent struct { // Webhook represents a web hook object. type Webhook struct { - Id int64 - RepoId int64 - Url string `xorm:"TEXT"` - ContentType HookContentType - Secret string `xorm:"TEXT"` - Events string `xorm:"TEXT"` - *HookEvent `xorm:"-"` - IsSsl bool - IsActive bool + Id int64 + RepoId int64 + Url string `xorm:"TEXT"` + ContentType HookContentType + Secret string `xorm:"TEXT"` + Events string `xorm:"TEXT"` + *HookEvent `xorm:"-"` + IsSsl bool + IsActive bool + HookTaskType HookTaskType + Meta string `xorm:"TEXT"` // store hook-specific attributes } // GetEvent handles conversion from Events to HookEvent. @@ -52,6 +55,14 @@ func (w *Webhook) GetEvent() { } } +func (w *Webhook) GetSlackHook() *Slack { + s := &Slack{} + if err := json.Unmarshal([]byte(w.Meta), s); err != nil { + log.Error(4, "webhook.GetSlackHook(%d): %v", w.Id, err) + } + return s +} + // UpdateEvent handles conversion from HookEvent to Events. func (w *Webhook) UpdateEvent() error { data, err := json.Marshal(w.HookEvent) @@ -119,8 +130,8 @@ func DeleteWebhook(hookId int64) error { type HookTaskType int const ( - WEBHOOK HookTaskType = iota + 1 - SERVICE + GOGS HookTaskType = iota + 1 + SLACK ) type HookEventType string @@ -152,6 +163,10 @@ type PayloadRepo struct { Private bool `json:"private"` } +type BasePayload interface { + GetJSONPayload() ([]byte, error) +} + // Payload represents a payload information of hook. type Payload struct { Secret string `json:"secret"` @@ -161,25 +176,33 @@ type Payload struct { Pusher *PayloadAuthor `json:"pusher"` } +func (p Payload) GetJSONPayload() ([]byte, error) { + data, err := json.Marshal(p) + if err != nil { + return []byte{}, err + } + return data, nil +} + // HookTask represents a hook task. type HookTask struct { Id int64 Uuid string Type HookTaskType Url string - *Payload `xorm:"-"` + BasePayload `xorm:"-"` PayloadContent string `xorm:"TEXT"` ContentType HookContentType EventType HookEventType IsSsl bool - IsDeliveried bool + IsDelivered bool IsSucceed bool } // CreateHookTask creates a new hook task, // it handles conversion from Payload to PayloadContent. func CreateHookTask(t *HookTask) error { - data, err := json.Marshal(t.Payload) + data, err := t.BasePayload.GetJSONPayload() if err != nil { return err } @@ -198,7 +221,7 @@ func UpdateHookTask(t *HookTask) error { // DeliverHooks checks and delivers undelivered hooks. func DeliverHooks() { timeout := time.Duration(setting.WebhookDeliverTimeout) * time.Second - x.Where("is_deliveried=?", false).Iterate(new(HookTask), + x.Where("is_delivered=?", false).Iterate(new(HookTask), func(idx int, bean interface{}) error { t := bean.(*HookTask) req := httplib.Post(t.Url).SetTimeout(timeout, timeout). @@ -212,13 +235,36 @@ func DeliverHooks() { req.Param("payload", t.PayloadContent) } - t.IsDeliveried = true + t.IsDelivered = true // TODO: record response. - if _, err := req.Response(); err != nil { - log.Error(4, "Delivery: %v", err) - } else { - t.IsSucceed = true + switch t.Type { + case GOGS: + { + if _, err := req.Response(); err != nil { + log.Error(4, "Delivery: %v", err) + } else { + t.IsSucceed = true + } + } + case SLACK: + { + if res, err := req.Response(); err != nil { + log.Error(4, "Delivery: %v", err) + } else { + defer res.Body.Close() + contents, err := ioutil.ReadAll(res.Body) + if err != nil { + log.Error(4, "%s", err) + } else { + if string(contents) != "ok" { + log.Error(4, "slack failed with: %s", string(contents)) + } else { + t.IsSucceed = true + } + } + } + } } if err := UpdateHookTask(t); err != nil { diff --git a/modules/auth/repo_form.go b/modules/auth/repo_form.go index 3eb0cbc564..5fd1114052 100644 --- a/modules/auth/repo_form.go +++ b/modules/auth/repo_form.go @@ -69,17 +69,31 @@ func (f *RepoSettingForm) Validate(ctx *macaron.Context, errs *binding.Errors, l // \/ \/ \/ \/ \/ \/ type NewWebhookForm struct { - PayloadUrl string `form:"payload_url" binding:"Required;Url"` - ContentType string `form:"content_type" binding:"Required"` - Secret string `form:"secret"` - PushOnly bool `form:"push_only"` - Active bool `form:"active"` + HookTaskType string `form:"hook_type" binding:"Required"` + PayloadUrl string `form:"payload_url" binding:"Required;Url"` + ContentType string `form:"content_type" binding:"Required"` + Secret string `form:"secret"` + PushOnly bool `form:"push_only"` + Active bool `form:"active"` } func (f *NewWebhookForm) Validate(ctx *macaron.Context, errs *binding.Errors, l i18n.Locale) { validate(errs, ctx.Data, f, l) } +type NewSlackHookForm struct { + HookTaskType string `form:"hook_type" binding:"Required"` + Domain string `form:"domain" binding:"Required` + Token string `form:"token" binding:"Required"` + Channel string `form:"channel" binding:"Required"` + PushOnly bool `form:"push_only"` + Active bool `form:"active"` +} + +func (f *NewSlackHookForm) Validate(ctx *macaron.Context, errs *binding.Errors, l i18n.Locale) { + validate(errs, ctx.Data, f, l) +} + // .___ // | | ______ ________ __ ____ // | |/ ___// ___/ | \_/ __ \ diff --git a/public/ng/css/gogs.css b/public/ng/css/gogs.css index d81d6f3149..0840833755 100644 --- a/public/ng/css/gogs.css +++ b/public/ng/css/gogs.css @@ -1403,14 +1403,16 @@ The register and sign-in page style #auth-setting-form, #org-setting-form, #repo-setting-form, -#user-profile-form { +#user-profile-form, +.repo-setting-form { background-color: #FFF; padding: 30px 0; } #auth-setting-form textarea, #org-setting-form textarea, #repo-setting-form textarea, -#user-profile-form textarea { +#user-profile-form textarea, +.repo-setting-form textarea { margin-left: 4px; height: 100px; } @@ -1418,24 +1420,38 @@ The register and sign-in page style #org-setting-form label, #repo-setting-form label, #user-profile-form label, +.repo-setting-form label, #auth-setting-form .form-label, #org-setting-form .form-label, #repo-setting-form .form-label, -#user-profile-form .form-label { +#user-profile-form .form-label, +.repo-setting-form .form-label { width: 240px; } #auth-setting-form .ipt, #org-setting-form .ipt, #repo-setting-form .ipt, -#user-profile-form .ipt { +#user-profile-form .ipt, +.repo-setting-form .ipt { width: 360px; } #auth-setting-form .field, #org-setting-form .field, #repo-setting-form .field, -#user-profile-form .field { +#user-profile-form .field, +.repo-setting-form .field { margin-bottom: 24px; } +#hook-type { + padding: 10px 0 0 0; + background-color: #fff; +} +#hook-type .field { + margin-bottom: 24px; +} +#hook-type label { + width: 240px; +} #repo-hooks-panel, #repo-hooks-history-panel, #user-social-panel, diff --git a/public/ng/js/gogs.js b/public/ng/js/gogs.js index bade9f3420..c08a887a4c 100644 --- a/public/ng/js/gogs.js +++ b/public/ng/js/gogs.js @@ -359,6 +359,22 @@ function initRepoSetting() { return true; } }); + + // web hook type change + $('select#hook-type').on("change", function () { + hookTypes = ['Gogs','Slack']; + + var curHook = $(this).val(); + hookTypes.forEach(function(hookType) { + if (curHook === hookType) { + $('div#'+hookType.toLowerCase()).toggleShow(); + } + else { + $('div#'+hookType.toLowerCase()).toggleHide(); + } + }); + }); + $('#transfer-button').click(function () { $('#transfer-form').show(); }); @@ -594,4 +610,4 @@ function homepage() { } $('#promo-form').attr('action', '/user/sign_up'); }); -} \ No newline at end of file +} diff --git a/public/ng/less/gogs/settings.less b/public/ng/less/gogs/settings.less index b246a947ec..80c00f2dbe 100644 --- a/public/ng/less/gogs/settings.less +++ b/public/ng/less/gogs/settings.less @@ -34,7 +34,8 @@ #auth-setting-form, #org-setting-form, #repo-setting-form, -#user-profile-form { +#user-profile-form, +.repo-setting-form { background-color: #FFF; padding: 30px 0; textarea { @@ -53,6 +54,17 @@ } } +#hook-type { + padding: 10px 0 0 0; + background-color: #fff; + .field { + margin-bottom: 24px; + } + label { + width: 240px; + } +} + #repo-hooks-panel, #repo-hooks-history-panel, #user-social-panel, @@ -109,4 +121,4 @@ .field { margin-bottom: 24px; } -} \ No newline at end of file +} diff --git a/routers/repo/setting.go b/routers/repo/setting.go index 24c1b13a5e..fba9eed6a2 100644 --- a/routers/repo/setting.go +++ b/routers/repo/setting.go @@ -5,6 +5,7 @@ package repo import ( + "encoding/json" "fmt" "strings" "time" @@ -272,11 +273,17 @@ func Webhooks(ctx *middleware.Context) { ctx.HTML(200, HOOKS) } +func renderHookTypes(ctx *middleware.Context) { + ctx.Data["HookTypes"] = []string{"Gogs", "Slack"} + ctx.Data["HookType"] = "Gogs" +} + func WebHooksNew(ctx *middleware.Context) { ctx.Data["Title"] = ctx.Tr("repo.settings") ctx.Data["PageIsSettingsHooks"] = true ctx.Data["PageIsSettingsHooksNew"] = true ctx.Data["Webhook"] = models.Webhook{HookEvent: &models.HookEvent{}} + renderHookTypes(ctx) ctx.HTML(200, HOOK_NEW) } @@ -304,8 +311,11 @@ func WebHooksNewPost(ctx *middleware.Context, form auth.NewWebhookForm) { HookEvent: &models.HookEvent{ PushOnly: form.PushOnly, }, - IsActive: form.Active, + IsActive: form.Active, + HookTaskType: models.GOGS, + Meta: "", } + if err := w.UpdateEvent(); err != nil { ctx.Handle(500, "UpdateEvent", err) return @@ -338,6 +348,19 @@ func WebHooksEdit(ctx *middleware.Context) { } return } + + // set data per HookTaskType + switch w.HookTaskType { + case models.SLACK: + { + ctx.Data["SlackHook"] = w.GetSlackHook() + ctx.Data["HookType"] = "slack" + } + default: + { + ctx.Data["HookType"] = "gogs" + } + } w.GetEvent() ctx.Data["Webhook"] = w ctx.HTML(200, HOOK_NEW) @@ -394,3 +417,104 @@ func WebHooksEditPost(ctx *middleware.Context, form auth.NewWebhookForm) { ctx.Flash.Success(ctx.Tr("repo.settings.update_hook_success")) ctx.Redirect(fmt.Sprintf("%s/settings/hooks/%d", ctx.Repo.RepoLink, hookId)) } + +func SlackHooksNewPost(ctx *middleware.Context, form auth.NewSlackHookForm) { + ctx.Data["Title"] = ctx.Tr("repo.settings") + ctx.Data["PageIsSettingsHooks"] = true + ctx.Data["PageIsSettingsHooksNew"] = true + ctx.Data["Webhook"] = models.Webhook{HookEvent: &models.HookEvent{}} + + if ctx.HasError() { + ctx.HTML(200, HOOK_NEW) + return + } + + meta, err := json.Marshal(&models.Slack{ + Domain: form.Domain, + Channel: form.Channel, + Token: form.Token, + }) + if err != nil { + ctx.Handle(500, "SlackHooksNewPost: JSON marshal failed: ", err) + return + } + + w := &models.Webhook{ + RepoId: ctx.Repo.Repository.Id, + Url: models.GetSlackURL(form.Domain, form.Token), + ContentType: models.JSON, + Secret: "", + HookEvent: &models.HookEvent{ + PushOnly: form.PushOnly, + }, + IsActive: form.Active, + HookTaskType: models.SLACK, + Meta: string(meta), + } + if err := w.UpdateEvent(); err != nil { + ctx.Handle(500, "UpdateEvent", err) + return + } else if err := models.CreateWebhook(w); err != nil { + ctx.Handle(500, "CreateWebhook", err) + return + } + + ctx.Flash.Success(ctx.Tr("repo.settings.add_hook_success")) + ctx.Redirect(ctx.Repo.RepoLink + "/settings/hooks") +} + +func SlackHooksEditPost(ctx *middleware.Context, form auth.NewSlackHookForm) { + ctx.Data["Title"] = ctx.Tr("repo.settings") + ctx.Data["PageIsSettingsHooks"] = true + ctx.Data["PageIsSettingsHooksEdit"] = true + + hookId := com.StrTo(ctx.Params(":id")).MustInt64() + fmt.Println("hookId slack=%d", hookId) + if hookId == 0 { + ctx.Handle(404, "setting.WebHooksEditPost", nil) + return + } + + w, err := models.GetWebhookById(hookId) + if err != nil { + if err == models.ErrWebhookNotExist { + ctx.Handle(404, "GetWebhookById", nil) + } else { + ctx.Handle(500, "GetWebhookById", err) + } + return + } + w.GetEvent() + ctx.Data["Webhook"] = w + + if ctx.HasError() { + ctx.HTML(200, HOOK_NEW) + return + } + meta, err := json.Marshal(&models.Slack{ + Domain: form.Domain, + Channel: form.Channel, + Token: form.Token, + }) + if err != nil { + ctx.Handle(500, "SlackHooksNewPost: JSON marshal failed: ", err) + return + } + + w.Url = models.GetSlackURL(form.Domain, form.Token) + w.Meta = string(meta) + w.HookEvent = &models.HookEvent{ + PushOnly: form.PushOnly, + } + w.IsActive = form.Active + if err := w.UpdateEvent(); err != nil { + ctx.Handle(500, "UpdateEvent", err) + return + } else if err := models.UpdateWebhook(w); err != nil { + ctx.Handle(500, "SlackHooksEditPost", err) + return + } + + ctx.Flash.Success(ctx.Tr("repo.settings.update_hook_success")) + ctx.Redirect(fmt.Sprintf("%s/settings/hooks/%d", ctx.Repo.RepoLink, hookId)) +} diff --git a/templates/repo/settings/gogs_hook.tmpl b/templates/repo/settings/gogs_hook.tmpl new file mode 100644 index 0000000000..678d640baf --- /dev/null +++ b/templates/repo/settings/gogs_hook.tmpl @@ -0,0 +1,23 @@ +
+
+ {{.CsrfTokenHtml}} + +
{{.i18n.Tr "repo.settings.add_webhook_desc" | Str2html}}
+
+ + +
+
+ + +
+
+ + +
+ {{template "repo/settings/hook_settings" .}} +
+
diff --git a/templates/repo/settings/hook_new.tmpl b/templates/repo/settings/hook_new.tmpl index 2cd0eacb6a..7a450282b1 100644 --- a/templates/repo/settings/hook_new.tmpl +++ b/templates/repo/settings/hook_new.tmpl @@ -13,40 +13,9 @@
{{if .PageIsSettingsHooksNew}}{{.i18n.Tr "repo.settings.add_webhook"}}{{else}}{{.i18n.Tr "repo.settings.update_webhook"}}{{end}}
-
- {{.CsrfTokenHtml}} -
{{.i18n.Tr "repo.settings.add_webhook_desc" | Str2html}}
-
- - -
-
- - -
-
- - -
-
-

{{.i18n.Tr "repo.settings.event_desc"}}

- - {{.i18n.Tr "repo.settings.event_push_only" | Str2html}} -
-
- - - {{.i18n.Tr "repo.settings.active_helper"}} -
-
- - - {{if .PageIsSettingsHooksEdit}}{{.i18n.Tr "repo.settings.delete_webhook"}}{{end}} -
-
+ {{template "repo/settings/hook_types" .}} + {{template "repo/settings/gogs_hook" .}} + {{template "repo/settings/slack_hook" .}} {{if .PageIsSettingsHooksEdit}} @@ -67,4 +36,4 @@ -{{template "ng/base/footer" .}} \ No newline at end of file +{{template "ng/base/footer" .}} diff --git a/templates/repo/settings/hook_settings.tmpl b/templates/repo/settings/hook_settings.tmpl new file mode 100644 index 0000000000..7bf4e2a36c --- /dev/null +++ b/templates/repo/settings/hook_settings.tmpl @@ -0,0 +1,15 @@ +
+

{{.i18n.Tr "repo.settings.event_desc"}}

+ + {{.i18n.Tr "repo.settings.event_push_only" | Str2html}} +
+
+ + +{{.i18n.Tr "repo.settings.active_helper"}} +
+
+ + + {{if .PageIsSettingsHooksEdit}}{{.i18n.Tr "repo.settings.delete_webhook"}}{{end}} +
diff --git a/templates/repo/settings/hook_types.tmpl b/templates/repo/settings/hook_types.tmpl new file mode 100644 index 0000000000..782e2a4e73 --- /dev/null +++ b/templates/repo/settings/hook_types.tmpl @@ -0,0 +1,11 @@ +{{if .PageIsSettingsHooksNew}} +
+ + +
+{{end}} diff --git a/templates/repo/settings/slack_hook.tmpl b/templates/repo/settings/slack_hook.tmpl new file mode 100644 index 0000000000..e68571a081 --- /dev/null +++ b/templates/repo/settings/slack_hook.tmpl @@ -0,0 +1,20 @@ +
+
+ {{.CsrfTokenHtml}} + +
{{.i18n.Tr "repo.settings.add_slack_hook_desc" | Str2html}}
+
+ + +
+
+ + +
+
+ + +
+ {{template "repo/settings/hook_settings" .}} +
+
-- cgit v1.2.3 From 72ec3e8da07be695a94935009077035c520ec142 Mon Sep 17 00:00:00 2001 From: fanningert Date: Sun, 31 Aug 2014 18:03:28 +0200 Subject: Update locale_de-DE.ini --- conf/locale/locale_de-DE.ini | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'conf') diff --git a/conf/locale/locale_de-DE.ini b/conf/locale/locale_de-DE.ini index 80b2245cd3..4a43bdba2c 100644 --- a/conf/locale/locale_de-DE.ini +++ b/conf/locale/locale_de-DE.ini @@ -245,7 +245,7 @@ people = Personen invite_someone = Jemanden einladen teams = Teams lower_members = Mitglieder -lower_Repositorys = Repositorys +lower_Repositoryies = Repositorys create_new_team = Neues Team erstellen org_desc = Beschreibung team_name = Teamname @@ -297,7 +297,7 @@ teams.delete_team_success = Team gelöscht teams.read_permission_desc = Dieses Team erlaubt Lesezugriff: Mitglieder können Team-Repositorys einsehen und klonen. teams.write_permission_desc = Dieses Team erlaubt Schreibzugriff: Mitglieder können Team-Repositorys einsehen und hinein pushen. teams.admin_permission_desc = Diese Team erlaubt Adminzugriff: Mitglieder dieses Teams können pullen, pushen und dem Team Mitarbeiter hinzufügen. -teams.Repositorys = Team Repositorys +teams.Repositories = Team Repositorys teams.add_team_repository = Team-Repository hinzufügen teams.remove_repo = Entfernen @@ -305,7 +305,7 @@ teams.remove_repo = Entfernen dashboard = Dashboard users = Benutzer organizations = Organisationen -Repositorys = Repositorys +Repositories = Repositorys authentication = Authentifizierung config = Konfiguration monitor = Monitoring -- cgit v1.2.3 From 99e009665c732ea524e24580964902cb7f99f736 Mon Sep 17 00:00:00 2001 From: fanningert Date: Sun, 31 Aug 2014 18:04:15 +0200 Subject: Update locale_de-DE.ini --- conf/locale/locale_de-DE.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'conf') diff --git a/conf/locale/locale_de-DE.ini b/conf/locale/locale_de-DE.ini index 4a43bdba2c..a3ce7b3d19 100644 --- a/conf/locale/locale_de-DE.ini +++ b/conf/locale/locale_de-DE.ini @@ -245,7 +245,7 @@ people = Personen invite_someone = Jemanden einladen teams = Teams lower_members = Mitglieder -lower_Repositoryies = Repositorys +lower_Repositories = Repositorys create_new_team = Neues Team erstellen org_desc = Beschreibung team_name = Teamname -- cgit v1.2.3 From 801fc536f2f4edf9b0381ea78833007c99fa30ca Mon Sep 17 00:00:00 2001 From: fanningert Date: Sun, 31 Aug 2014 18:05:26 +0200 Subject: Update locale_de-DE.ini --- conf/locale/locale_de-DE.ini | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'conf') diff --git a/conf/locale/locale_de-DE.ini b/conf/locale/locale_de-DE.ini index a3ce7b3d19..97ca5efd06 100644 --- a/conf/locale/locale_de-DE.ini +++ b/conf/locale/locale_de-DE.ini @@ -245,7 +245,7 @@ people = Personen invite_someone = Jemanden einladen teams = Teams lower_members = Mitglieder -lower_Repositories = Repositorys +lower_repositories = Repositorys create_new_team = Neues Team erstellen org_desc = Beschreibung team_name = Teamname @@ -297,7 +297,7 @@ teams.delete_team_success = Team gelöscht teams.read_permission_desc = Dieses Team erlaubt Lesezugriff: Mitglieder können Team-Repositorys einsehen und klonen. teams.write_permission_desc = Dieses Team erlaubt Schreibzugriff: Mitglieder können Team-Repositorys einsehen und hinein pushen. teams.admin_permission_desc = Diese Team erlaubt Adminzugriff: Mitglieder dieses Teams können pullen, pushen und dem Team Mitarbeiter hinzufügen. -teams.Repositories = Team Repositorys +teams.repositories = Team Repositorys teams.add_team_repository = Team-Repository hinzufügen teams.remove_repo = Entfernen @@ -305,7 +305,7 @@ teams.remove_repo = Entfernen dashboard = Dashboard users = Benutzer organizations = Organisationen -Repositories = Repositorys +repositories = Repositorys authentication = Authentifizierung config = Konfiguration monitor = Monitoring -- cgit v1.2.3 From c5ce33047e77b03b8d6e289d2b250e15c65ae3d2 Mon Sep 17 00:00:00 2001 From: Unknwon Date: Mon, 1 Sep 2014 00:33:40 +0800 Subject: Mirror fix and hide missing pages for 0.5 release --- conf/locale/locale_zh-CN.ini | 5 +++++ templates/repo/header.tmpl | 4 ++-- templates/repo/home.tmpl | 18 +++++++++--------- templates/repo/settings/gogs_hook.tmpl | 23 ----------------------- templates/repo/settings/hook_gogs.tmpl | 23 +++++++++++++++++++++++ templates/repo/settings/hook_new.tmpl | 4 ++-- templates/repo/settings/hook_slack.tmpl | 20 ++++++++++++++++++++ templates/repo/settings/nav.tmpl | 2 +- templates/repo/settings/slack_hook.tmpl | 20 -------------------- templates/repo/sidebar.tmpl | 12 ++++++------ templates/user/dashboard/nav.tmpl | 10 ++++++---- 11 files changed, 74 insertions(+), 67 deletions(-) delete mode 100644 templates/repo/settings/gogs_hook.tmpl create mode 100644 templates/repo/settings/hook_gogs.tmpl create mode 100644 templates/repo/settings/hook_slack.tmpl delete mode 100644 templates/repo/settings/slack_hook.tmpl (limited to 'conf') diff --git a/conf/locale/locale_zh-CN.ini b/conf/locale/locale_zh-CN.ini index 21442539ab..55d22f23ee 100644 --- a/conf/locale/locale_zh-CN.ini +++ b/conf/locale/locale_zh-CN.ini @@ -234,6 +234,11 @@ settings.update_webhook = 更新 Web 钩子 settings.update_hook_success = Web 钩子更新成功! settings.delete_webhook = 删除 Web 钩子 settings.recent_deliveries = 最近推送记录 +settings.hook_type = 钩子类型 +settings.add_slack_hook_desc = 为您的仓库增加 Slack 集成 +settings.slack_token = 令牌 +settings.slack_domain = 域名 +settings.slack_channel = 频道 [org] org_name_holder = 组织名称 diff --git a/templates/repo/header.tmpl b/templates/repo/header.tmpl index 6f3d4c66ca..3812508248 100644 --- a/templates/repo/header.tmpl +++ b/templates/repo/header.tmpl @@ -44,14 +44,14 @@ -
  • + \ No newline at end of file diff --git a/templates/repo/home.tmpl b/templates/repo/home.tmpl index 42b8bdd4b1..0947308477 100644 --- a/templates/repo/home.tmpl +++ b/templates/repo/home.tmpl @@ -9,11 +9,11 @@ {{.Repository.Website}}

    {{if .IsFile}} {{template "repo/view_file" .}} diff --git a/templates/repo/settings/gogs_hook.tmpl b/templates/repo/settings/gogs_hook.tmpl deleted file mode 100644 index 678d640baf..0000000000 --- a/templates/repo/settings/gogs_hook.tmpl +++ /dev/null @@ -1,23 +0,0 @@ -
    -
    - {{.CsrfTokenHtml}} - -
    {{.i18n.Tr "repo.settings.add_webhook_desc" | Str2html}}
    -
    - - -
    -
    - - -
    -
    - - -
    - {{template "repo/settings/hook_settings" .}} -
    -
    diff --git a/templates/repo/settings/hook_gogs.tmpl b/templates/repo/settings/hook_gogs.tmpl new file mode 100644 index 0000000000..35b5899532 --- /dev/null +++ b/templates/repo/settings/hook_gogs.tmpl @@ -0,0 +1,23 @@ +
    +
    + {{.CsrfTokenHtml}} + +
    {{.i18n.Tr "repo.settings.add_webhook_desc" | Str2html}}
    +
    + + +
    +
    + + +
    +
    + + +
    + {{template "repo/settings/hook_settings" .}} +
    +
    diff --git a/templates/repo/settings/hook_new.tmpl b/templates/repo/settings/hook_new.tmpl index 7a450282b1..2bce97a26b 100644 --- a/templates/repo/settings/hook_new.tmpl +++ b/templates/repo/settings/hook_new.tmpl @@ -14,8 +14,8 @@ {{if .PageIsSettingsHooksNew}}{{.i18n.Tr "repo.settings.add_webhook"}}{{else}}{{.i18n.Tr "repo.settings.update_webhook"}}{{end}} {{template "repo/settings/hook_types" .}} - {{template "repo/settings/gogs_hook" .}} - {{template "repo/settings/slack_hook" .}} + {{template "repo/settings/hook_gogs" .}} + {{template "repo/settings/hook_slack" .}} {{if .PageIsSettingsHooksEdit}} diff --git a/templates/repo/settings/hook_slack.tmpl b/templates/repo/settings/hook_slack.tmpl new file mode 100644 index 0000000000..50d28e2f5e --- /dev/null +++ b/templates/repo/settings/hook_slack.tmpl @@ -0,0 +1,20 @@ +
    +
    + {{.CsrfTokenHtml}} + +
    {{.i18n.Tr "repo.settings.add_slack_hook_desc" | Str2html}}
    +
    + + +
    +
    + + +
    +
    + + +
    + {{template "repo/settings/hook_settings" .}} +
    +
    diff --git a/templates/repo/settings/nav.tmpl b/templates/repo/settings/nav.tmpl index 6288ca6cd7..ef0765feac 100644 --- a/templates/repo/settings/nav.tmpl +++ b/templates/repo/settings/nav.tmpl @@ -5,7 +5,7 @@
  • {{.i18n.Tr "repo.settings.options"}}
  • {{.i18n.Tr "repo.settings.collaboration"}}
  • {{.i18n.Tr "repo.settings.hooks"}}
  • -
  • {{.i18n.Tr "repo.settings.deploy_keys"}}
  • + \ No newline at end of file diff --git a/templates/repo/settings/slack_hook.tmpl b/templates/repo/settings/slack_hook.tmpl deleted file mode 100644 index e68571a081..0000000000 --- a/templates/repo/settings/slack_hook.tmpl +++ /dev/null @@ -1,20 +0,0 @@ -
    -
    - {{.CsrfTokenHtml}} - -
    {{.i18n.Tr "repo.settings.add_slack_hook_desc" | Str2html}}
    -
    - - -
    -
    - - -
    -
    - - -
    - {{template "repo/settings/hook_settings" .}} -
    -
    diff --git a/templates/repo/sidebar.tmpl b/templates/repo/sidebar.tmpl index 39d999cabc..f671bfc1b1 100644 --- a/templates/repo/sidebar.tmpl +++ b/templates/repo/sidebar.tmpl @@ -3,23 +3,23 @@
  • Issues{{.Repository.NumOpenIssues}}
  • -
  • +
  • {{if .IsViewBranch}}{{.BranchName}}{{else}}{{ShortSha .BranchName}}{{end}}
  • Commits {{.CommitsCount}}
  • -
  • +
  • Releases {{.Repository.NumTags}}
  • -
  • +
  • settings diff --git a/templates/user/dashboard/nav.tmpl b/templates/user/dashboard/nav.tmpl index 6064f35692..c37447d3a6 100644 --- a/templates/user/dashboard/nav.tmpl +++ b/templates/user/dashboard/nav.tmpl @@ -24,21 +24,23 @@
  • {{end}} -
  • +
  • {{.i18n.Tr "new_org"}}
  • + {{if not .ContextUser.IsOrganization}}
  • {{.i18n.Tr "issues"}}
  • -
  • + {{end}} +
  • {{.i18n.Tr "news_feed"}}
  • -- cgit v1.2.3 From 1858d2066bb0da2514463dc8cc2c825ed2a45ccd Mon Sep 17 00:00:00 2001 From: fanningert Date: Sun, 31 Aug 2014 18:48:24 +0200 Subject: Add new translation keys --- conf/locale/locale_de-DE.ini | 5 +++++ 1 file changed, 5 insertions(+) (limited to 'conf') diff --git a/conf/locale/locale_de-DE.ini b/conf/locale/locale_de-DE.ini index 97ca5efd06..2ac03c2988 100644 --- a/conf/locale/locale_de-DE.ini +++ b/conf/locale/locale_de-DE.ini @@ -234,6 +234,11 @@ settings.update_webhook = Webhook aktualisieren settings.update_hook_success = Webhook wurde aktualisiert. settings.delete_webhook = Webhook löschen settings.recent_deliveries = letzte Zustellungen +settings.hook_type = Hook Type +settings.add_slack_hook_desc = Add Slack integration to your repository. +settings.slack_token = Token +settings.slack_domain = Domain +settings.slack_channel = Channel [org] org_name_holder = Name der Organisation -- cgit v1.2.3 From 7b310b1abb416c936e79d07523d6cd580a223cc6 Mon Sep 17 00:00:00 2001 From: Tristan Storch Date: Sun, 31 Aug 2014 19:25:26 +0200 Subject: German laguage update What has been done: - standardized expressions - shorter and clearer - minor corrections (orthography) --- conf/locale/locale_de-DE.ini | 172 ++++++++++++++++++++----------------------- 1 file changed, 80 insertions(+), 92 deletions(-) (limited to 'conf') diff --git a/conf/locale/locale_de-DE.ini b/conf/locale/locale_de-DE.ini index 2ac03c2988..3e9936d6e4 100644 --- a/conf/locale/locale_de-DE.ini +++ b/conf/locale/locale_de-DE.ini @@ -28,7 +28,7 @@ new_repo = Neues Repository new_migrate = Neue Migration new_org = Neue Organisation manage_org = Organisationen verwalten -admin_panel = Admin Panel +admin_panel = Admin-Panel account_settings = Kontoeinstellungen settings = Einstellungen @@ -50,20 +50,20 @@ my_mirrors = Meine Spiegel [auth] create_new_account = Neues Konto erstellen register_hepler_msg = Du hast schon ein Konto? Jetzt anmelden! -social_register_hepler_msg = Du hast schon ein Konto? Jetzt verknüpfen! +social_register_hepler_msg = Du hast schon ein soziales Konto? Jetzt verknüpfen! disable_register_prompt = Es tut uns leid, die Registrierung wurde deaktiviert. Bitte wende dich an den Administrator. disable_register_mail = Es tut uns leid, die Bestätigung der Registrierungs-E-Mail wurde deaktiviert. remember_me = angemeldet bleiben forgot_password= Passwort vergessen forget_password = Passwort vergessen? sign_up_now = Du willst ein Konto? Jetzt registrieren! -confirmation_mail_sent_prompt = A new confirmation e-mail has been sent to %s, please check your inbox within the next %d hours to complete your registration. +confirmation_mail_sent_prompt = Eine neu Bestätigungs-E-Mail wurde an %s gesendet. Kontrolliere dein Postfach innerhalb der nächsten %d Stunden um die Registrierung abzuschließen. sign_in_email = Melden dich mit deiner E-Mail-Adresse an active_your_account = Aktivieren dein Konto -resent_limit_prompt = Sorry, you are sending an activation e-mail too frequently. Please wait 3 minutes. -has_unconfirmed_mail = Hi %s, you have an unconfirmed email address(%s). If you haven't received a confirmation e-mail or need to resend a new one, please click on the button below. -resend_mail = Klicke hier, um deine Aktivierungs-E-Mail nochmal zu senden -email_not_associate = Diese E-Mail-Adresse ist mit keinen Konto verknüpft. +resent_limit_prompt = Es tut uns leid, du sendest zu häufig Aktivierungs-E-Mails. Bitte warte 3 Minuten. +has_unconfirmed_mail = Hallo %s, du hast eine unbestätigte E-Mail-Adresse (%s). Falls du noch keine Bestätigungs-E-Mail erhalten hast oder eine neue senden musst, klicke auf den unteren Button. +resend_mail = Hier klicken, um deine Aktivierungs-E-Mail erneut zu versenden +email_not_associate = Diese E-Mail-Adresse ist mit keinem Konto verknüpft. send_reset_mail = Hier klicken, um die E-Mail zum Passwort-zurücksetzen erneut zu versenden reset_password = Passwort zurücksetzen invalid_code = Es tut uns leid, der Bestätigungscode ist abgelaufen oder ungültig. @@ -72,13 +72,13 @@ password_too_short = Das Passwort muss mindenstens 6 Zeichen lang sein [form] UserName = Benutzername -RepoName = Repository Name +RepoName = Repository-Name Email = E-Mail-Adresse Password = Passwort Retype = Passwort erneut eingeben SSHTitle = SSH-Schlüsselname HttpsUrl = HTTPS-URL -PayloadUrl = Payload URL +PayloadUrl = Payload-URL TeamName = Teamname AuthName = Authentifizierungsname @@ -94,19 +94,19 @@ captcha_incorrect = Captcha stimmt nicht überein. password_not_match = Die Passwörter stimmen nicht überein. username_been_taken = Benutzername ist bereits vergeben. -repo_name_been_taken = Repository Name ist bereits vergeben. +repo_name_been_taken = Repository-Name ist bereits vergeben. org_name_been_taken = Organisationsname ist bereits vergeben. team_name_been_taken = Teamname ist bereits vergeben. email_been_used = E-Mail-Adresse wird bereits verwendet. ssh_key_been_used = SSH-Schlüsselname wird bereits verwendet. -illegal_username = Ihr Benutzername enthält ungültige Zeichen. +illegal_username = Benutzername enthält ungültige Zeichen. illegal_repo_name = Repository-Name enthält ungültige Zeichen. illegal_org_name = Organisationsname enthält ungültige Zeichen. illegal_team_name = Teamname enthält ungültige Zeichen. username_password_incorrect = Benutzername oder Passwort ist nicht korrekt. -enterred_invalid_repo_name = Bitte stellen Sie sicher, dass der eingegeben Repository-Name richtig ist. -enterred_invalid_owner_name = Bitte stellen Sie sicher, dass der eingegeben Besitzername richtig ist. -enterred_invalid_password = Bitte stellen Sie sicher, dass das eingegebene Passwort richtig ist. +enterred_invalid_repo_name = Bitte stelle sicher, dass der eingegeben Repository-Name richtig ist. +enterred_invalid_owner_name = Bitte stelle sicher, dass der eingegeben Besitzername richtig ist. +enterred_invalid_password = Bitte stelle sicher, dass das eingegebene Passwort richtig ist. user_not_exist = Angegebener Benutzer existiert nicht. last_org_owner = Der zu entfernende Benutzer ist der letzte Teambesitzer. Es muss einen anderen Besitzer geben. @@ -127,40 +127,40 @@ orgs = Organisationen delete = Konto löschen public_profile = Öffentliches Profil -profile_desc = Your Email address is public and will be used for any account related notifications, and any web based operations made via the site. +profile_desc = Deine E-Mail-Adresse wird nicht veröffentlicht und dient dazu, dir Benachrichtigungen bezüglich deines Kontos und deiner Repositorys zu schicken. full_name = Vollständiger Name website = Webseite location = Standort update_profile = Profil aktualisieren -update_profile_success = Dein Profil wurde aktualisiert. +update_profile_success = Profil aktualisiert change_password = Passwort ändern old_password = Aktuelles Passwort new_password = Neues Passwort password_incorrect = Aktuelles Passwort ist nicht korrekt. -change_password_success = Passwort erfolgreich geändert. Du kannst dich jetzt mit dem neuen Passwort anmelden. +change_password_success = Passwort geändert. Du kannst dich jetzt mit dem neuen Passwort anmelden. manage_ssh_keys = SSH-Schlüssel verwalten add_key = SSH-Schlüssel hinzufügen -ssh_desc = Dies ist eine Liste aller SSH-Schlüssel, die mit deinem Konto verküpft sind. Entferne alle Schlüssel, die du nicht kennst. -ssh_helper = Du brauchst Hilfe? Hier ist eine Anleitung zum Erzeugen von SSH-Schlüssel oder Problemlösung einfacher SSH-Probleme. +ssh_desc = Dies ist eine Liste aller SSH-Schlüssel, die mit deinem Konto verknüpft sind. Entferne alle Schlüssel, die du nicht kennst. +ssh_helper = Du brauchst Hilfe? Hier ist eine Anleitung zum Erzeugen von SSH-Schlüsseln oder Problemlösen einfacher SSH-Probleme. add_new_key = SSH-Schlüssel hinzufügen key_name = Schlüsselname key_content = Inhalt -add_key_success = SSH-Schlüssel wurde hinzugefügt! +add_key_success = SSH-Schlüssel hinzugefügt delete_key = SSH-Schlüssel löschen add_on = Hinzugefügt am last_used = Zuletzt verwendet auf no_activity = Keine neuen Aktivitäten -manage_social = Verküpfte soziale Konten verwalten -social_desc = Dies ist eine Liste verküpfter sozialer Konten. Entferne alle Verküpfungen, die du nicht kennst. +manage_social = Verknüpfte soziale Konten verwalten +social_desc = Dies ist eine Liste verknüpfter sozialer Konten. Entferne alle Verknüpfungen, die du nicht kennst. unbind = Verknüpfung entfernen unbind_success = Die Verknüpfung zum sozialen Konto wurde entfernt. delete_account = Konto löschen delete_prompt = Diese Aktion wird dein Konto dauerhaft löschen und kann NICHT rückgängig gemacht werden! -confirm_delete_account = Löschen bestätigen +confirm_delete_account = Löschen [repo] owner = Besitzer @@ -172,13 +172,14 @@ repo_desc = Beschreibung repo_lang = Sprache repo_lang_helper = Wähle eine .gitignore Datei license = Lizenz -license_helper = Wählen Sie eine Lizenz aus +license_helper = Wähle eine Lizenz aus init_readme = Repository mit README.md initialisieren create_repo = Repository erstellen default_branch = Standard-Branch mirror_interval = Spiegel-Intervall (in Stunden) goget_meta = Go-Get Meta goget_meta_helper = This repository will be Go-Getable +goget_meta_helper = Dieses Repository wird man mit go get klonen können. need_auth = Authorisierung benötigt migrate_type = Migrationstyp @@ -194,44 +195,44 @@ star = Markierung fork = Abspaltung quick_guide = Kurzanleitung -clone_this_repo = Dieses Repositorie klonen -create_new_repo_command = Erstellen Sie ein neues Repositorie mittels der Kommandozeile +clone_this_repo = Dieses Repository klonen +create_new_repo_command = Erstelle ein neues Repository mittels der Kommandozeile push_exist_repo = Push an existing repository from the command line settings = Einstellungen settings.options = Optionen settings.collaboration = Zusammenarbeit settings.hooks = Webhooks -settings.deploy_keys = Schlüssel bereitstellen +settings.deploy_keys = Deploy-Keys settings.basic_settings = Grundeinstellungen settings.danger_zone = Gefahrenzone -settings.site = Offizielle Website +settings.site = Offizielle Webseite settings.update_settings = Aktualisierungseinstellungen settings.transfer = Besitz übertragen settings.transfer_desc = Übertrage dieses Repository einem anderen Benutzer oder einer Organisation. settings.delete = Repository löschen settings.delete_desc = Wenn dieses Repository gelöschet ist, gibt es keinen Weg zurück. Sei dir sicher! -settings.update_settings_success = Repository-Optionen wurde erfolgreich aktualisiert. +settings.update_settings_success = Repository-Optionen aktualisiert settings.transfer_owner = Neuer Besitzer settings.make_transfer = übertragen -settings.confirm_delete = Löschen bestätigen -settings.add_collaborator = Neuen Mitarbeiter hinzufügen -settings.add_collaborator_success = Neuer Mitarbeiter wurde hinzugefügt. -settings.remove_collaborator_success = Mitarbeiter wurde entfernt. +settings.confirm_delete = Löschen +settings.add_collaborator = Mitarbeiter hinzufügen +settings.add_collaborator_success = Mitarbeiter hinzugefügt +settings.remove_collaborator_success = Mitarbeiter entfernt settings.add_webhook = Webhook hinzufügen settings.hooks_desc = Webhooks erlauben es externe Dienste zu informieren, wenn etwas bestimmtes in deinem Repository passiert. GoGS sendet dann eine POST-Request an alle angegebenen URLs. Erfahre mehr in unserem Webhooks Guide. -settings.remove_hook_success = Webhook wurde entfernt. +settings.remove_hook_success = Webhook entfernt settings.add_webhook_desc = GoGS sendet einen POST-Request an die unten stehende URL mit Details aller abonierten Ereignisse. Du kannst auch angeben, welches Datenformat du erhalten willst (JSON, x-www-form-urlencoded, etc). Mehr Informationen findest du im Webhooks Guide. -settings.payload_url = Payload URL +settings.payload_url = Payload-URL settings.content_type = Inhaltstyp -settings.secret = Geheimnis +settings.secret = Secret settings.event_desc = Welche Ereignisse sollen diesen Webhook auslösen? settings.event_push_only = Nur das push-Ereignis. settings.active = Aktiv settings.active_helper = Ereignisdetails werden ausgeliefert, wenn dieser Webhook ausgelöst wird. -settings.add_hook_success = Neuer Webhook wurde hinzugefügt. +settings.add_hook_success = Webhook hinzugefügt settings.update_webhook = Webhook aktualisieren -settings.update_hook_success = Webhook wurde aktualisiert. +settings.update_hook_success = Webhook aktualisiert settings.delete_webhook = Webhook löschen settings.recent_deliveries = letzte Zustellungen settings.hook_type = Hook Type @@ -247,7 +248,7 @@ org_email_helper = Das E-Mail-Konto der Organisation empfängt alle Benachrichti create_org = Organisation erstellen repo_updated = Aktualisiert people = Personen -invite_someone = Jemanden einladen +invite_someone = Benutzer einladen teams = Teams lower_members = Mitglieder lower_repositories = Repositorys @@ -255,8 +256,8 @@ create_new_team = Neues Team erstellen org_desc = Beschreibung team_name = Teamname team_desc = Beschreibung -team_name_helper = Sie werden diesen Namen verwenden, um dieses Team in Gesprächen zu erwähnen. -team_desc_helper = Was hat das Team auf sich? +team_name_helper = Verwende diesen Namen, um dich auf dieses Team zu beziehen. +team_desc_helper = Was hat es mit diesem Team auf sich? team_permission_desc = Welche Berechtigungsstufe soll das Team haben? settings = Einstellungen @@ -265,11 +266,11 @@ settings.full_name = Vollständiger Name settings.website = Webseite settings.location = Standort settings.update_settings = Aktualisierungseinstellungen -settings.update_setting_success = Einstellungen der Organisation wurden aktualisiert. +settings.update_setting_success = Organisationseinstellungen aktualisiert settings.delete = Organisation löschen settings.delete_account = Diese Organisation löschen settings.delete_prompt = Die Organisation wird dauerhaft gelöscht. Dies kann NICHT rückgängig gemacht werden! -settings.confirm_delete_account = Löschen bestätigen +settings.confirm_delete_account = Löschen members.public = Öffentlich members.public_helper = Privat machen @@ -302,7 +303,7 @@ teams.delete_team_success = Team gelöscht teams.read_permission_desc = Dieses Team erlaubt Lesezugriff: Mitglieder können Team-Repositorys einsehen und klonen. teams.write_permission_desc = Dieses Team erlaubt Schreibzugriff: Mitglieder können Team-Repositorys einsehen und hinein pushen. teams.admin_permission_desc = Diese Team erlaubt Adminzugriff: Mitglieder dieses Teams können pullen, pushen und dem Team Mitarbeiter hinzufügen. -teams.repositories = Team Repositorys +teams.repositories = Team-Repositorys teams.add_team_repository = Team-Repository hinzufügen teams.remove_repo = Entfernen @@ -324,8 +325,8 @@ dashboard.statistic_info = GoGS Datenbank hat %d Benutzer, %d Orga dashboard.operation_name = Operation Name dashboard.operation_switch = Switch dashboard.operation_run = Ausführen -dashboard.clean_unbind_oauth = ungebundene OAuthes bereinigen -dashboard.delete_inactivate_accounts = inaktiven Konten löschen +dashboard.clean_unbind_oauth = ungebundene OAuths bereinigen +dashboard.delete_inactivate_accounts = inaktive Konten löschen dashboard.server_uptime = Server-Uptime dashboard.current_goroutine = Aktuelle Goroutines dashboard.current_memory_usage = Aktuelle Speichernutzung @@ -337,7 +338,7 @@ dashboard.memory_free_times = Memory Free Times dashboard.current_heap_usage = Aktuelle Heap-Auslastung dashboard.heap_memory_obtained = erhaltener Heap-Memory dashboard.heap_memory_idle = unbenutzter Heap-Memory -dashboard.heap_memory_in_use = benutzer Heap-Memory +dashboard.heap_memory_in_use = benutzter Heap-Memory dashboard.heap_memory_released = freigegebener Heap-Memory dashboard.heap_objects = Heap-Objekte dashboard.bootstrap_stack_usage = Bootstrap-Stack-Auslastung @@ -348,26 +349,26 @@ dashboard.mcache_structures_usage = MCache-Structures-Auslastung dashboard.mcache_structures_obtained = erhaltene MCache-Structures dashboard.profiling_bucket_hash_table_obtained = Profiling Bucket Hash Table Obtained dashboard.gc_metadata_obtained = erhaltene GC-Metadata -dashboard.other_system_allocation_obtained = andere erhaltene Sustem-Allokatoren +dashboard.other_system_allocation_obtained = andere erhaltene System-Allokatoren dashboard.next_gc_recycle = nächster GC-Zyklus -dashboard.last_gc_time = seit leztem GC-Zyklus +dashboard.last_gc_time = seit letztem GC-Zyklus dashboard.total_gc_time = gesammte GC-Zeit dashboard.total_gc_pause = gesammte GC-Pause dashboard.last_gc_pause = letzte GC-Pause dashboard.gc_times = GC-Takt -users.user_manage_panel = Benutzerverwaltung +users.user_manage_panel = Benutzer users.new_account = Neues Konto erstellen users.name = Name users.activated = Aktiviert users.admin = Admin -users.repos = Repos +users.repos = Repositorys users.created = Erzeugt users.edit = Bearbeiten users.auth_source = Auth-Quelle users.local = Lokal users.auth_login_name = Auth-Login-Name -users.update_profile_success = Kontoprofil wurde erfolgreich aktualisiert. +users.update_profile_success = Kontoprofil aktualisiert users.edit_account = Konto bearbeiten users.is_activated = Dieses Konto ist aktiviert users.is_admin = Dieses Konto hat Administratorrechte @@ -380,7 +381,7 @@ orgs.name = Name orgs.teams = Teams orgs.members = Mitglieder -repos.repo_manage_panel = Repositoryverwaltung +repos.repo_manage_panel = Repositorys repos.owner = Besitzer repos.name = Name repos.private = Privat @@ -388,12 +389,12 @@ repos.watches = Watches repos.stars = Stars repos.issues = Issues -auths.auth_manage_panel = Authentifizierungsverwaltung +auths.auth_manage_panel = Authentifizierung auths.new = Neu Authentifizierungsquelle hinzufügen auths.name = Name auths.type = Typ -auths.enabled = Aktiviert -auths.updated = Aktualisiert +auths.enabled = aktiviert +auths.updated = aktualisiert auths.auth_type = Authentifizierungstyp auths.auth_name = Authentifizierungsname auths.domain = Domain @@ -403,15 +404,15 @@ auths.base_dn = Base DN auths.attributes = Suchattribute auths.filter = Suchfilter auths.ms_ad_sa = Ms Ad SA -auths.smtp_auth = SMTP Authentifizierungstyp -auths.smtphost = SMTP Host -auths.smtpport = SMTP Port +auths.smtp_auth = SMTP-Authentifizierungstyp +auths.smtphost = SMTP-Host +auths.smtpport = SMTP-Port auths.enable_tls = TLS-Verschlüsselung aktivieren auths.enable_auto_register = Automatische Registrierung aktivieren auths.tips = Tipps auths.edit = Authentifizierungseinstellungen bearbeiten auths.activated = Diese Authentifizierung ist aktiviert -auths.update_success = Authentifizierungseinstellungen wurde erfolgreich aktualisiert. +auths.update_success = Authentifizierungseinstellungen aktualisiert auths.update = Authentifizierungseinstellungen aktualisieren auths.delete = Authentifizierung löschen @@ -438,15 +439,15 @@ config.db_ssl_mode = SSL-Modus config.db_ssl_mode_helper = (nur für "postgres") config.db_path = Verzeichnis config.db_path_helper = (nur für "sqlite3") -config.service_config = Service Einstellungen -config.register_email_confirm = E-Mail Bestätigung bei Registrierung +config.service_config = Service-Einstellungen +config.register_email_confirm = E-Mail-Bestätigung bei Registrierung config.disable_register = Registrierung deaktivieren config.require_sign_in_view = Require Sign In View -config.mail_notify = E-Mail Benachrichtigung +config.mail_notify = E-Mail-Benachrichtigung config.enable_cache_avatar = Avatar-Cache aktivieren config.active_code_lives = Active Code Lives config.reset_password_code_lives = Reset Password Code Lives -config.webhook_config = Webhook Einstellungen +config.webhook_config = Webhook-Einstellungen config.task_interval = Task-Intervall config.deliver_timeout = Zeitlimit für Zustellung config.mailer_config = Mailer-Einstellungen @@ -454,28 +455,28 @@ config.mailer_enabled = Aktiviert config.mailer_name = Name config.mailer_host = Host config.mailer_user = Benutzer -config.oauth_config = OAuth Einstellungen +config.oauth_config = OAuth-Einstellungen config.oauth_enabled = Aktiviert -config.cache_config = Cache Einstellungen -config.cache_adapter = Cache Adapter -config.cache_interval = Cache Intervall -config.cache_conn = Cache Anbindung -config.session_config = Session Einstellungen -config.session_provider = Session Provider -config.provider_config = Provider Einstellungen -config.cookie_name = Cookie Name +config.cache_config = Cache-Einstellungen +config.cache_adapter = Cache-Adapter +config.cache_interval = Cache-Intervall +config.cache_conn = Cache-Anbindung +config.session_config = Session-Einstellungen +config.session_provider = Session-Provider +config.provider_config = Provider-Einstellungen +config.cookie_name = Cookie-Name config.enable_set_cookie = Enable Set Cookie config.gc_interval_time = GC-Intervallzeit -config.session_life_time = Session Lebensdauer +config.session_life_time = Session-Lebensdauer config.https_only = nur HTTPS -config.cookie_life_time = Cookie Lebensdauer -config.session_hash_function = Session-ID Hashfunktion -config.session_hash_key = Session-ID Hashschlüssel +config.cookie_life_time = Cookie-Lebensdauer +config.session_hash_function = Session-ID-Hashfunktion +config.session_hash_key = Session-ID-Hashschlüssel config.picture_config = Bildeinstellungen config.picture_service = Bildservice config.disable_gravatar = Gravatar deaktivieren -config.log_config = Log Einstellungen -config.log_mode = Log Modus +config.log_config = Log-Einstellungen +config.log_mode = Log-Modus monitor.cron = Cron-Tasks monitor.name = Name @@ -514,16 +515,3 @@ months = %d Monate %s years = %d Jahre %s raw_seconds = Sekunden raw_minutes = Minuten - - - - - - - - - - - - - -- cgit v1.2.3 From 0730ec408787f27c02d7f71d8e0cb713c0a95b57 Mon Sep 17 00:00:00 2001 From: Arpemedia Date: Tue, 2 Sep 2014 13:46:18 +0200 Subject: Fix grammar error in German translation --- conf/locale/locale_de-DE.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'conf') diff --git a/conf/locale/locale_de-DE.ini b/conf/locale/locale_de-DE.ini index 3e9936d6e4..19b2b5d11f 100644 --- a/conf/locale/locale_de-DE.ini +++ b/conf/locale/locale_de-DE.ini @@ -1,4 +1,4 @@ -app_desc = Ein einfacher, selbst gehostetes Git-Service, geschrieben in Go. +app_desc = Ein einfacher, selbst gehosteter Git-Service, geschrieben in Go. home = Home dashboard = Dashboard -- cgit v1.2.3 From 000b9062599d6138cb63775c61d1978283c195c1 Mon Sep 17 00:00:00 2001 From: Tristan Storch Date: Wed, 3 Sep 2014 16:58:23 +0200 Subject: Small German update Cleaning up a misunderstanding I had. --- conf/locale/locale_de-DE.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'conf') diff --git a/conf/locale/locale_de-DE.ini b/conf/locale/locale_de-DE.ini index 19b2b5d11f..d8060f0b54 100644 --- a/conf/locale/locale_de-DE.ini +++ b/conf/locale/locale_de-DE.ini @@ -127,7 +127,7 @@ orgs = Organisationen delete = Konto löschen public_profile = Öffentliches Profil -profile_desc = Deine E-Mail-Adresse wird nicht veröffentlicht und dient dazu, dir Benachrichtigungen bezüglich deines Kontos und deiner Repositorys zu schicken. +profile_desc = Deine E-Mail-Adresse ist öffentlich und dient dazu, dir Benachrichtigungen bezüglich deines Kontos und deiner Repositorys zu schicken. full_name = Vollständiger Name website = Webseite location = Standort -- cgit v1.2.3 From 8d2fe064c5d3858d76ebd67d5597a0bfccce4ecc Mon Sep 17 00:00:00 2001 From: Christopher Brickley Date: Wed, 3 Sep 2014 22:13:09 -0400 Subject: modify grammar undo -> undone --- conf/locale/locale_en-US.ini | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'conf') diff --git a/conf/locale/locale_en-US.ini b/conf/locale/locale_en-US.ini index 946d560461..4f1acdcda9 100644 --- a/conf/locale/locale_en-US.ini +++ b/conf/locale/locale_en-US.ini @@ -159,7 +159,7 @@ unbind = Unbind unbind_success = Social account has been unbound. delete_account = Delete Your Account -delete_prompt = The operation will delete your account permanently, and CANNOT be undo! +delete_prompt = The operation will delete your account permanently, and CANNOT be undone! confirm_delete_account = Confirm Deletion [repo] @@ -268,7 +268,7 @@ settings.update_settings = Update Settings settings.update_setting_success = Organization setting has been successfully updated. settings.delete = Delete Organization settings.delete_account = Delete This Organization -settings.delete_prompt = The operation will delete this organization permanently, and CANNOT be undo! +settings.delete_prompt = The operation will delete this organization permanently, and CANNOT be undone! settings.confirm_delete_account = Confirm Deletion members.public = Public -- cgit v1.2.3 From 85c35a6b8bb7430568d375d1e792e1417bbd7f4b Mon Sep 17 00:00:00 2001 From: Christopher Brickley Date: Thu, 4 Sep 2014 07:17:00 -0400 Subject: add organization-level webhooks --- cmd/web.go | 7 +++++ conf/locale/locale_en-US.ini | 1 + models/action.go | 16 ++++++++-- models/webhook.go | 13 ++++++++ public/ng/js/gogs.js | 29 ++++++++++------- routers/org/setting.go | 28 +++++++++++++++++ routers/repo/setting.go | 56 ++++++++++++++++++++++++++++----- templates/org/settings/hook_new.tmpl | 37 ++++++++++++++++++++++ templates/org/settings/hooks.tmpl | 38 ++++++++++++++++++++++ templates/org/settings/nav.tmpl | 3 +- templates/repo/settings/hook_gogs.tmpl | 2 +- templates/repo/settings/hook_slack.tmpl | 2 +- 12 files changed, 208 insertions(+), 24 deletions(-) create mode 100644 templates/org/settings/hook_new.tmpl create mode 100644 templates/org/settings/hooks.tmpl (limited to 'conf') diff --git a/cmd/web.go b/cmd/web.go index 57164683ac..f7b8d92128 100644 --- a/cmd/web.go +++ b/cmd/web.go @@ -260,6 +260,13 @@ func runWeb(*cli.Context) { m.Group("/settings", func(r *macaron.Router) { r.Get("", org.Settings) r.Post("", bindIgnErr(auth.UpdateOrgSettingForm{}), org.SettingsPost) + r.Get("/hooks", org.SettingsHooks) + r.Get("/hooks/new", repo.WebHooksNew) + r.Post("/hooks/gogs/new", bindIgnErr(auth.NewWebhookForm{}), repo.WebHooksNewPost) + r.Post("/hooks/slack/new", bindIgnErr(auth.NewSlackHookForm{}), repo.SlackHooksNewPost) + r.Get("/hooks/:id", repo.WebHooksEdit) + r.Post("/hooks/gogs/:id", bindIgnErr(auth.NewWebhookForm{}), repo.WebHooksEditPost) + r.Post("/hooks/slack/:id", bindIgnErr(auth.NewSlackHookForm{}), repo.SlackHooksEditPost) r.Route("/delete", "GET,POST", org.SettingsDelete) }) diff --git a/conf/locale/locale_en-US.ini b/conf/locale/locale_en-US.ini index 4f1acdcda9..3969074eee 100644 --- a/conf/locale/locale_en-US.ini +++ b/conf/locale/locale_en-US.ini @@ -270,6 +270,7 @@ settings.delete = Delete Organization settings.delete_account = Delete This Organization settings.delete_prompt = The operation will delete this organization permanently, and CANNOT be undone! settings.confirm_delete_account = Confirm Deletion +settings.hooks_desc = Add webhooks that will be triggered for all repositories under this organization. members.public = Public members.public_helper = make private diff --git a/models/action.go b/models/action.go index f739fc353d..c0992dba68 100644 --- a/models/action.go +++ b/models/action.go @@ -220,8 +220,20 @@ func CommitRepoAction(userId, repoUserId int64, userName, actEmail string, ws, err := GetActiveWebhooksByRepoId(repoId) if err != nil { - return errors.New("action.CommitRepoAction(GetWebhooksByRepoId): " + err.Error()) - } else if len(ws) == 0 { + return errors.New("action.CommitRepoAction(GetActiveWebhooksByRepoId): " + err.Error()) + } + + // check if repo belongs to org and append additional webhooks + if repo.Owner.IsOrganization() { + // get hooks for org + orgws, err := GetActiveWebhooksByOrgId(repo.OwnerId) + if err != nil { + return errors.New("action.CommitRepoAction(GetActiveWebhooksByOrgId): " + err.Error()) + } + ws = append(ws, orgws...) + } + + if len(ws) == 0 { return nil } diff --git a/models/webhook.go b/models/webhook.go index 0b7b3a9948..5acc83f592 100644 --- a/models/webhook.go +++ b/models/webhook.go @@ -45,6 +45,7 @@ type Webhook struct { IsActive bool HookTaskType HookTaskType Meta string `xorm:"TEXT"` // store hook-specific attributes + OrgId int64 } // GetEvent handles conversion from Events to HookEvent. @@ -120,6 +121,18 @@ func DeleteWebhook(hookId int64) error { return err } +// GetWebhooksByOrgId returns all webhooks for an organization. +func GetWebhooksByOrgId(orgId int64) (ws []*Webhook, err error) { + err = x.Find(&ws, &Webhook{OrgId: orgId}) + return ws, err +} + +// GetActiveWebhooksByOrgId returns all active webhooks for an organization. +func GetActiveWebhooksByOrgId(orgId int64) (ws []*Webhook, err error) { + err = x.Find(&ws, &Webhook{OrgId: orgId, IsActive: true}) + return ws, err +} + // ___ ___ __ ___________ __ // / | \ ____ ____ | | _\__ ___/____ _____| | __ // / ~ \/ _ \ / _ \| |/ / | | \__ \ / ___/ |/ / diff --git a/public/ng/js/gogs.js b/public/ng/js/gogs.js index c08a887a4c..c60a5cf648 100644 --- a/public/ng/js/gogs.js +++ b/public/ng/js/gogs.js @@ -349,17 +349,8 @@ function initRepo() { }) } -function initRepoSetting() { - // Options. - // Confirmation of changing repository name. - $('#repo-setting-form').submit(function (e) { - var $reponame = $('#repo_name'); - if (($reponame.data('repo-name') != $reponame.val()) && !confirm('Repository name has been changed, do you want to continue?')) { - e.preventDefault(); - return true; - } - }); - +// when user changes hook type, hide/show proper divs +function initHookTypeChange() { // web hook type change $('select#hook-type').on("change", function () { hookTypes = ['Gogs','Slack']; @@ -374,6 +365,20 @@ function initRepoSetting() { } }); }); +} + +function initRepoSetting() { + // Options. + // Confirmation of changing repository name. + $('#repo-setting-form').submit(function (e) { + var $reponame = $('#repo_name'); + if (($reponame.data('repo-name') != $reponame.val()) && !confirm('Repository name has been changed, do you want to continue?')) { + e.preventDefault(); + return true; + } + }); + + initHookTypeChange(); $('#transfer-button').click(function () { $('#transfer-form').show(); @@ -421,6 +426,8 @@ function initOrgSetting() { return true; } }); + + initHookTypeChange(); } function initInvite() { diff --git a/routers/org/setting.go b/routers/org/setting.go index 0ddf0065cc..f853ef0e8e 100644 --- a/routers/org/setting.go +++ b/routers/org/setting.go @@ -5,6 +5,7 @@ package org import ( + "github.com/Unknwon/com" "github.com/gogits/gogs/models" "github.com/gogits/gogs/modules/auth" "github.com/gogits/gogs/modules/base" @@ -15,6 +16,7 @@ import ( const ( SETTINGS_OPTIONS base.TplName = "org/settings/options" SETTINGS_DELETE base.TplName = "org/settings/delete" + SETTINGS_HOOKS base.TplName = "org/settings/hooks" ) func Settings(ctx *middleware.Context) { @@ -97,3 +99,29 @@ func SettingsDelete(ctx *middleware.Context) { ctx.HTML(200, SETTINGS_DELETE) } + +func SettingsHooks(ctx *middleware.Context) { + ctx.Data["Title"] = ctx.Tr("org.settings") + ctx.Data["PageIsSettingsHooks"] = true + + // Delete web hook. + remove := com.StrTo(ctx.Query("remove")).MustInt64() + if remove > 0 { + if err := models.DeleteWebhook(remove); err != nil { + ctx.Handle(500, "DeleteWebhook", err) + return + } + ctx.Flash.Success(ctx.Tr("repo.settings.remove_hook_success")) + ctx.Redirect(ctx.Org.OrgLink + "/settings/hooks") + return + } + + ws, err := models.GetWebhooksByOrgId(ctx.Org.Organization.Id) + if err != nil { + ctx.Handle(500, "GetWebhooksByOrgId", err) + return + } + + ctx.Data["Webhooks"] = ws + ctx.HTML(200, SETTINGS_HOOKS) +} diff --git a/routers/repo/setting.go b/routers/repo/setting.go index 7456781222..81747d43ed 100644 --- a/routers/repo/setting.go +++ b/routers/repo/setting.go @@ -6,6 +6,7 @@ package repo import ( "encoding/json" + "errors" "fmt" "strings" "time" @@ -26,6 +27,7 @@ const ( COLLABORATION base.TplName = "repo/settings/collaboration" HOOKS base.TplName = "repo/settings/hooks" HOOK_NEW base.TplName = "repo/settings/hook_new" + ORG_HOOK_NEW base.TplName = "org/settings/hook_new" ) func Settings(ctx *middleware.Context) { @@ -284,7 +286,14 @@ func WebHooksNew(ctx *middleware.Context) { ctx.Data["PageIsSettingsHooksNew"] = true ctx.Data["Webhook"] = models.Webhook{HookEvent: &models.HookEvent{}} renderHookTypes(ctx) - ctx.HTML(200, HOOK_NEW) + orgId, repoId, _ := getOrgRepoCtx(ctx) + if repoId > 0 { + ctx.HTML(200, HOOK_NEW) + } else if orgId > 0 { + ctx.HTML(200, ORG_HOOK_NEW) + } else { + ctx.Handle(500, "WebHooksEdit(DetermineContext)", errors.New("Can't determine hook context")) + } } func WebHooksNewPost(ctx *middleware.Context, form auth.NewWebhookForm) { @@ -293,6 +302,8 @@ func WebHooksNewPost(ctx *middleware.Context, form auth.NewWebhookForm) { ctx.Data["PageIsSettingsHooksNew"] = true ctx.Data["Webhook"] = models.Webhook{HookEvent: &models.HookEvent{}} + orgId, repoId, link := getOrgRepoCtx(ctx) + if ctx.HasError() { ctx.HTML(200, HOOK_NEW) return @@ -304,7 +315,7 @@ func WebHooksNewPost(ctx *middleware.Context, form auth.NewWebhookForm) { } w := &models.Webhook{ - RepoId: ctx.Repo.Repository.Id, + RepoId: repoId, Url: form.PayloadUrl, ContentType: ct, Secret: form.Secret, @@ -314,6 +325,7 @@ func WebHooksNewPost(ctx *middleware.Context, form auth.NewWebhookForm) { IsActive: form.Active, HookTaskType: models.GOGS, Meta: "", + OrgId: orgId, } if err := w.UpdateEvent(); err != nil { @@ -325,7 +337,7 @@ func WebHooksNewPost(ctx *middleware.Context, form auth.NewWebhookForm) { } ctx.Flash.Success(ctx.Tr("repo.settings.add_hook_success")) - ctx.Redirect(ctx.Repo.RepoLink + "/settings/hooks") + ctx.Redirect(link + "/settings/hooks") } func WebHooksEdit(ctx *middleware.Context) { @@ -363,7 +375,14 @@ func WebHooksEdit(ctx *middleware.Context) { } w.GetEvent() ctx.Data["Webhook"] = w - ctx.HTML(200, HOOK_NEW) + orgId, repoId, _ := getOrgRepoCtx(ctx) + if repoId > 0 { + ctx.HTML(200, HOOK_NEW) + } else if orgId > 0 { + ctx.HTML(200, ORG_HOOK_NEW) + } else { + ctx.Handle(500, "WebHooksEdit(DetermineContext)", errors.New("Can't determine hook context")) + } } func WebHooksEditPost(ctx *middleware.Context, form auth.NewWebhookForm) { @@ -413,9 +432,10 @@ func WebHooksEditPost(ctx *middleware.Context, form auth.NewWebhookForm) { ctx.Handle(500, "WebHooksEditPost", err) return } + _, _, link := getOrgRepoCtx(ctx) ctx.Flash.Success(ctx.Tr("repo.settings.update_hook_success")) - ctx.Redirect(fmt.Sprintf("%s/settings/hooks/%d", ctx.Repo.RepoLink, hookId)) + ctx.Redirect(fmt.Sprintf("%s/settings/hooks/%d", link, hookId)) } func SlackHooksNewPost(ctx *middleware.Context, form auth.NewSlackHookForm) { @@ -428,6 +448,7 @@ func SlackHooksNewPost(ctx *middleware.Context, form auth.NewSlackHookForm) { ctx.HTML(200, HOOK_NEW) return } + orgId, repoId, link := getOrgRepoCtx(ctx) meta, err := json.Marshal(&models.Slack{ Domain: form.Domain, @@ -440,7 +461,7 @@ func SlackHooksNewPost(ctx *middleware.Context, form auth.NewSlackHookForm) { } w := &models.Webhook{ - RepoId: ctx.Repo.Repository.Id, + RepoId: repoId, Url: models.GetSlackURL(form.Domain, form.Token), ContentType: models.JSON, Secret: "", @@ -450,6 +471,7 @@ func SlackHooksNewPost(ctx *middleware.Context, form auth.NewSlackHookForm) { IsActive: form.Active, HookTaskType: models.SLACK, Meta: string(meta), + OrgId: orgId, } if err := w.UpdateEvent(); err != nil { ctx.Handle(500, "UpdateEvent", err) @@ -460,7 +482,7 @@ func SlackHooksNewPost(ctx *middleware.Context, form auth.NewSlackHookForm) { } ctx.Flash.Success(ctx.Tr("repo.settings.add_hook_success")) - ctx.Redirect(ctx.Repo.RepoLink + "/settings/hooks") + ctx.Redirect(link + "/settings/hooks") } func SlackHooksEditPost(ctx *middleware.Context, form auth.NewSlackHookForm) { @@ -514,7 +536,25 @@ func SlackHooksEditPost(ctx *middleware.Context, form auth.NewSlackHookForm) { ctx.Handle(500, "SlackHooksEditPost", err) return } + _, _, link := getOrgRepoCtx(ctx) ctx.Flash.Success(ctx.Tr("repo.settings.update_hook_success")) - ctx.Redirect(fmt.Sprintf("%s/settings/hooks/%d", ctx.Repo.RepoLink, hookId)) + ctx.Redirect(fmt.Sprintf("%s/settings/hooks/%d", link, hookId)) +} + +func getOrgRepoCtx(ctx *middleware.Context) (int64, int64, string) { + orgId := int64(0) + repoId := int64(0) + link := "" + if _, ok := ctx.Data["RepoLink"]; ok { + repoId = ctx.Repo.Repository.Id + link = ctx.Repo.RepoLink + } + + if _, ok := ctx.Data["OrgLink"]; ok { + orgId = ctx.Org.Organization.Id + link = ctx.Org.OrgLink + } + + return orgId, repoId, link } diff --git a/templates/org/settings/hook_new.tmpl b/templates/org/settings/hook_new.tmpl new file mode 100644 index 0000000000..6e7ee53604 --- /dev/null +++ b/templates/org/settings/hook_new.tmpl @@ -0,0 +1,37 @@ +{{template "ng/base/head" .}} +{{template "ng/base/header" .}} +{{template "org/base/header" .}} +
    +
    + {{template "org/settings/nav" .}} +
    +
    + {{template "ng/base/alert" .}} +
    +
    +
    + {{if .PageIsSettingsHooksNew}}{{.i18n.Tr "repo.settings.add_webhook"}}{{else}}{{.i18n.Tr "repo.settings.update_webhook"}}{{end}} +
    + {{template "repo/settings/hook_types" .}} + {{template "repo/settings/hook_gogs" .}} + {{template "repo/settings/hook_slack" .}} +
    +
    + {{if .PageIsSettingsHooksEdit}} +
    +
    +
    +
    + {{.i18n.Tr "repo.settings.recent_deliveries"}} +
    +
      +
    • Coming soon!
    • +
    +
    +
    + {{end}} +
    +
    +
    +
    +{{template "ng/base/footer" .}} diff --git a/templates/org/settings/hooks.tmpl b/templates/org/settings/hooks.tmpl new file mode 100644 index 0000000000..713cfeb457 --- /dev/null +++ b/templates/org/settings/hooks.tmpl @@ -0,0 +1,38 @@ +{{template "ng/base/head" .}} +{{template "ng/base/header" .}} +{{template "org/base/header" .}} +
    +
    + {{template "org/settings/nav" .}} +
    +
    + {{template "ng/base/alert" .}} +
    +
    +
    + {{.i18n.Tr "repo.settings.add_webhook"}} + {{.i18n.Tr "repo.settings.hooks"}} +
    +
      +
    • {{.i18n.Tr "org.settings.hooks_desc" | Str2html}}
    • + {{range .Webhooks}} +
    • + {{if .IsActive}} + + {{else}} + + {{end}} + {{.Url}} + + +
    • + {{end}} +
    +
    +
    +
    +
    +
    +
    + +{{template "ng/base/footer" .}} diff --git a/templates/org/settings/nav.tmpl b/templates/org/settings/nav.tmpl index 950569d686..954893c6c2 100644 --- a/templates/org/settings/nav.tmpl +++ b/templates/org/settings/nav.tmpl @@ -5,7 +5,8 @@ - \ No newline at end of file + diff --git a/templates/repo/settings/hook_gogs.tmpl b/templates/repo/settings/hook_gogs.tmpl index 35b5899532..31a04ce09a 100644 --- a/templates/repo/settings/hook_gogs.tmpl +++ b/templates/repo/settings/hook_gogs.tmpl @@ -1,5 +1,5 @@
    -
    + {{.CsrfTokenHtml}}
    {{.i18n.Tr "repo.settings.add_webhook_desc" | Str2html}}
    diff --git a/templates/repo/settings/hook_slack.tmpl b/templates/repo/settings/hook_slack.tmpl index 50d28e2f5e..ed7a42e6f7 100644 --- a/templates/repo/settings/hook_slack.tmpl +++ b/templates/repo/settings/hook_slack.tmpl @@ -1,5 +1,5 @@
    - + {{.CsrfTokenHtml}}
    {{.i18n.Tr "repo.settings.add_slack_hook_desc" | Str2html}}
    -- cgit v1.2.3 From ab7206d6b787645956b0279f729bd7b22cbed690 Mon Sep 17 00:00:00 2001 From: Unknwon Date: Fri, 5 Sep 2014 17:28:09 -0400 Subject: Fix #348 --- README.md | 3 +- README_ZH.md | 3 +- cmd/web.go | 1 + conf/locale/locale_en-US.ini | 3 ++ conf/locale/locale_zh-CN.ini | 3 ++ gogs.go | 2 +- models/repo.go | 4 +- routers/home.go | 26 +++++++++- templates/.VERSION | 2 +- templates/explore/nav.tmpl | 8 ++++ templates/explore/repos.tmpl | 25 ++++++++++ templates/org/settings/options.tmpl | 96 ++++++++++++++++++------------------- templates/status/404.tmpl | 4 +- 13 files changed, 121 insertions(+), 59 deletions(-) create mode 100644 templates/explore/nav.tmpl create mode 100644 templates/explore/repos.tmpl (limited to 'conf') diff --git a/README.md b/README.md index ddb8367e9f..689b0df4fa 100644 --- a/README.md +++ b/README.md @@ -59,7 +59,7 @@ There are 5 ways to install Gogs: - [Install from binary](http://gogs.io/docs/installation/install_from_binary.md): **STRONGLY RECOMMENDED** - [Install from source](http://gogs.io/docs/installation/install_from_source.md) - [Install from packages](http://gogs.io/docs/installation/install_from_packages.md) -- [Ship with Docker](https://github.com/gogits/gogs/tree/master/dockerfiles) +- [Ship with Docker](https://github.com/gogits/gogs/tree/master/docker) - [Install with Vagrant](https://github.com/geerlingguy/ansible-vagrant-examples/tree/master/gogs) ## Acknowledgments @@ -70,7 +70,6 @@ There are 5 ways to install Gogs: - Usage and modification from [beego](http://beego.me) modules. - Thanks [lavachen](http://www.lavachen.cn/) and [Rocker](http://weibo.com/rocker1989) for designing Logo. - Thanks [gobuild.io](http://gobuild.io) for providing binary compile and download service. -- Thanks [Docker China](http://www.dockboard.org/) for providing [dockerfiles](https://github.com/gogits/gogs/tree/master/dockerfiles). ## Contributors diff --git a/README_ZH.md b/README_ZH.md index de982baf37..401c8186c8 100644 --- a/README_ZH.md +++ b/README_ZH.md @@ -50,7 +50,7 @@ Gogs 的目标是打造一个最简单、最快速和最轻松的方式搭建自 - [二进制安装](http://gogs.io/docs/installation/install_from_binary.md): **强烈推荐** - [源码安装](http://gogs.io/docs/installation/install_from_source.md) - [包管理安装](http://gogs.io/docs/installation/install_from_packages.md) -- [采用 Docker 部署](https://github.com/gogits/gogs/tree/master/dockerfiles) +- [采用 Docker 部署](https://github.com/gogits/gogs/tree/master/docker) - [通过 Vagrant 安装](https://github.com/geerlingguy/ansible-vagrant-examples/tree/master/gogs) ## 特别鸣谢 @@ -61,7 +61,6 @@ Gogs 的目标是打造一个最简单、最快速和最轻松的方式搭建自 - [martini](http://martini.codegangsta.io/) 的路由与中间件机制。 - 感谢 [gobuild.io](http://gobuild.io) 提供二进制编译与下载服务。 - 感谢 [lavachen](http://www.lavachen.cn/) 和 [Rocker](http://weibo.com/rocker1989) 设计的 Logo。 -- 感谢 [Docker 中文社区](http://www.dockboard.org/) 提供的 [dockerfiles](https://github.com/gogits/gogs/tree/master/dockerfiles)。 ## 贡献成员 diff --git a/cmd/web.go b/cmd/web.go index 57164683ac..cad1db336b 100644 --- a/cmd/web.go +++ b/cmd/web.go @@ -124,6 +124,7 @@ func runWeb(*cli.Context) { // Routers. m.Get("/", ignSignIn, routers.Home) + m.Get("/explore", routers.Explore) m.Get("/install", bindIgnErr(auth.InstallForm{}), routers.Install) m.Post("/install", bindIgnErr(auth.InstallForm{}), routers.InstallPost) m.Group("", func(r *macaron.Router) { diff --git a/conf/locale/locale_en-US.ini b/conf/locale/locale_en-US.ini index 946d560461..e8329933a4 100644 --- a/conf/locale/locale_en-US.ini +++ b/conf/locale/locale_en-US.ini @@ -47,6 +47,9 @@ collaborative_repos = Collaborative Repositories my_orgs = My Organizations my_mirrors = My Mirrors +[explore] +repos = Repositories + [auth] create_new_account = Create New Account register_hepler_msg = Already have an account? Sign in now! diff --git a/conf/locale/locale_zh-CN.ini b/conf/locale/locale_zh-CN.ini index 55d22f23ee..a61a54ceb2 100644 --- a/conf/locale/locale_zh-CN.ini +++ b/conf/locale/locale_zh-CN.ini @@ -47,6 +47,9 @@ collaborative_repos = 参与协作的仓库 my_orgs = 我的组织 my_mirrors = 我的镜像 +[explore] +repos = 探索仓库 + [auth] create_new_account = 创建帐户 register_hepler_msg = 已经注册?立即登录! diff --git a/gogs.go b/gogs.go index a116019078..1c012d4098 100644 --- a/gogs.go +++ b/gogs.go @@ -17,7 +17,7 @@ import ( "github.com/gogits/gogs/modules/setting" ) -const APP_VER = "0.4.9.0902 Beta" +const APP_VER = "0.4.9.0905 Beta" func init() { runtime.GOMAXPROCS(runtime.NumCPU()) diff --git a/models/repo.go b/models/repo.go index 23d44a6b80..341e7e47a1 100644 --- a/models/repo.go +++ b/models/repo.go @@ -972,8 +972,8 @@ func GetRepositories(uid int64, private bool) ([]*Repository, error) { } // GetRecentUpdatedRepositories returns the list of repositories that are recently updated. -func GetRecentUpdatedRepositories() (repos []*Repository, err error) { - err = x.Where("is_private=?", false).Limit(5).Desc("updated").Find(&repos) +func GetRecentUpdatedRepositories(num int) (repos []*Repository, err error) { + err = x.Where("is_private=?", false).Limit(num).Desc("updated").Find(&repos) return repos, err } diff --git a/routers/home.go b/routers/home.go index 5ea3e2a027..36a4f50fd2 100644 --- a/routers/home.go +++ b/routers/home.go @@ -5,6 +5,9 @@ package routers import ( + "fmt" + + "github.com/gogits/gogs/models" "github.com/gogits/gogs/modules/base" "github.com/gogits/gogs/modules/middleware" "github.com/gogits/gogs/modules/setting" @@ -12,7 +15,8 @@ import ( ) const ( - HOME base.TplName = "home" + HOME base.TplName = "home" + EXPLORE_REPOS base.TplName = "explore/repos" ) func Home(ctx *middleware.Context) { @@ -42,6 +46,26 @@ func Home(ctx *middleware.Context) { ctx.HTML(200, HOME) } +func Explore(ctx *middleware.Context) { + ctx.Data["Title"] = ctx.Tr("explore") + ctx.Data["PageIsExploreRepositories"] = true + + repos, err := models.GetRecentUpdatedRepositories(20) + if err != nil { + ctx.Handle(500, "GetRecentUpdatedRepositories", err) + return + } + for _, repo := range repos { + if err = repo.GetOwner(); err != nil { + ctx.Handle(500, "GetOwner", fmt.Errorf("%d: %v", repo.Id, err)) + return + } + } + ctx.Data["Repos"] = repos + + ctx.HTML(200, EXPLORE_REPOS) +} + func NotFound(ctx *middleware.Context) { ctx.Data["Title"] = "Page Not Found" ctx.Handle(404, "home.NotFound", nil) diff --git a/templates/.VERSION b/templates/.VERSION index 5f3c518191..6e361299ef 100644 --- a/templates/.VERSION +++ b/templates/.VERSION @@ -1 +1 @@ -0.4.9.0902 Beta \ No newline at end of file +0.4.9.0905 Beta \ No newline at end of file diff --git a/templates/explore/nav.tmpl b/templates/explore/nav.tmpl new file mode 100644 index 0000000000..1310bccf04 --- /dev/null +++ b/templates/explore/nav.tmpl @@ -0,0 +1,8 @@ +
    +

    {{.i18n.Tr "explore"}}

    + +
    \ No newline at end of file diff --git a/templates/explore/repos.tmpl b/templates/explore/repos.tmpl new file mode 100644 index 0000000000..a1e3d408e8 --- /dev/null +++ b/templates/explore/repos.tmpl @@ -0,0 +1,25 @@ +{{template "ng/base/head" .}} +{{template "ng/base/header" .}} +
    +
    + {{template "explore/nav" .}} +
    +
    +
    + {{range .Repos}} +
    +
      +
    • {{.NumStars}}
    • +
    • {{.NumForks}}
    • +
    +

    {{.Name}}

    +

    {{.Description}}

    +

    {{$.i18n.Tr "org.repo_updated"}} {{TimeSince .Updated $.i18n.Lang}}

    +
    + {{end}} +
    +
    +
    +
    +
    +{{template "ng/base/footer" .}} \ No newline at end of file diff --git a/templates/org/settings/options.tmpl b/templates/org/settings/options.tmpl index ae225a9ca4..14ea1b349d 100644 --- a/templates/org/settings/options.tmpl +++ b/templates/org/settings/options.tmpl @@ -3,54 +3,54 @@ {{template "org/base/header" .}}
    - {{template "org/settings/nav" .}} -
    -
    - {{template "ng/base/alert" .}} -
    -
    -
    - {{.i18n.Tr "org.settings.options"}} -
    - - {{.CsrfTokenHtml}} - -
    - - -
    -
    - - -
    -
    - - -
    -
    - - -
    -
    - - -
    -
    - - -
    -
    - - -
    -
    - - -
    - -
    -
    -
    + {{template "org/settings/nav" .}} +
    +
    + {{template "ng/base/alert" .}} +
    +
    +
    + {{.i18n.Tr "org.settings.options"}} +
    +
    + {{.CsrfTokenHtml}} + +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    +
    +
    +
    diff --git a/templates/status/404.tmpl b/templates/status/404.tmpl index 2d04b55917..e024715ed2 100644 --- a/templates/status/404.tmpl +++ b/templates/status/404.tmpl @@ -1,11 +1,11 @@ {{template "ng/base/head" .}} {{template "ng/base/header" .}} -
    +

    404



    Application Version: {{AppVer}}

    If you think this is an error, please open an issue on GitHub.

    -

    We're currently working on 0.5 beta version, many pages may be missing at this time. Sorry for confusion!

    +
    {{template "ng/base/footer" .}} -- cgit v1.2.3 From 0ddb1eb769610f1d74997ad12d848ae5a0bdb4ab Mon Sep 17 00:00:00 2001 From: Unknwon Date: Sun, 7 Sep 2014 19:02:58 -0400 Subject: Finish new install page, almost ready for 0.5 release --- conf/locale/locale_en-US.ini | 47 +++++- conf/locale/locale_zh-CN.ini | 45 ++++++ gogs.go | 2 +- modules/auth/user_form.go | 21 +-- public/ng/css/gogs.css | 13 ++ public/ng/js/gogs.js | 42 +++++- public/ng/js/min/gogs-min.js | 10 +- public/ng/less/gogs/external.less | 170 +++++++++++---------- routers/install.go | 49 +++--- templates/.VERSION | 2 +- templates/install.tmpl | 306 ++++++++++++++++---------------------- 11 files changed, 408 insertions(+), 299 deletions(-) (limited to 'conf') diff --git a/conf/locale/locale_en-US.ini b/conf/locale/locale_en-US.ini index e8329933a4..50fbc3cd5a 100644 --- a/conf/locale/locale_en-US.ini +++ b/conf/locale/locale_en-US.ini @@ -38,6 +38,50 @@ issues = Issues cancel = Cancel +[install] +install = Installation +title = Install Steps For First-time Run +requite_db_desc = Gogs requires MySQL, PostgreSQL or SQLite3, but SQLite3 is usually available in the official binary version. +db_type = Database Type +host = Host +user = User +password = Password +db_name = Database Name +db_helper = Please use INNODB engine with utf8_general_ci charset for MySQL. +ssl_mode = SSL Mode +path = Path +sqlite_helper = The file path of SQLite3 database. +general_title = General Settings of Gogs +repo_path = Repository Root Path +repo_path_helper = All Git remote repositories will be saved to this directory. +run_user = Run User +run_user_helper = The user must have access to Repository Root Path and run Gogs. +domain = Domain +domain_helper = This affects SSH clone URLs. +app_url = Application URL +app_url_helper = This affects HTTP/HTTPS clone URL and somewhere in e-mail. +email_title = Email Service Settings(Optional) +smtp_host = SMTP Host +mailer_user = Sender E-mail +mailer_password = Sender Password +notify_title = Notification Settings(Optional) +register_confirm = Enable Register Confirmation +mail_notify = Enable Mail Notification +admin_title = Admin Account Settings +admin_name = Username +admin_password = Password +confirm_password = Confirm Password +admin_email = E-mail +install_gogs = Install Gogs +test_git_failed = Fail to test 'git' command: %v +sqlite3_not_available = Your release version does not support SQLite3, please download the official binary version from http://gogs.io/docs/installation/install_from_binary.html, NOT the gobuild version. +invalid_db_setting = Database setting is not correct: %v +invalid_repo_path = Repository root path is invalid: %v +run_user_not_match = Run user isn't the current user: %s -> %s +save_config_failed = Fail to save configuration: %v +invalid_admin_setting = Admin account setting is invalid: %v +install_success = Welcome! We're glad that you choose Gogs, have fun and take care. + [home] uname_holder = Username or E-mail password_holder = Password @@ -84,6 +128,7 @@ HttpsUrl = HTTPS URL PayloadUrl = Payload URL TeamName = Team name AuthName = Authorization name +AdminEmail = Admin E-mail require_error = ` cannot be empty.` alpha_dash_error = ` must be valid alpha or numeric or dash(-_) characters.` @@ -94,7 +139,7 @@ email_error = ` is not a valid e-mail address.` url_error = ` is not a valid URL.` unknown_error = Unknown error: captcha_incorrect = Captcha didn't match. -password_not_match = Password and re-type password are not same. +password_not_match = Password and confirm password are not same. username_been_taken = Username has been already taken. repo_name_been_taken = Repository name has been already taken. diff --git a/conf/locale/locale_zh-CN.ini b/conf/locale/locale_zh-CN.ini index a61a54ceb2..7d10142e62 100644 --- a/conf/locale/locale_zh-CN.ini +++ b/conf/locale/locale_zh-CN.ini @@ -38,6 +38,50 @@ issues = 工单管理 cancel = 取消 +[install] +install = 安装页面 +title = 首次运行安装程序 +requite_db_desc = Gogs 允许后端数据库为 MySQL、PostgreSQL 或 SQLite3,但是 SQLite3 一般只有官方二进制发行版才支持。 +db_type = 数据库类型 +host = 数据库主机 +user = 数据库用户 +password = 数据库用户密码 +db_name = 数据库名称 +db_helper = 如果您使用 MySQL,请使用 INNODB 引擎以及 utf8_general_ci 字符集。 +ssl_mode = SSL 模式 +path = 数据库文件路径 +sqlite_helper = SQLite3 数据库的文件路径。 +general_title = 应用基本设置 +repo_path = 仓库根目录 +repo_path_helper = 所有 Git 远程仓库都将被存放于该目录。 +run_user = 运行系统用户 +run_user_helper = 该用户必须具有对仓库根目录和运行 Gogs 的操作权限。 +domain = 域名 +domain_helper = 该设置影响 SSH 克隆地址。 +app_url = 应用 URL +app_url_helper = 该设置影响 HTTP/HTTPS 克隆地址和一些邮箱中的链接。 +email_title = 邮件服务设置(可选) +smtp_host = SMTP 主机 +mailer_user = 发送邮箱 +mailer_password = 发送邮箱密码 +notify_title = 通知提醒设置(可选) +register_confirm = 启用注册邮箱确认 +mail_notify = 启用邮件通知提醒 +admin_title = 管理员帐号设置 +admin_name = 管理员用户名 +admin_password = 管理员密码 +confirm_password = 确认密码 +admin_email = 管理员邮箱 +install_gogs = 立即安装 +test_git_failed = 无法识别 'git' 命令:%v +sqlite3_not_available = 您所使用的发行版不支持 SQLite3,请从 http://gogs.io/docs/installation/install_from_binary.html 下载官方二进制发行版,而不是 gobuild 版本。 +invalid_db_setting = 数据库设置不正确:%v +invalid_repo_path = 仓库根目录设置不正确:%v +run_user_not_match = 运行系统用户非当前用户:%s -> %s +save_config_failed = 应用配置保存失败:%v +invalid_admin_setting = 管理员帐户设置不正确:%v +install_success = 您好!我们很高兴您选择使用 Gogs,祝您使用愉快,代码从此无 BUG! + [home] uname_holder = 用户名或邮箱 password_holder = 密码 @@ -84,6 +128,7 @@ HttpsUrl = HTTPS URL 地址 PayloadUrl = 推送地址 TeamName = 团队名称 AuthName = 认证名称 +AdminEmail = 管理员邮箱 require_error = 不能为空。 alpha_dash_error = 必须为英文字母、阿拉伯数字或横线(-_)。 diff --git a/gogs.go b/gogs.go index 1c012d4098..2ca0f9ad87 100644 --- a/gogs.go +++ b/gogs.go @@ -17,7 +17,7 @@ import ( "github.com/gogits/gogs/modules/setting" ) -const APP_VER = "0.4.9.0905 Beta" +const APP_VER = "0.5.0.0907 Beta" func init() { runtime.GOMAXPROCS(runtime.NumCPU()) diff --git a/modules/auth/user_form.go b/modules/auth/user_form.go index 51a07b9128..93bd01a9fd 100644 --- a/modules/auth/user_form.go +++ b/modules/auth/user_form.go @@ -13,24 +13,25 @@ import ( type InstallForm struct { Database string `form:"database" binding:"Required"` - Host string `form:"host"` - User string `form:"user"` - Passwd string `form:"passwd"` + DbHost string `form:"host"` + DbUser string `form:"user"` + DbPasswd string `form:"passwd"` DatabaseName string `form:"database_name"` SslMode string `form:"ssl_mode"` DatabasePath string `form:"database_path"` - RepoRootPath string `form:"repo_path"` - RunUser string `form:"run_user"` - Domain string `form:"domain"` - AppUrl string `form:"app_url"` - AdminName string `form:"admin_name" binding:"Required;AlphaDashDot;MaxSize(30)"` - AdminPasswd string `form:"admin_pwd" binding:"Required;MinSize(6);MaxSize(255)"` - AdminEmail string `form:"admin_email" binding:"Required;Email;MaxSize(50)"` + RepoRootPath string `form:"repo_path" binding:"Required"` + RunUser string `form:"run_user" binding:"Required"` + Domain string `form:"domain" binding:"Required"` + AppUrl string `form:"app_url" binding:"Required"` SmtpHost string `form:"smtp_host"` SmtpEmail string `form:"mailer_user"` SmtpPasswd string `form:"mailer_pwd"` RegisterConfirm string `form:"register_confirm"` MailNotify string `form:"mail_notify"` + AdminName string `form:"admin_name" binding:"Required;AlphaDashDot;MaxSize(30)"` + AdminPasswd string `form:"admin_pwd" binding:"Required;MinSize(6);MaxSize(255)"` + ConfirmPasswd string `form:"confirm_passwd" binding:"Required;MinSize(6);MaxSize(255)"` + AdminEmail string `form:"admin_email" binding:"Required;Email;MaxSize(50)"` } func (f *InstallForm) Validate(ctx *macaron.Context, errs *binding.Errors, l i18n.Locale) { diff --git a/public/ng/css/gogs.css b/public/ng/css/gogs.css index 636a866774..f4d33540e5 100644 --- a/public/ng/css/gogs.css +++ b/public/ng/css/gogs.css @@ -669,6 +669,19 @@ ol.linenums { #feature-wrapper .grid-1-2 { margin-bottom: 30px; } +#install-form { + padding: 15px; +} +#install-form label { + width: 35%; +} +#install-form input { + width: 30%; +} +#install-form input[type="checkbox"], +#install-form input[type="radio"] { + width: auto; +} /* The dashboard page style */ diff --git a/public/ng/js/gogs.js b/public/ng/js/gogs.js index c08a887a4c..cb23c8f97b 100644 --- a/public/ng/js/gogs.js +++ b/public/ng/js/gogs.js @@ -521,7 +521,7 @@ function initAdmin() { e.preventDefault(); return true; } - var $form = $('user-profile-form'); + var $form = $('#user-profile-form'); $form.attr('action', $form.data('delete-url')); }); // Create authorization. @@ -547,6 +547,43 @@ function initAdmin() { }); } +function initInstall() { + // Change database type. + (function () { + var mysql_default = '127.0.0.1:3306'; + var postgres_default = '127.0.0.1:5432'; + + $('#install-database').on("change", function () { + var val = $(this).val(); + if (val != "SQLite3") { + $('.server-sql').show(); + $('.sqlite-setting').addClass("hide"); + if (val == "PostgreSQL") { + $('.pgsql-setting').removeClass("hide"); + + // Change the host value to the Postgres default, but only + // if the user hasn't already changed it from the MySQL + // default. + if ($('#database-host').val() == mysql_default) { + $('#database-host').val(postgres_default); + } + } else if (val == 'MySQL') { + $('.pgsql-setting').addClass("hide"); + if ($('#database-host').val() == postgres_default) { + $('#database-host').val(mysql_default); + } + } else { + $('.pgsql-setting').addClass("hide"); + } + } else { + $('.server-sql').hide(); + $('.pgsql-setting').hide(); + $('.sqlite-setting').removeClass("hide"); + } + }); + }()); +} + $(document).ready(function () { initCore(); if ($('#user-profile-setting').length) { @@ -579,6 +616,9 @@ $(document).ready(function () { if ($('#admin-setting').length) { initAdmin(); } + if ($('#install-form').length) { + initInstall(); + } Tabs('#dashboard-sidebar-menu'); diff --git a/public/ng/js/min/gogs-min.js b/public/ng/js/min/gogs-min.js index 4e4d63fe52..8151792f25 100644 --- a/public/ng/js/min/gogs-min.js +++ b/public/ng/js/min/gogs-min.js @@ -1,5 +1,5 @@ -function Tabs(e){function t(e){console.log("hide",e),e.removeClass("js-tab-nav-show"),$(e.data("tab-target")).removeClass("js-tab-show").hide()}function n(e){console.log("show",e),e.addClass("js-tab-nav-show"),$(e.data("tab-target")).addClass("js-tab-show").show()}var r=$(e);if(r.length){var i=r.find(".js-tab-nav-show");i.length&&$(i.data("tab-target")).addClass("js-tab-show"),r.on("click",".js-tab-nav",function(){var e=$(this);e.hasClass("js-tab-nav-show")||(i=r.find(".js-tab-nav-show").eq(0),t(i),n(e))}),console.log("init tabs @",e)}}function initCore(){Gogs.renderMarkdown(),Gogs.renderCodeView()}function homepage(){$("#promo-form").submit(function(e){return""===$("#username").val()?(e.preventDefault(),window.location.href="/user/login",!0):void 0}),$("#register-button").click(function(e){return""===$("#username").val()?(e.preventDefault(),window.location.href="/user/sign_up",!0):void $("#promo-form").attr("action","/user/sign_up")})}function settingsProfile(){$("#user-profile-form").submit(function(e){return $("#username").data("uname")==$("#username").val()||confirm("Username has been changed, do you want to continue?")?void 0:(e.preventDefault(),!0)})}function settingsSSHKeys(){$("#ssh-add").click(function(){$("#user-ssh-add-form").removeClass("hide")})}function settingsDelete(){$("#delete-account-button").click(function(e){return confirm("This account is going to deleted, do you want to continue?")?void 0:(e.preventDefault(),!0)})}!function(e,t){"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(e,t){function n(e){var t=e.length,n=ot.type(e);return"function"===n||ot.isWindow(e)?!1:1===e.nodeType&&t?!0:"array"===n||0===t||"number"==typeof t&&t>0&&t-1 in e}function r(e,t,n){if(ot.isFunction(t))return ot.grep(e,function(e,r){return!!t.call(e,r,e)!==n});if(t.nodeType)return ot.grep(e,function(e){return e===t!==n});if("string"==typeof t){if(pt.test(t))return ot.filter(t,e,n);t=ot.filter(t,e)}return ot.grep(e,function(e){return ot.inArray(e,t)>=0!==n})}function i(e,t){do e=e[t];while(e&&1!==e.nodeType);return e}function o(e){var t=wt[e]={};return ot.each(e.match(xt)||[],function(e,n){t[n]=!0}),t}function a(){mt.addEventListener?(mt.removeEventListener("DOMContentLoaded",s,!1),e.removeEventListener("load",s,!1)):(mt.detachEvent("onreadystatechange",s),e.detachEvent("onload",s))}function s(){(mt.addEventListener||"load"===event.type||"complete"===mt.readyState)&&(a(),ot.ready())}function l(e,t,n){if(void 0===n&&1===e.nodeType){var r="data-"+t.replace(kt,"-$1").toLowerCase();if(n=e.getAttribute(r),"string"==typeof n){try{n="true"===n?!0:"false"===n?!1:"null"===n?null:+n+""===n?+n:Et.test(n)?ot.parseJSON(n):n}catch(i){}ot.data(e,t,n)}else n=void 0}return n}function u(e){var t;for(t in e)if(("data"!==t||!ot.isEmptyObject(e[t]))&&"toJSON"!==t)return!1;return!0}function c(e,t,n,r){if(ot.acceptData(e)){var i,o,a=ot.expando,s=e.nodeType,l=s?ot.cache:e,u=s?e[a]:e[a]&&a;if(u&&l[u]&&(r||l[u].data)||void 0!==n||"string"!=typeof t)return u||(u=s?e[a]=G.pop()||ot.guid++:a),l[u]||(l[u]=s?{}:{toJSON:ot.noop}),("object"==typeof t||"function"==typeof t)&&(r?l[u]=ot.extend(l[u],t):l[u].data=ot.extend(l[u].data,t)),o=l[u],r||(o.data||(o.data={}),o=o.data),void 0!==n&&(o[ot.camelCase(t)]=n),"string"==typeof t?(i=o[t],null==i&&(i=o[ot.camelCase(t)])):i=o,i}}function d(e,t,n){if(ot.acceptData(e)){var r,i,o=e.nodeType,a=o?ot.cache:e,s=o?e[ot.expando]:ot.expando;if(a[s]){if(t&&(r=n?a[s]:a[s].data)){ot.isArray(t)?t=t.concat(ot.map(t,ot.camelCase)):t in r?t=[t]:(t=ot.camelCase(t),t=t in r?[t]:t.split(" ")),i=t.length;for(;i--;)delete r[t[i]];if(n?!u(r):!ot.isEmptyObject(r))return}(n||(delete a[s].data,u(a[s])))&&(o?ot.cleanData([e],!0):rt.deleteExpando||a!=a.window?delete a[s]:a[s]=null)}}}function f(){return!0}function p(){return!1}function h(){try{return mt.activeElement}catch(e){}}function m(e){var t=Ht.split("|"),n=e.createDocumentFragment();if(n.createElement)for(;t.length;)n.createElement(t.pop());return n}function g(e,t){var n,r,i=0,o=typeof e.getElementsByTagName!==St?e.getElementsByTagName(t||"*"):typeof e.querySelectorAll!==St?e.querySelectorAll(t||"*"):void 0;if(!o)for(o=[],n=e.childNodes||e;null!=(r=n[i]);i++)!t||ot.nodeName(r,t)?o.push(r):ot.merge(o,g(r,t));return void 0===t||t&&ot.nodeName(e,t)?ot.merge([e],o):o}function v(e){jt.test(e.type)&&(e.defaultChecked=e.checked)}function y(e,t){return ot.nodeName(e,"table")&&ot.nodeName(11!==t.nodeType?t:t.firstChild,"tr")?e.getElementsByTagName("tbody")[0]||e.appendChild(e.ownerDocument.createElement("tbody")):e}function b(e){return e.type=(null!==ot.find.attr(e,"type"))+"/"+e.type,e}function x(e){var t=Zt.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function w(e,t){for(var n,r=0;null!=(n=e[r]);r++)ot._data(n,"globalEval",!t||ot._data(t[r],"globalEval"))}function C(e,t){if(1===t.nodeType&&ot.hasData(e)){var n,r,i,o=ot._data(e),a=ot._data(t,o),s=o.events;if(s){delete a.handle,a.events={};for(n in s)for(r=0,i=s[n].length;i>r;r++)ot.event.add(t,n,s[n][r])}a.data&&(a.data=ot.extend({},a.data))}}function S(e,t){var n,r,i;if(1===t.nodeType){if(n=t.nodeName.toLowerCase(),!rt.noCloneEvent&&t[ot.expando]){i=ot._data(t);for(r in i.events)ot.removeEvent(t,r,i.handle);t.removeAttribute(ot.expando)}"script"===n&&t.text!==e.text?(b(t).text=e.text,x(t)):"object"===n?(t.parentNode&&(t.outerHTML=e.outerHTML),rt.html5Clone&&e.innerHTML&&!ot.trim(t.innerHTML)&&(t.innerHTML=e.innerHTML)):"input"===n&&jt.test(e.type)?(t.defaultChecked=t.checked=e.checked,t.value!==e.value&&(t.value=e.value)):"option"===n?t.defaultSelected=t.selected=e.defaultSelected:("input"===n||"textarea"===n)&&(t.defaultValue=e.defaultValue)}}function T(t,n){var r,i=ot(n.createElement(t)).appendTo(n.body),o=e.getDefaultComputedStyle&&(r=e.getDefaultComputedStyle(i[0]))?r.display:ot.css(i[0],"display");return i.detach(),o}function E(e){var t=mt,n=Jt[e];return n||(n=T(e,t),"none"!==n&&n||(Kt=(Kt||ot("
    ',srcAction:"iframe_src",patterns:{youtube:{index:"youtube.com",id:"v=",src:"//www.youtube.com/embed/%id%?autoplay=1"},vimeo:{index:"vimeo.com/",id:"/",src:"//player.vimeo.com/video/%id%?autoplay=1"},gmaps:{index:"//maps.google.",src:"%id%&output=embed"}}},proto:{initIframe:function(){t.types.push(Z),x("BeforeChange",function(e,t,n){t!==n&&(t===Z?D():n===Z&&D(!0))}),x(l+"."+Z,function(){D()})},getIframe:function(n,i){var o=n.src,r=t.st.iframe;e.each(r.patterns,function(){return o.indexOf(this.index)>-1?(this.id&&(o="string"==typeof this.id?o.substr(o.lastIndexOf(this.id)+this.id.length,o.length):this.id.call(this,o)),o=this.src.replace("%id%",o),!1):void 0});var a={};return r.srcAction&&(a[r.srcAction]=o),t._parseMarkup(i,a,n),t.updateStatus("ready"),i}}});var K=function(e){var n=t.items.length;return e>n-1?e-n:0>e?n+e:e},Y=function(e,t,n){return e.replace(/%curr%/gi,t+1).replace(/%total%/gi,n)};e.magnificPopup.registerModule("gallery",{options:{enabled:!1,arrowMarkup:'',preload:[0,2],navigateByImgClick:!0,arrows:!0,tPrev:"Previous (Left arrow key)",tNext:"Next (Right arrow key)",tCounter:"%curr% of %total%"},proto:{initGallery:function(){var n=t.st.gallery,i=".mfp-gallery",r=Boolean(e.fn.mfpFastClick);return t.direction=!0,n&&n.enabled?(a+=" mfp-gallery",x(f+i,function(){n.navigateByImgClick&&t.wrap.on("click"+i,".mfp-img",function(){return t.items.length>1?(t.next(),!1):void 0}),o.on("keydown"+i,function(e){37===e.keyCode?t.prev():39===e.keyCode&&t.next()})}),x("UpdateStatus"+i,function(e,n){n.text&&(n.text=Y(n.text,t.currItem.index,t.items.length))}),x(p+i,function(e,i,o,r){var a=t.items.length;o.counter=a>1?Y(n.tCounter,r.index,a):""}),x("BuildControls"+i,function(){if(t.items.length>1&&n.arrows&&!t.arrowLeft){var i=n.arrowMarkup,o=t.arrowLeft=e(i.replace(/%title%/gi,n.tPrev).replace(/%dir%/gi,"left")).addClass(y),a=t.arrowRight=e(i.replace(/%title%/gi,n.tNext).replace(/%dir%/gi,"right")).addClass(y),s=r?"mfpFastClick":"click";o[s](function(){t.prev()}),a[s](function(){t.next()}),t.isIE7&&(k("b",o[0],!1,!0),k("a",o[0],!1,!0),k("b",a[0],!1,!0),k("a",a[0],!1,!0)),t.container.append(o.add(a))}}),x(m+i,function(){t._preloadTimeout&&clearTimeout(t._preloadTimeout),t._preloadTimeout=setTimeout(function(){t.preloadNearbyImages(),t._preloadTimeout=null},16)}),x(l+i,function(){o.off(i),t.wrap.off("click"+i),t.arrowLeft&&r&&t.arrowLeft.add(t.arrowRight).destroyMfpFastClick(),t.arrowRight=t.arrowLeft=null}),void 0):!1},next:function(){t.direction=!0,t.index=K(t.index+1),t.updateItemHTML()},prev:function(){t.direction=!1,t.index=K(t.index-1),t.updateItemHTML()},goTo:function(e){t.direction=e>=t.index,t.index=e,t.updateItemHTML()},preloadNearbyImages:function(){var e,n=t.st.gallery.preload,i=Math.min(n[0],t.items.length),o=Math.min(n[1],t.items.length);for(e=1;(t.direction?o:i)>=e;e++)t._preloadItem(t.index+e);for(e=1;(t.direction?i:o)>=e;e++)t._preloadItem(t.index-e)},_preloadItem:function(n){if(n=K(n),!t.items[n].preloaded){var i=t.items[n];i.parsed||(i=t.parseEl(n)),T("LazyLoad",i),"image"===i.type&&(i.img=e('').on("load.mfploader",function(){i.hasSize=!0}).on("error.mfploader",function(){i.hasSize=!0,i.loadError=!0,T("LazyLoadError",i)}).attr("src",i.src)),i.preloaded=!0}}}});var U="retina";e.magnificPopup.registerModule(U,{options:{replaceSrc:function(e){return e.src.replace(/\.\w+$/,function(e){return"@2x"+e})},ratio:1},proto:{initRetina:function(){if(window.devicePixelRatio>1){var e=t.st.retina,n=e.ratio;n=isNaN(n)?n():n,n>1&&(x("ImageHasSize."+U,function(e,t){t.img.css({"max-width":t.img[0].naturalWidth/n,width:"100%"})}),x("ElementParse."+U,function(t,i){i.src=e.replaceSrc(i,n)}))}}}}),function(){var t=1e3,n="ontouchstart"in window,i=function(){I.off("touchmove"+r+" touchend"+r)},o="mfpFastClick",r="."+o;e.fn.mfpFastClick=function(o){return e(this).each(function(){var a,s=e(this);if(n){var l,c,d,u,p,f;s.on("touchstart"+r,function(e){u=!1,f=1,p=e.originalEvent?e.originalEvent.touches[0]:e.touches[0],c=p.clientX,d=p.clientY,I.on("touchmove"+r,function(e){p=e.originalEvent?e.originalEvent.touches:e.touches,f=p.length,p=p[0],(Math.abs(p.clientX-c)>10||Math.abs(p.clientY-d)>10)&&(u=!0,i())}).on("touchend"+r,function(e){i(),u||f>1||(a=!0,e.preventDefault(),clearTimeout(l),l=setTimeout(function(){a=!1},t),o())})})}s.on("click"+r,function(){a||o()})})},e.fn.destroyMfpFastClick=function(){e(this).off("touchstart"+r+" click"+r),n&&I.off("touchmove"+r+" touchend"+r)}}(),_()})(window.jQuery||window.Zepto); \ No newline at end of file diff --git a/public/ng/js/min/gogs-min.js b/public/ng/js/min/gogs-min.js index 1a805b5f08..d27e0a8b33 100644 --- a/public/ng/js/min/gogs-min.js +++ b/public/ng/js/min/gogs-min.js @@ -1,5 +1,5 @@ -function Tabs(e){function t(e){console.log("hide",e),e.removeClass("js-tab-nav-show"),$(e.data("tab-target")).removeClass("js-tab-show").hide()}function n(e){console.log("show",e),e.addClass("js-tab-nav-show"),$(e.data("tab-target")).addClass("js-tab-show").show()}var r=$(e);if(r.length){var i=r.find(".js-tab-nav-show");i.length&&$(i.data("tab-target")).addClass("js-tab-show"),r.on("click",".js-tab-nav",function(e){e.preventDefault();var o=$(this);o.hasClass("js-tab-nav-show")||(i=r.find(".js-tab-nav-show").eq(0),t(i),n(o))}),console.log("init tabs @",e)}}function Preview(e,t){function n(e){return e.find(".js-preview-input").eq(0)}function r(e){return e.hasClass("js-preview-container")?e:e.find(".js-preview-container").eq(0)}var i=$(e),o=$(t),a=n(o);if(!a.length)return void console.log("[preview]: no preview input");var s=r(o);return s.length?(i.on("click",function(){$.post("/api/v1/markdown",{text:a.val()},function(e){s.html(e)})}),void console.log("[preview]: init preview @",e,"&",t)):void console.log("[preview]: no preview container")}function initCore(){Gogs.renderMarkdown(),Gogs.renderCodeView(),$(".js-tab-nav").click(function(e){$(this).hasClass("js-tab-nav-show")||($(this).parent().find(".js-tab-nav-show").each(function(){$(this).removeClass("js-tab-nav-show"),$($(this).data("tab-target")).hide()}),$(this).addClass("js-tab-nav-show"),$($(this).data("tab-target")).show()),e.preventDefault()})}function initUserSetting(){$("#user-profile-form").submit(function(e){var t=$("#username");return t.data("uname")==t.val()||confirm("Username has been changed, do you want to continue?")?void 0:(e.preventDefault(),!0)}),$("#ssh-add").click(function(){$("#user-ssh-add-form").removeClass("hide")}),$("#delete-account-button").click(function(e){return confirm("This account is going to be deleted, do you want to continue?")?void 0:(e.preventDefault(),!0)})}function initRepoCreate(){$("#repo-create-owner-list").on("click","li",function(){if(!$(this).hasClass("checked")){var e=$(this).data("uid");$("#repo-owner-id").val(e),$("#repo-owner-avatar").attr("src",$(this).find("img").attr("src")),$("#repo-owner-name").text($(this).text().trim()),$(this).parent().find(".checked").removeClass("checked"),$(this).addClass("checked"),console.log("set repo owner to uid :",e,$(this).text().trim())}}),$("#auth-button").click(function(e){$("#repo-migrate-auth").slideToggle("fast"),e.preventDefault()}),console.log("initRepoCreate")}function initRepo(){$("#repo-clone-ssh").click(function(){$(this).removeClass("btn-gray").addClass("btn-blue"),$("#repo-clone-https").removeClass("btn-blue").addClass("btn-gray"),$("#repo-clone-url").val($(this).data("link")),$(".clone-url").text($(this).data("link"))}),$("#repo-clone-https").click(function(){$(this).removeClass("btn-gray").addClass("btn-blue"),$("#repo-clone-ssh").removeClass("btn-blue").addClass("btn-gray"),$("#repo-clone-url").val($(this).data("link")),$(".clone-url").text($(this).data("link"))});var e=$("#repo-clone-copy");e.hover(function(){Gogs.bindCopy($(this))}),e.tipsy({fade:!0})}function initHookTypeChange(){$("select#hook-type").on("change",function(){hookTypes=["Gogs","Slack"];var e=$(this).val();hookTypes.forEach(function(t){e===t?$("div#"+t.toLowerCase()).toggleShow():$("div#"+t.toLowerCase()).toggleHide()})})}function initRepoSetting(){$("#repo-setting-form").submit(function(e){var t=$("#repo_name");return t.data("repo-name")==t.val()||confirm("Repository name has been changed, do you want to continue?")?void 0:(e.preventDefault(),!0)}),initHookTypeChange(),$("#transfer-button").click(function(){$("#transfer-form").show()}),$("#delete-button").click(function(){$("#delete-form").show()}),$("#repo-collab-list hr:last-child").remove();var e=$("#repo-collaborator").next().next().find("ul");$("#repo-collaborator").on("keyup",function(){var t=$(this);return t.val()?void Gogs.searchUsers(t.val(),e):void e.toggleHide()}).on("focus",function(){$(this).val()?e.toggleShow():e.toggleHide()}).next().next().find("ul").on("click","li",function(){$("#repo-collaborator").val($(this).text()),e.toggleHide()})}function initOrgSetting(){$("#org-setting-form").submit(function(e){var t=$("#orgname");return t.data("orgname")==t.val()||confirm("Organization name has been changed, do you want to continue?")?void 0:(e.preventDefault(),!0)}),$("#delete-org-button").click(function(e){return confirm("This organization is going to be deleted, do you want to continue?")?void 0:(e.preventDefault(),!0)}),initHookTypeChange()}function initInvite(){var e=$("#org-member-invite-list");$("#org-member-invite").on("keyup",function(){var t=$(this);return t.val()?void Gogs.searchUsers(t.val(),e):void e.toggleHide()}).on("focus",function(){$(this).val()?e.toggleShow():e.toggleHide()}).next().next().find("ul").on("click","li",function(){$("#org-member-invite").val($(this).text()),e.toggleHide()})}function initOrgTeamCreate(){$("#org-team-delete").click(function(e){if(!confirm("This team is going to be deleted, do you want to continue?"))return e.preventDefault(),!0;var t=$("#team-create-form");t.attr("action",t.data("delete-url"))})}function initTeamMembersList(){var e=$("#org-team-members-list");$("#org-team-members-add").on("keyup",function(){var t=$(this);return t.val()?void Gogs.searchUsers(t.val(),e):void e.toggleHide()}).on("focus",function(){$(this).val()?e.toggleShow():e.toggleHide()}).next().next().find("ul").on("click","li",function(){$("#org-team-members-add").val($(this).text()),e.toggleHide()})}function initTeamRepositoriesList(){var e=$("#org-team-repositories-list");$("#org-team-repositories-add").on("keyup",function(){var t=$(this);return t.val()?void Gogs.searchRepos(t.val(),e,"uid="+t.data("uid")):void e.toggleHide()}).on("focus",function(){$(this).val()?e.toggleShow():e.toggleHide()}).next().next().find("ul").on("click","li",function(){$("#org-team-repositories-add").val($(this).text()),e.toggleHide()})}function initAdmin(){$("#login-type").on("change",function(){var e=$(this).val();e.indexOf("0-")+1?($(".auth-name").toggleHide(),$(".pwd").find("input").attr("required","required").end().toggleShow()):($(".pwd").find("input").removeAttr("required").end().toggleHide(),$(".auth-name").toggleShow())}),$("#user-delete").click(function(e){if(!confirm("This account is going to be deleted, do you want to continue?"))return e.preventDefault(),!0;var t=$("#user-profile-form");t.attr("action",t.data("delete-url"))}),$("#auth-type").on("change",function(){var e=$(this).val();2==e&&($(".ldap").toggleShow(),$(".smtp").toggleHide()),3==e&&($(".smtp").toggleShow(),$(".ldap").toggleHide())}),$("#auth-delete").click(function(e){if(!confirm("This authorization is going to be deleted, do you want to continue?"))return e.preventDefault(),!0;var t=$("auth-setting-form");t.attr("action",t.data("delete-url"))})}function initInstall(){!function(){var e="127.0.0.1:3306",t="127.0.0.1:5432";$("#install-database").on("change",function(){var n=$(this).val();"SQLite3"!=n?($(".server-sql").show(),$(".sqlite-setting").addClass("hide"),"PostgreSQL"==n?($(".pgsql-setting").removeClass("hide"),$("#database-host").val()==e&&$("#database-host").val(t)):"MySQL"==n?($(".pgsql-setting").addClass("hide"),$("#database-host").val()==t&&$("#database-host").val(e)):$(".pgsql-setting").addClass("hide")):($(".server-sql").hide(),$(".pgsql-setting").hide(),$(".sqlite-setting").removeClass("hide"))})}()}function initProfile(){$("#profile-avatar").tipsy({fade:!0})}function homepage(){$("#promo-form").submit(function(e){return""===$("#username").val()?(e.preventDefault(),window.location.href=Gogs.AppSubUrl+"/user/login",!0):void 0}),$("#register-button").click(function(e){return""===$("#username").val()?(e.preventDefault(),window.location.href=Gogs.AppSubUrl+"/user/sign_up",!0):void $("#promo-form").attr("action",Gogs.AppSubUrl+"/user/sign_up")})}!function(e,t){"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(e,t){function n(e){var t=e.length,n=ot.type(e);return"function"===n||ot.isWindow(e)?!1:1===e.nodeType&&t?!0:"array"===n||0===t||"number"==typeof t&&t>0&&t-1 in e}function r(e,t,n){if(ot.isFunction(t))return ot.grep(e,function(e,r){return!!t.call(e,r,e)!==n});if(t.nodeType)return ot.grep(e,function(e){return e===t!==n});if("string"==typeof t){if(pt.test(t))return ot.filter(t,e,n);t=ot.filter(t,e)}return ot.grep(e,function(e){return ot.inArray(e,t)>=0!==n})}function i(e,t){do e=e[t];while(e&&1!==e.nodeType);return e}function o(e){var t=wt[e]={};return ot.each(e.match(xt)||[],function(e,n){t[n]=!0}),t}function a(){mt.addEventListener?(mt.removeEventListener("DOMContentLoaded",s,!1),e.removeEventListener("load",s,!1)):(mt.detachEvent("onreadystatechange",s),e.detachEvent("onload",s))}function s(){(mt.addEventListener||"load"===event.type||"complete"===mt.readyState)&&(a(),ot.ready())}function l(e,t,n){if(void 0===n&&1===e.nodeType){var r="data-"+t.replace(Et,"-$1").toLowerCase();if(n=e.getAttribute(r),"string"==typeof n){try{n="true"===n?!0:"false"===n?!1:"null"===n?null:+n+""===n?+n:kt.test(n)?ot.parseJSON(n):n}catch(i){}ot.data(e,t,n)}else n=void 0}return n}function u(e){var t;for(t in e)if(("data"!==t||!ot.isEmptyObject(e[t]))&&"toJSON"!==t)return!1;return!0}function c(e,t,n,r){if(ot.acceptData(e)){var i,o,a=ot.expando,s=e.nodeType,l=s?ot.cache:e,u=s?e[a]:e[a]&&a;if(u&&l[u]&&(r||l[u].data)||void 0!==n||"string"!=typeof t)return u||(u=s?e[a]=V.pop()||ot.guid++:a),l[u]||(l[u]=s?{}:{toJSON:ot.noop}),("object"==typeof t||"function"==typeof t)&&(r?l[u]=ot.extend(l[u],t):l[u].data=ot.extend(l[u].data,t)),o=l[u],r||(o.data||(o.data={}),o=o.data),void 0!==n&&(o[ot.camelCase(t)]=n),"string"==typeof t?(i=o[t],null==i&&(i=o[ot.camelCase(t)])):i=o,i}}function d(e,t,n){if(ot.acceptData(e)){var r,i,o=e.nodeType,a=o?ot.cache:e,s=o?e[ot.expando]:ot.expando;if(a[s]){if(t&&(r=n?a[s]:a[s].data)){ot.isArray(t)?t=t.concat(ot.map(t,ot.camelCase)):t in r?t=[t]:(t=ot.camelCase(t),t=t in r?[t]:t.split(" ")),i=t.length;for(;i--;)delete r[t[i]];if(n?!u(r):!ot.isEmptyObject(r))return}(n||(delete a[s].data,u(a[s])))&&(o?ot.cleanData([e],!0):rt.deleteExpando||a!=a.window?delete a[s]:a[s]=null)}}}function f(){return!0}function p(){return!1}function h(){try{return mt.activeElement}catch(e){}}function m(e){var t=Pt.split("|"),n=e.createDocumentFragment();if(n.createElement)for(;t.length;)n.createElement(t.pop());return n}function g(e,t){var n,r,i=0,o=typeof e.getElementsByTagName!==St?e.getElementsByTagName(t||"*"):typeof e.querySelectorAll!==St?e.querySelectorAll(t||"*"):void 0;if(!o)for(o=[],n=e.childNodes||e;null!=(r=n[i]);i++)!t||ot.nodeName(r,t)?o.push(r):ot.merge(o,g(r,t));return void 0===t||t&&ot.nodeName(e,t)?ot.merge([e],o):o}function v(e){jt.test(e.type)&&(e.defaultChecked=e.checked)}function y(e,t){return ot.nodeName(e,"table")&&ot.nodeName(11!==t.nodeType?t:t.firstChild,"tr")?e.getElementsByTagName("tbody")[0]||e.appendChild(e.ownerDocument.createElement("tbody")):e}function b(e){return e.type=(null!==ot.find.attr(e,"type"))+"/"+e.type,e}function x(e){var t=Zt.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function w(e,t){for(var n,r=0;null!=(n=e[r]);r++)ot._data(n,"globalEval",!t||ot._data(t[r],"globalEval"))}function C(e,t){if(1===t.nodeType&&ot.hasData(e)){var n,r,i,o=ot._data(e),a=ot._data(t,o),s=o.events;if(s){delete a.handle,a.events={};for(n in s)for(r=0,i=s[n].length;i>r;r++)ot.event.add(t,n,s[n][r])}a.data&&(a.data=ot.extend({},a.data))}}function S(e,t){var n,r,i;if(1===t.nodeType){if(n=t.nodeName.toLowerCase(),!rt.noCloneEvent&&t[ot.expando]){i=ot._data(t);for(r in i.events)ot.removeEvent(t,r,i.handle);t.removeAttribute(ot.expando)}"script"===n&&t.text!==e.text?(b(t).text=e.text,x(t)):"object"===n?(t.parentNode&&(t.outerHTML=e.outerHTML),rt.html5Clone&&e.innerHTML&&!ot.trim(t.innerHTML)&&(t.innerHTML=e.innerHTML)):"input"===n&&jt.test(e.type)?(t.defaultChecked=t.checked=e.checked,t.value!==e.value&&(t.value=e.value)):"option"===n?t.defaultSelected=t.selected=e.defaultSelected:("input"===n||"textarea"===n)&&(t.defaultValue=e.defaultValue)}}function T(t,n){var r,i=ot(n.createElement(t)).appendTo(n.body),o=e.getDefaultComputedStyle&&(r=e.getDefaultComputedStyle(i[0]))?r.display:ot.css(i[0],"display");return i.detach(),o}function k(e){var t=mt,n=Jt[e];return n||(n=T(e,t),"none"!==n&&n||(Kt=(Kt||ot("