diff --git a/app/assets/images/euler_main.jpg b/app/assets/images/euler_main.jpg new file mode 100644 index 0000000..b7c669d Binary files /dev/null and b/app/assets/images/euler_main.jpg differ diff --git a/app/assets/javascripts/about.coffee b/app/assets/javascripts/about.coffee new file mode 100644 index 0000000..24f83d1 --- /dev/null +++ b/app/assets/javascripts/about.coffee @@ -0,0 +1,3 @@ +# Place all the behaviors and hooks related to the matching controller here. +# All this logic will automatically be available in application.js. +# You can use CoffeeScript in this file: http://coffeescript.org/ diff --git a/app/assets/stylesheets/about.scss b/app/assets/stylesheets/about.scss new file mode 100644 index 0000000..3ff4b57 --- /dev/null +++ b/app/assets/stylesheets/about.scss @@ -0,0 +1,3 @@ +// Place all the styles related to the About controller here. +// They will automatically be included in application.css. +// You can use Sass (SCSS) here: http://sass-lang.com/ diff --git a/app/assets/stylesheets/application.css.scss b/app/assets/stylesheets/application.css.scss index d086c64..921ab7d 100644 --- a/app/assets/stylesheets/application.css.scss +++ b/app/assets/stylesheets/application.css.scss @@ -21,4 +21,128 @@ .turbolinks-progress-bar { background-color: $brand-primary; +} +/* Sticky footer styles +-------------------------------------------------- */ +html { + position: relative; + min-height: 100%; +} +body { + /* Margin bottom by footer height */ + margin-bottom: 60px; +} +.footer { + position: absolute; + bottom: 0; + width: 100%; + /* Set the fixed height of the footer here */ + height: 40px; + background-color: #f5f5f5; +} + +.container .text-muted { + margin: 10px 0; +} + +/* Custom css for fixing styles within problem content */ + +.problem-content blockquote { + margin: 0px; + font-size: 14px; + border-left: medium none; +} + +.problem-content div { + margin: 0px 0px 10px; +} + +.problem-content table { + border-collapse: separate; + border-spacing: 2px; +} + +.problem-content td { + padding: 1px; +} + +/* Side notes for calling out things +-------------------------------------------------- */ + +/* Base styles (regardless of theme) */ +.bs-callout, .problem-content > .info:first-child, .problem-content > .info:last-child{ + margin: 20px 0; + padding: 15px 30px 15px 15px; + border-left: 5px solid #eee; +} +.bs-callout h1, +.bs-callout h2, +.bs-callout h3, +.bs-callout h4, +.bs-callout h5, +.bs-callout h6 { + margin-top: 0; +} + +.bs-callout-danger h1, +.bs-callout-danger h2, +.bs-callout-danger h3, +.bs-callout-danger h4, +.bs-callout-danger h5, +.bs-callout-danger h6 { + color: #B94A48; +} + +.bs-callout-warning h1, +.bs-callout-warning h2, +.bs-callout-warning h3, +.bs-callout-warning h4, +.bs-callout-warning h5, +.bs-callout-warning h6 { + color: #C09853; +} + +.bs-callout-info h1, +.bs-callout-info h2, +.bs-callout-info h3, +.bs-callout-info h4, +.bs-callout-info h5, +.bs-callout-info h6 { + color: #3A87AD; +} + +.bs-callout-success h1, +.bs-callout-success h2, +.bs-callout-success h3, +.bs-callout-success h4, +.bs-callout-success h5, +.bs-callout-success h6 { + color: #3C763D; +} + +.bs-callout p:last-child { + margin-bottom: 0; +} + +.bs-callout code, +.bs-callout .highlight { + background-color: #fff; +} + +/* Themes for different contexts */ +.bs-callout-danger { + background-color: #fcf2f2; + border-color: #dFb5b4; +} +.bs-callout-warning { + background-color: #fefbed; + border-color: #f1e7bc; +} +.bs-callout-info, .problem-content > .info:first-child, .problem-content > .info:last-child { + background-color: #f0f7fd; + border-color: #d0e3f0; +} +.bs-callout-success { + background-color: #dff0d8; + border-color: #d6e9c6; } \ No newline at end of file diff --git a/app/controllers/about_controller.rb b/app/controllers/about_controller.rb new file mode 100644 index 0000000..db5d6bc --- /dev/null +++ b/app/controllers/about_controller.rb @@ -0,0 +1,16 @@ +class AboutController < ApplicationController + def index + end + + def info + end + + def copyright + end + + def legal + end + + def roman_numerals + end +end diff --git a/app/controllers/problems_controller.rb b/app/controllers/problems_controller.rb index 668e83b..f8b17dd 100644 --- a/app/controllers/problems_controller.rb +++ b/app/controllers/problems_controller.rb @@ -3,6 +3,7 @@ class ProblemsController < ApplicationController def index @problems = Problem.paginate(page: params[:page]).includes(:translation) + @translated_percentage = 100 * Problem.translated_count / Problem.count end def show diff --git a/app/helpers/about_helper.rb b/app/helpers/about_helper.rb new file mode 100644 index 0000000..68e69ae --- /dev/null +++ b/app/helpers/about_helper.rb @@ -0,0 +1,2 @@ +module AboutHelper +end diff --git a/app/models/problem.rb b/app/models/problem.rb index d2d140d..a6ba173 100644 --- a/app/models/problem.rb +++ b/app/models/problem.rb @@ -11,11 +11,14 @@ class Problem < ApplicationRecord !!self.translation end - def original_url "https://projecteuler.net/problem=#{self.id}" end + def self.translated_count + Problem.count(:translation_id) + end + def self.update_count(new_count) old_count = Problem.count raise ArgumentError, "new count has to be larger than old count" if new_count < old_count diff --git a/app/views/about/copyright.de.html.erb b/app/views/about/copyright.de.html.erb new file mode 100644 index 0000000..97690a3 --- /dev/null +++ b/app/views/about/copyright.de.html.erb @@ -0,0 +1,30 @@ +<% provide(:title, 'Copyright') %> + + +
Dieser Artikel dient gleichzeitig der Übersetzung der "Copyright Information" auf projecteuler.net sowie der tatsächlich geltenden Copyright-Informationen für diese Seite.
+

Kann ich die Probleme woanders benutzen?

+

Ja! Es ist nicht nur erlaubt, sondern beherzt, das Material zu teilen und frei zu benutzen - für nichtkommerzielle Zwecke. Aber bitte lesen Sie weiter...
+
+ Alle Probleme wurden von einer Vielzahl von Quellen gesammelt: Einige basieren auf interessanten Teilergebnissen von größeren mathematischen Theoremen, andere sind Variationen von klassischen Problemen, der Rest gilt als originell. Die Hauptmission von Project Euler ist es, hochqualitative Probleme zur Verfügung zu stellen, und zwar um sowohl zum Lernen zu motivieren als auch um in einem angenehmen Kontext herauszufordern. + Ebenso ist es die Mission von projekteuler.de, diese Probleme in der deutschen Sprache frei zur Verfügung zu stellen und sie so einem noch breiteren Publikum zu präsentieren. +

+

Gibt es Einschränkungen?

+

+ Viel Aufwand und Gedanken wurden in das Design jedes Problems gesteckt, und in diesem Sinne sind alle Materialien neu und orginell. Daher dürfen die Probleme nicht für kommerzielle Zwecke benutzt werden. Dies gilt sowohl für die Original-Probleme auf projecteuler.net als auch die Übersetzungen auf projekteuler.de. +

+

Muss ich Attribution (Namensnennung) zeigen?

+

+ Dieses Problem ist eher eine Sache der Höflichkeit. Es steht Ihnen komplett frei, das Material zu benutzen, wie es ist, oder es zu adaptieren. Wenn Sie sich entscheiden, den Inhalt so zu übernehmen, wie er auf der Webseite ist, könnten Sie etwas schreiben wie "Das folgende Problem stammt von Project Euler / projekteuler.de". Wenn Sie sich entscheiden, das Problem zu verändern, könnten Sie etwas schreiben wie "Das folgende Problem wurde inspiriert von Problem xxx auf Project Euler / projekteuler.de". +

+

Gibt es einen Weg, direkt zu einem bestimmten Problem zu verlinken?

+

Sie können zum Problem xxx mit der folgenden URI auf projecteuler.net verlinken:

+
https://projecteuler.net/problem=xxx
+

Ebenso können Sie zu der entsprechenden Übersetzung mit folgender URI verlinken:

+
http://projekteuler.de/problems/xxx
+

Kann ich genauere Informationen zum Copyright erhalten?

+

Der Inhalt von projecteuler.net ist lizenziert unter einer Creative Commons Lizenz:
+ Attribution-NonCommercial-ShareAlike 2.0 UK: England & Wales.

+

Sie können entweder die Creative Commons Deed (Zusammenfassung) oder den Legal Code (Komplette Lizenz) lesen.

+

Der Inhalt dieser Seite (projekteuler.de) ist unter einer neueren Version derselben Creative Commons Lizenz lizenziert:
+ Attribution-NonCommercial-ShareAlike 4.0 International.

+

Auch hier können Sie entweder die Creative Commons Deed (Zusammenfassung) oder den Legal Code (Komplette Lizenz) lesen.

diff --git a/app/views/about/index.de.html.erb b/app/views/about/index.de.html.erb new file mode 100644 index 0000000..6dd18b4 --- /dev/null +++ b/app/views/about/index.de.html.erb @@ -0,0 +1,35 @@ +
+
+

Willkommen auf Projekt Euler!

+

Diese Seite ist eine Übersetzung der englischen Rätsel-Webseite projecteuler.net.

+

+ <%= link_to about_info_path, class: 'btn btn-primary btn-lg' do %> + Mehr erfahren » + <% end %> +

+
+ +
+ +
+
+

Ansehen

+

Bisher wurden leider erst <%= Problem.translated_count %> der <%= Problem.count %> Probleme übersetzt, es gibt also noch einiges zu tun!

+

+ <%= link_to problems_path, class: 'btn btn-default' do %> + Zu den Problemen » + <% end %> +

+
+
+

Erweitern

+

Sie haben in Zukunft auch die Möglichkeit, eigene Übersetzungen vorzuschlagen. An diesem Feature wird aber zurzeit noch gearbeitet.

+

Übersetzung vorschlagen »

+
+
+

Verbessern

+

Haben Sie Verbesserungsvorschläge für eine der Übersetzungen? Fehlt Ihnen eine Funktion auf der Webseite, oder ist Ihnen ein Fehler aufgefallen? Dann schreiben Sie uns!

+

Zum Kontaktformular »

+
+
+
\ No newline at end of file diff --git a/app/views/about/info.de.html.erb b/app/views/about/info.de.html.erb new file mode 100644 index 0000000..275d50e --- /dev/null +++ b/app/views/about/info.de.html.erb @@ -0,0 +1,21 @@ +<% provide(:title, 'Über Project Euler') %> + + +

Was ist Project Euler?

+<%= image_tag 'euler_main.jpg', alt: 'Leonhard Euler (1707-1783)', width: '150px', style: 'border:1px solid black;margin:10px;float:right' %> +

Project Euler ist eine Serie von herausfordernden mathematischen bzw. Programmier-Problemen, die mehr als nur mathematische Einblicke zum Lösen erfordern. Obwohl die Mathematik Ihnen helfen wird, auf elegante und effiziente Lösungswege zu kommen, ist der Gebrauch von Computer- und Programmierkenntnissen nötig, um den Großteil der Probleme zu lösen.

Die Motivation für das Starten und die Instandhaltung von Project Euler ist die, dem Forschergeist eine Plattform bereitzustellen, die sich mit unbekannten Gebieten befasst, und neue Konzepte in einem spaßigen und freizeitlichen Kontext zu erlernen.

+ +

Für welche Zielgruppe sind die Probleme?

+

Die beabsichtigte Zielgruppe enthält Studenten, deren normaler Lehrplan ihr Verlangen nach Lernen nicht stillt, Erwachsene, deren Hauptinteresse zwar nicht die Mathematik selbst, aber mathematische Dinge waren, und Profis, die ihre Fähigkeiten im Problemlösen und der Mathematik auf dem Laufenden halten wollen.

+ +

Kann jeder die Probleme lösen?

+

Die Probleme variieren in ihrer Schwierigkeit, und viele werden die Erfahrung des induktiven Kettenlernens machen. Das heißt, ein gelöstes Problem zeigt Ihnen ein neues Konzept, das Ihnen das Lösen eines bisher nicht lösbaren Problems bringt. Somit wird sich der entschlossene Teilnehmer langsam, aber sicher durch jedes Problem arbeiten.

+ +

Was jetzt?

+

Um Ihren Fortschritt zu verfolgen, ist es nötig, einen Account zu erstellen und Cookies zu aktivieren. Wenn Sie bereits einen Account auf projecteuler.net haben, dann können Sie sich einloggen, ansonsten registrieren Sie sich bitte - es ist komplett kostenfrei! +

+

Aber wenn die Probleme nach einer Herausforderung klingen, dann können Sie sich die <%= link_to 'Probleme', problems_path %> ansehen, bevor Sie sich registrieren. +

+

"Project Euler existiert zum Begeistern, Herausfordern und Entwickeln der Fähigkeiten und des Genusses von jedem mit einem Interesse für die faszinierende Welt der Mathematik."

\ No newline at end of file diff --git a/app/views/about/legal.de.html.erb b/app/views/about/legal.de.html.erb new file mode 100644 index 0000000..0acb857 --- /dev/null +++ b/app/views/about/legal.de.html.erb @@ -0,0 +1,13 @@ +<% provide(:title, 'Impressum') %> + + +

Angaben gemäß § 5 TMG:

+

Philipp Fischbeck
+ Großbeerenstraße 48
+ 14482 Potsdam
+

+

Kontakt:

+

E-Mail: projekteuler@gmail.com

+

Haftungsausschluss:

+

Haftung für Inhalte

Die Inhalte unserer Seiten wurden mit größter Sorgfalt erstellt. Für die Richtigkeit, Vollständigkeit und Aktualität der Inhalte können wir jedoch keine Gewähr übernehmen. Als Diensteanbieter sind wir gemäß § 7 Abs.1 TMG für eigene Inhalte auf diesen Seiten nach den allgemeinen Gesetzen verantwortlich. Nach §§ 8 bis 10 TMG sind wir als Diensteanbieter jedoch nicht verpflichtet, übermittelte oder gespeicherte fremde Informationen zu überwachen oder nach Umständen zu forschen, die auf eine rechtswidrige Tätigkeit hinweisen. Verpflichtungen zur Entfernung oder Sperrung der Nutzung von Informationen nach den allgemeinen Gesetzen bleiben hiervon unberührt. Eine diesbezügliche Haftung ist jedoch erst ab dem Zeitpunkt der Kenntnis einer konkreten Rechtsverletzung möglich. Bei Bekanntwerden von entsprechenden Rechtsverletzungen werden wir diese Inhalte umgehend entfernen.

Haftung für Links

Unser Angebot enthält Links zu externen Webseiten Dritter, auf deren Inhalte wir keinen Einfluss haben. Deshalb können wir für diese fremden Inhalte auch keine Gewähr übernehmen. Für die Inhalte der verlinkten Seiten ist stets der jeweilige Anbieter oder Betreiber der Seiten verantwortlich. Die verlinkten Seiten wurden zum Zeitpunkt der Verlinkung auf mögliche Rechtsverstöße überprüft. Rechtswidrige Inhalte waren zum Zeitpunkt der Verlinkung nicht erkennbar. Eine permanente inhaltliche Kontrolle der verlinkten Seiten ist jedoch ohne konkrete Anhaltspunkte einer Rechtsverletzung nicht zumutbar. Bei Bekanntwerden von Rechtsverletzungen werden wir derartige Links umgehend entfernen.

Urheberrecht

Die durch die Seitenbetreiber erstellten Inhalte und Werke auf diesen Seiten unterliegen dem deutschen Urheberrecht. Die Vervielfältigung, Bearbeitung, Verbreitung und jede Art der Verwertung außerhalb der Grenzen des Urheberrechtes bedürfen der schriftlichen Zustimmung des jeweiligen Autors bzw. Erstellers. Downloads und Kopien dieser Seite sind nur für den privaten, nicht kommerziellen Gebrauch gestattet. Soweit die Inhalte auf dieser Seite nicht vom Betreiber erstellt wurden, werden die Urheberrechte Dritter beachtet. Insbesondere werden Inhalte Dritter als solche gekennzeichnet. Sollten Sie trotzdem auf eine Urheberrechtsverletzung aufmerksam werden, bitten wir um einen entsprechenden Hinweis. Bei Bekanntwerden von Rechtsverletzungen werden wir derartige Inhalte umgehend entfernen.

Datenschutz

Die Nutzung unserer Webseite ist in der Regel ohne Angabe personenbezogener Daten möglich. Soweit auf unseren Seiten personenbezogene Daten (beispielsweise Name, Anschrift oder eMail-Adressen) erhoben werden, erfolgt dies, soweit möglich, stets auf freiwilliger Basis. Diese Daten werden ohne Ihre ausdrückliche Zustimmung nicht an Dritte weitergegeben.

Wir weisen darauf hin, dass die Datenübertragung im Internet (z.B. bei der Kommunikation per E-Mail) Sicherheitslücken aufweisen kann. Ein lückenloser Schutz der Daten vor dem Zugriff durch Dritte ist nicht möglich.

Der Nutzung von im Rahmen der Impressumspflicht veröffentlichten Kontaktdaten durch Dritte zur Übersendung von nicht ausdrücklich angeforderter Werbung und Informationsmaterialien wird hiermit ausdrücklich widersprochen. Die Betreiber der Seiten behalten sich ausdrücklich rechtliche Schritte im Falle der unverlangten Zusendung von Werbeinformationen, etwa durch Spam-Mails, vor.

+

Quellverweis: eRecht24 Disclaimer

\ No newline at end of file diff --git a/app/views/about/roman_numerals.de.html.erb b/app/views/about/roman_numerals.de.html.erb new file mode 100644 index 0000000..8b49734 --- /dev/null +++ b/app/views/about/roman_numerals.de.html.erb @@ -0,0 +1,31 @@ +<%= provide(:title, 'Über römische Zahlen') %> + + +

Wie liest und schreibt man römische Zahlen?

+
+ +

Traditionelle römische Zahlen bestehen aus den folgenden Werten:

+

I = 1
+ V = 5
+ X = 10
+ L = 50
+ C = 100
+ D = 500
+ M = 1000

+

Sie werden von vielen verschiedenen Regeln in Bezug auf die römischen Zahlen lesen, aber die Wahrheit ist, dass die Römer nur eine einfache Regel hatten:

+

Zeichen müssen in absteigender Größen-Reihenfolge angeordnet sein.

+

Beispiel: Drei Wege, wie sechzehn geschrieben werden könnte, sind XVI, XIIIIII, VVVI; dabei ist die erste Variante die bevorzugte Form, da sie die wenigesten Zeichen benutzt.

+

Die "Absteigende Größe"-Regel wurde eingeführt, um die Benutzung von subtraktiven Kombinationen zu erlauben. Beispiel: vier kann als IV geschrieben werden, denn es ist eins vor fünf. Da die Regel erfordert, dass die Zeichen in der Größen-Reihenfolge angeordnet sind, sollte es dem Leser klar sein, dass das Vorkommen eines kleineren Zeichens, sozusagen fehl am Platz, eindeutig da ist, um vom folgenden Zeichen abgezogen zu werden. Beispiel: neunzehn könnte geschrieben werden als XIX = X + IX (9). Beachten Sie auch, wie die Regel erfordert, dass X (zehn) vor IX (neun) platziert werden muss, und dass IXX keine gültige Konfiguration wäre.

+

Allgemein haben die Römer versucht, so wenig Zeichen wie möglich zu benutzen, um Zahlen anzuzeigen. Aus diesem Grund wäre XIX die bevorzugte Form von neunzehn im Vergleich zu anderen gültigen Kombinationen wie XVIIII oder XVIV. Jedoch war es KEINE Regel, und es gibt in Rom immer noch viele Beispiele, wo die Einsparung der Zeichen nicht benutzt wurde. Beispiel: im berühmten Kolosseum sind die Zeichen über dem neunundvierzigsten Eingang geschrieben als XXXXVIIII, und nicht IL oder XLIX (siehe Regeln unten).

+

Trotzdem haben wir über die Zeit neue, einschränkende Regeln eingeführt. Bis zum Mittelalter war es üblich geworden, mehr als drei aufeinanderfolgende identische Zeichen zu benutzen. Das heißt, IV wurde geschrieben anstatt von IIII, IX anstatt von VIIII und so weiter. Außerdem wurden den subtraktiven Kombinationen folgende Regeln auferlegt:

+
    +
  1. Nur I, X und C können als führendes Zeichen im Teil eines subtraktiven Paars benutzt werden.
  2. +
  3. I kann nur vor V und X stehen.
  4. +
  5. X kann nur vor L und C stehen.
  6. +
  7. C kann nur vor D und M stehen.
  8. +
+

Diese letzten vier Regeln gelten als Gesetz, und allgemein ist es bevorzugt, aber nicht notwendig, Zahlen unter Benutzung der minimalen Anzahl von Zeichen darzustellen. Das bedeutet, dass IL als ungültige Weise gilt, neunundvierzig zu schreiben, und wobei XXXXVIIII, XXXXIX, XLVIIII und XLIX alle zulässig sind, ist das letzt die bevorzugte (minimale) Form.

+

Es wird also erwartet, die höheren Werte zu benutzen, wann immer es möglich ist; Beispiel: L sollte benutzt werden statt XXXX, oder C sollte benutzt werden statt LL. Jedoch wurde sogar diese "Regel" missachtet: in der Kirche von Sant'Agnese fuori le Mura (Sankt Agnes vor den Mauern), gefunden in Rom, ist das Datum MCCCCCCVI (1606) an der vergoldeten und verwahrten Holzdecke geschrieben; Ich bin sicher, dass viele argumentieren würden, dass es als MDCVI hätte geschrieben werden sollen.

+

Jedoch, wenn man dem Spruch "Wenn in Rom, tu es wie die Römer" folgt, und wir sehen, wie die Römer Zeichen schreiben, dann gibt es uns deutlich mehr Freiheit, als viele zugeben würden.

\ No newline at end of file diff --git a/app/views/layouts/_footer.html.erb b/app/views/layouts/_footer.html.erb new file mode 100644 index 0000000..5ca623b --- /dev/null +++ b/app/views/layouts/_footer.html.erb @@ -0,0 +1,5 @@ + \ No newline at end of file diff --git a/app/views/layouts/_header.html.erb b/app/views/layouts/_header.html.erb new file mode 100644 index 0000000..1c2c49d --- /dev/null +++ b/app/views/layouts/_header.html.erb @@ -0,0 +1,22 @@ +<%= navbar position: :static do %> + <%= vertical do %> + <%= link_to t(:site_title), root_path %> + <% end %> + <%= horizontal do %> + <%= nav class: 'navbar-left' do %> + <%= link_to t('application.info'), about_info_path %> + <%= link_to Problem.model_name.human(count: 2), problems_path %> + <% if admin_signed_in? %> + <%= link_to t('admin.dashboard.index.administration'), :admin %> + <% end %> + <% end %> + <%= nav class: 'navbar-right' do %> + <%= link_to t('application.legal'), about_legal_path %> + <% if admin_signed_in? %> + <%= link_to(t('application.sign_out'), destroy_admin_session_path, method: :delete) %> + <% else %> + <%= link_to(t('application.sign_in'), new_admin_session_path) %> + <% end %> + <% end %> + <% end %> +<% end %> \ No newline at end of file diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index 7a9bcd9..ecb6882 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -20,26 +20,7 @@ <%= csrf_meta_tags %> -<%= navbar position: :static do %> - <%= vertical do %> - <%= link_to t(:site_title), root_path %> - <% end %> - <%= horizontal do %> - <%= nav class: 'navbar-left' do %> - <%= link_to Problem.model_name.human(count: 2), problems_path %> - <% if admin_signed_in? %> - <%= link_to t('admin.dashboard.index.administration'), :admin %> - <% end %> - <% end %> - <%= nav class: 'navbar-right' do %> - <% if admin_signed_in? %> - <%= link_to(t('application.sign_out'), destroy_admin_session_path, method: :delete) %> - <% else %> - <%= link_to(t('application.sign_in'), new_admin_session_path) %> - <% end %> - <% end %> - <% end %> -<% end %> +<%= render 'layouts/header' %>
<%= flash_messages %>
@@ -49,5 +30,6 @@
+<%= render 'layouts/footer' %> diff --git a/app/views/problems/index.html.erb b/app/views/problems/index.html.erb index a33f34d..0250ae8 100644 --- a/app/views/problems/index.html.erb +++ b/app/views/problems/index.html.erb @@ -1,6 +1,9 @@ <% provide(:title, Problem.model_name.human(count: 2)) %> -

<%= Problem.model_name.human(count: 2) %>

+ + +

<%= t('problems.index.translated_count', translated: Problem.translated_count, total: Problem.count) %>

+<%= progress_bar percentage: @translated_percentage, label: true, striped: true %> <%= render 'problem_pagination' %> diff --git a/config/locales/views/application/de.yml b/config/locales/views/application/de.yml index 19bf621..15e1d8b 100644 --- a/config/locales/views/application/de.yml +++ b/config/locales/views/application/de.yml @@ -3,4 +3,8 @@ de: application: sign_in: 'Einloggen' - sign_out: 'Ausloggen' \ No newline at end of file + sign_out: 'Ausloggen' + info: "Info" + legal: "Impressum" + copyright: "Copyright-Informationen" + bootstrap_html: 'Entworfen mit Bootstrap' \ No newline at end of file diff --git a/config/locales/views/problems/de.yml b/config/locales/views/problems/de.yml index a3f4c57..5392c25 100644 --- a/config/locales/views/problems/de.yml +++ b/config/locales/views/problems/de.yml @@ -5,6 +5,7 @@ de: not_yet_translated: Dieses Problem wurde noch nicht übersetzt. index: suggest_translation: Übersetzung vorschlagen + translated_count: "Übersetzte Probleme: %{translated} von %{total}" show: improve_translation: Übersetzung verbessern problem_subtitle: Problem %{id} diff --git a/config/routes.rb b/config/routes.rb index 37f25e9..3cb0d31 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,4 +1,10 @@ Rails.application.routes.draw do + get 'about/index' + get 'about/info' + get 'about/copyright' + get 'about/legal' + get 'about/roman_numerals' + devise_for :admins, skip: :registrations resources :problems, only: [:index, :show] do resources :translations, only: [:new, :create] @@ -16,7 +22,7 @@ Rails.application.routes.draw do # See how all your routes lay out with "rake routes". # You can have the root of your site routed with "root" - root 'problems#index' + root 'about#index' # Example of regular route: # get 'products/:id' => 'catalog#view' diff --git a/test/controllers/about_controller_test.rb b/test/controllers/about_controller_test.rb new file mode 100644 index 0000000..bba912d --- /dev/null +++ b/test/controllers/about_controller_test.rb @@ -0,0 +1,29 @@ +require 'test_helper' + +class AboutControllerTest < ActionDispatch::IntegrationTest + test "should get index" do + get about_index_url + assert_response :success + end + + test "should get info" do + get about_info_url + assert_response :success + end + + test "should get copyright" do + get about_copyright_url + assert_response :success + end + + test "should get legal" do + get about_legal_url + assert_response :success + end + + test "should get roman_numerals" do + get about_roman_numerals_url + assert_response :success + end + +end diff --git a/test/models/problem_test.rb b/test/models/problem_test.rb index 67551ca..b203bed 100644 --- a/test/models/problem_test.rb +++ b/test/models/problem_test.rb @@ -18,12 +18,17 @@ class ProblemTest < ActiveSupport::TestCase assert_equal "https://projecteuler.net/problem=1", problems(:one).original_url end + test "should return correct number of translated problems" do + assert_equal 2, Problem.translated_count + end + test "should allow for problem count updating" do Problem.update_count(10) assert_not Problem.where(id: 0).exists? (1..10).each do |i| assert Problem.where(id: i).exists? end + assert_not Problem.where(id: 11).exists? assert_equal "First title", Problem.find(1).title end @@ -33,5 +38,6 @@ class ProblemTest < ActiveSupport::TestCase Problem.update_count(1) end assert_equal 3, Problem.count() + assert_equal "First title", Problem.find(1).title end end