~jan0sch/smederee

Showing details for patch 01fb5f4da1725c740dfc186f9d7bd5ce2d6661c9.
2022-09-05 (Mon), 7:29 PM - Jens Grassel - 01fb5f4da1725c740dfc186f9d7bd5ce2d6661c9

i18n: Lots of translations and route for public alpha

Summary of changes
1 files added
  • modules/hub/src/main/twirl/de/smederee/hub/views/publicAlpha.scala.html
12 files modified with 154 lines added and 54 lines removed
  • modules/hub/src/main/resources/assets/css/landingpage.css with 24 added and 0 removed lines
  • modules/hub/src/main/resources/assets/css/main.css with 25 added and 0 removed lines
  • modules/hub/src/main/resources/messages_en.properties with 60 added and 11 removed lines
  • modules/hub/src/main/scala/de/smederee/hub/LandingPageRoutes.scala with 12 added and 3 removed lines
  • modules/hub/src/main/twirl/de/smederee/hub/views/index.scala.html with 6 added and 13 removed lines
  • modules/hub/src/main/twirl/de/smederee/hub/views/navbar.scala.html with 2 added and 2 removed lines
  • modules/hub/src/main/twirl/de/smederee/hub/views/showAllRepositories.scala.html with 3 added and 3 removed lines
  • modules/hub/src/main/twirl/de/smederee/hub/views/showRepositories.scala.html with 3 added and 3 removed lines
  • modules/hub/src/main/twirl/de/smederee/hub/views/showRepositoryFiles.scala.html with 4 added and 4 removed lines
  • modules/hub/src/main/twirl/de/smederee/hub/views/showRepositoryHistory.scala.html with 5 added and 5 removed lines
  • modules/hub/src/main/twirl/de/smederee/hub/views/showRepositoryOverview.scala.html with 9 added and 9 removed lines
  • modules/hub/src/main/twirl/de/smederee/hub/views/welcome.scala.html with 1 added and 1 removed lines
diff -rN -u old-smederee/modules/hub/src/main/resources/assets/css/landingpage.css new-smederee/modules/hub/src/main/resources/assets/css/landingpage.css
--- old-smederee/modules/hub/src/main/resources/assets/css/landingpage.css	2025-02-02 11:58:49.725472083 +0000
+++ new-smederee/modules/hub/src/main/resources/assets/css/landingpage.css	2025-02-02 11:58:49.725472083 +0000
@@ -84,6 +84,30 @@
 	font-size: 120%;
   }
 
+  .button-success,
+  .button-error,
+  .button-warning,
+  .button-secondary {
+	color: white;
+	border-radius: 4px;
+	text-shadow: 0 1px 1px rgba(0, 0, 0, 0.2);
+  }
+
+  .button-success {
+	background: rgb(28, 184, 65);
+  }
+
+  .button-error {
+	background: rgb(202, 60, 60);
+  }
+
+  .button-warning {
+	background: rgb(223, 117, 20);
+  }
+
+  .button-secondary {
+	background: rgb(66, 184, 221);
+  }
 
   /*
    * -- MENU STYLES --
diff -rN -u old-smederee/modules/hub/src/main/resources/assets/css/main.css new-smederee/modules/hub/src/main/resources/assets/css/main.css
--- old-smederee/modules/hub/src/main/resources/assets/css/main.css	2025-02-02 11:58:49.725472083 +0000
+++ new-smederee/modules/hub/src/main/resources/assets/css/main.css	2025-02-02 11:58:49.725472083 +0000
@@ -3,6 +3,31 @@
   /*margin-right: 1em;*/
 }
 
+.button-success,
+.button-error,
+.button-warning,
+.button-secondary {
+  color: white;
+  border-radius: 4px;
+  text-shadow: 0 1px 1px rgba(0, 0, 0, 0.2);
+}
+
+.button-success {
+  background: rgb(28, 184, 65);
+}
+
+.button-error {
+  background: rgb(202, 60, 60);
+}
+
+.button-warning {
+  background: rgb(223, 117, 20);
+}
+
+.button-secondary {
+  background: rgb(66, 184, 221);
+}
+
 .pure-button {
   background-color: #1f8dd6;
   color: white;
diff -rN -u old-smederee/modules/hub/src/main/resources/messages_en.properties new-smederee/modules/hub/src/main/resources/messages_en.properties
--- old-smederee/modules/hub/src/main/resources/messages_en.properties	2025-02-02 11:58:49.725472083 +0000
+++ new-smederee/modules/hub/src/main/resources/messages_en.properties	2025-02-02 11:58:49.725472083 +0000
@@ -47,28 +47,77 @@
 global.login=Login
 global.logout=Logout
 global.navbar.top.logo=Smederee
-global.navbar.top.repository.new=New Repository
+global.navbar.top.repositories.all=All repositories
+global.navbar.top.repositories.yours=Your repositories
+global.navbar.top.repository.new=New repository
 global.privacy=Privacy Policy
 global.signup=Sign Up
 global.terms.of.use=Terms of Use
 
 # Landing Pages
+landingpage.alpha.future-goals.intro=We intend to develop the Smederee into a production ready project during the alpha phase. Afterwards we'll phase over into a beta phase during which remaining bugs are squashed and the payment system will be introduced.
+landingpage.alpha.future-goals.title=Goals for the alpha phase.
+landingpage.alpha.guarantees.data-safety.text=Frequent backups are performed and everything is stored on servers inside the EU which implies that it is protected by the EU GDPR regulation, so what is yours stays yours. Furthermore we do our best to secure our systems as best as we can.
+landingpage.alpha.guarantees.data-safety.title=Safety of account data
+landingpage.alpha.guarantees.intro=Even though the Smederee is considered alpha we provide the following guarantees:
+landingpage.alpha.guarantees.title=Guarantees during alpha
+landingpage.alpha.intro=Although we are aiming for high quality software an alpha implies several rough edges which we will explain a bit on this page.
+landingpage.alpha.issues.changes.text=As we are developing and testing our product we might run into situation where bigger changes to existing features are necessary. Nonetheless we try to reduce these to a minimum.
+landingpage.alpha.issues.changes.title=Existing services might be subject to change
+landingpage.alpha.issues.incomplete.text=Several features are not yet available.
+landingpage.alpha.issues.incomplete.title=Incomplete feature set
+landingpage.alpha.issues.intro=As mentioned some issues are to be expected, most notably:
+landingpage.alpha.issues.payment.text=Once we reach the phase in which the project stabilises and can be considered at least beta all users will be required to pay. However there is no payment plan yet and also we do not plan to price out users that are unable to pay. We will communicate these changes in advance and try to reach a feasible solution.
+landingpage.alpha.issues.payment.title=After the alpha phase payment will be required.
+landingpage.alpha.issues.title=Issues to expect
+landingpage.alpha.title=Details about the public alpha phase of Smederee.
+
+landingpage.index.footer.alpha.title=Public alpha phase
+landingpage.index.footer.alpha.text=We are currently running the Smederee as a public alpha service. This means that some functionality is incomplete or not yet implemented. Also existing services might be subject to change.
+landingpage.index.footer.alpha.link-text=Read more details about what to expect while using the Smederee.
+landingpage.index.footer.services.link-text=Our Services
+landingpage.index.footer.services.title=Software Consulting and Development
+landingpage.index.footer.services.text=Hire our experienced engineers to deliver solutions to your problems. We are used to solving hard problems and working across a multitude of business domains. While bringing in knowledge from our field of expertise we provide mentoring to increase the potential of your teams.
 landingpage.index.getstarted.title=Get started today
 landingpage.index.menu.heading=Smederee
-landingpage.index.pitch.title=Smederee brings teams together to build solid software!
 landingpage.index.pitch.header.first=Code Hosting
-landingpage.index.pitch.teaser.first=Hosted darcs repositories with fine grained access control including read only access for users without an account.
+landingpage.index.pitch.header.fourth=Seamless CI/CD
 landingpage.index.pitch.header.second=Issue Tracking
-landingpage.index.pitch.teaser.second=Enjoy powerful and focussed issue tracking and project management which seamlessly integrates with email and mailing lists.
 landingpage.index.pitch.header.third=Code Review
-landingpage.index.pitch.teaser.third=Review patches the way it was meant to be by leveraging the power of email  without missing out on a web based interface.
-landingpage.index.pitch.header.fourth=Seamless CI/CD
+landingpage.index.pitch.teaser.first=Hosted darcs repositories with fine grained access control including read only access for users without an account.
 landingpage.index.pitch.teaser.fourth=Coming soon...
-landingpage.index.ribbon.title=We help you to craft great tools!
+landingpage.index.pitch.teaser.second=Enjoy powerful and focussed issue tracking and project management which seamlessly integrates with email and mailing lists.
+landingpage.index.pitch.teaser.third=Review patches the way it was meant to be by leveraging the power of email  without missing out on a web based interface.
+landingpage.index.pitch.title=Smederee brings teams together to build solid software!
 landingpage.index.ribbon.text=Benefit from our experience with building software for decades and leverage efficient engineering tools to craft your own software. All of your data is protected by the EU GDPR regulation, so what is yours stays yours. No tracking, no third party cookies and no dependencies on external services!
-landingpage.index.splash.title=Craft Software!
+landingpage.index.ribbon.title=We help you to craft great tools!
 landingpage.index.splash.text=Leverage the power of the <a href="http://darcs.net" target="_blank">darcs</a> vcs to handle your projects with ease and confidence and rest assured that we won't track you or sell your data!
+landingpage.index.splash.title=Craft Software!
 
-landingpage.welcome.title=Welcome to the Smederee!
-landingpage.welcome.ribbon.title=Thank you and welcome!
+landingpage.welcome.image.alt=A neon sign saying: Do something great!
 landingpage.welcome.ribbon.text=Welcome to the smederee! You can now use your credentials to login and start creating. Please note that some functionalities are locked until you have verified your email address.
+landingpage.welcome.ribbon.title=Thank you and welcome!
+landingpage.welcome.title=Welcome to the Smederee!
+
+# Repository pages
+repositories.all.column.description=Description
+repositories.all.column.name=Name
+repositories.all.none-found=No repositories found.
+
+repositories.yours.column.description=Description
+repositories.yours.column.name=Name
+repositories.yours.none-found=Looks like you don't have any repositories created yet.
+
+repository.menu.changes.next=Next
+repository.menu.changes=Changes
+repository.menu.files=Files
+repository.menu.overview=Overview
+repository.menu.website=Website
+repository.menu.website.tooltip=Click here to open the project website ({0}) in a new tab or window.
+repository.description.title=Summary:
+
+repository.overview.clone.title=Clone this repository
+repository.overview.clone.read-only=read-only
+repository.overview.clone.read-write=read-write
+repository.overview.latest-changes=Latest changes
+
diff -rN -u old-smederee/modules/hub/src/main/scala/de/smederee/hub/LandingPageRoutes.scala new-smederee/modules/hub/src/main/scala/de/smederee/hub/LandingPageRoutes.scala
--- old-smederee/modules/hub/src/main/scala/de/smederee/hub/LandingPageRoutes.scala	2025-02-02 11:58:49.725472083 +0000
+++ new-smederee/modules/hub/src/main/scala/de/smederee/hub/LandingPageRoutes.scala	2025-02-02 11:58:49.725472083 +0000
@@ -38,6 +38,8 @@
   *   A higher kinded type providing needed functionality, which is usually an IO monad like Async or Sync.
   */
 final class LandingPageRoutes[F[_]: Async](linkConfig: ExternalLinkConfig) extends Http4sDsl[F] {
+  // The base URI for our site which that be passed into some templates which create links themselfes.
+  private val baseUri = linkConfig.createFullUri(Uri())
   // The URL that shall be used in the `action` field of the form.
   private val signupUri = linkConfig.createFullUri(uri"/signup")
 
@@ -45,19 +47,26 @@
     case ar @ GET -> Root as user =>
       for {
         csrf <- Sync[F].delay(ar.req.getCsrfToken)
-        resp <- Ok(views.html.index()()(signupUri, csrf, "Welcome to the Smederee!".some, user.some))
+        resp <- Ok(views.html.index(baseUri)()(signupUri, csrf, "Welcome to the Smederee!".some, user.some))
       } yield resp
   }
 
   private val mainSite: HttpRoutes[F] = HttpRoutes.of { case req @ GET -> Root =>
     for {
       csrf <- Sync[F].delay(req.getCsrfToken)
-      resp <- Ok(views.html.index()()(signupUri, csrf, "Welcome to the Smederee!".some))
+      resp <- Ok(views.html.index(baseUri)()(signupUri, csrf, "Welcome to the Smederee!".some))
+    } yield resp
+  }
+
+  private val publicAlpha: HttpRoutes[F] = HttpRoutes.of { case req @ GET -> Root / "public-alpha" =>
+    for {
+      csrf <- Sync[F].delay(req.getCsrfToken)
+      resp <- Ok(views.html.publicAlpha(baseUri)(csrf, "Smederee - Details about our public alpha.".some))
     } yield resp
   }
 
   val protectedRoutes = mainSiteForLoggedInUsers
 
-  val routes = mainSite
+  val routes = publicAlpha <+> mainSite
 
 }
diff -rN -u old-smederee/modules/hub/src/main/twirl/de/smederee/hub/views/index.scala.html new-smederee/modules/hub/src/main/twirl/de/smederee/hub/views/index.scala.html
--- old-smederee/modules/hub/src/main/twirl/de/smederee/hub/views/index.scala.html	2025-02-02 11:58:49.725472083 +0000
+++ new-smederee/modules/hub/src/main/twirl/de/smederee/hub/views/index.scala.html	2025-02-02 11:58:49.725472083 +0000
@@ -94,19 +94,12 @@
           </div>
 
           <div class="l-box-lrg pure-u-1 pure-u-md-3-5">
-            <h4>Contact Us</h4>
-            <p>
-            Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
-            tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
-            quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
-            consequat.
-            </p>
+            <h4>@Messages("landingpage.index.footer.services.title")</h4>
+            <p>@Messages("landingpage.index.footer.services.text")</p>
+            <a class="button-success pure-button" href="https://www.wegtam.com/services/" target="_blank">@Messages("landingpage.index.footer.services.link-text")</a>
 
-            <h4>More Information</h4>
-            <p>
-            Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
-            tempor incididunt ut labore et dolore magna aliqua.
-            </p>
+            <h4>@Messages("landingpage.index.footer.alpha.title")</h4>
+            <p>@Messages("landingpage.index.footer.alpha.text") <a href="@{baseUri.addPath("public-alpha")}">@Messages("landingpage.index.footer.alpha.link-text")</a></p>
           </div>
         </div>
 
diff -rN -u old-smederee/modules/hub/src/main/twirl/de/smederee/hub/views/navbar.scala.html new-smederee/modules/hub/src/main/twirl/de/smederee/hub/views/navbar.scala.html
--- old-smederee/modules/hub/src/main/twirl/de/smederee/hub/views/navbar.scala.html	2025-02-02 11:58:49.725472083 +0000
+++ new-smederee/modules/hub/src/main/twirl/de/smederee/hub/views/navbar.scala.html	2025-02-02 11:58:49.725472083 +0000
@@ -4,10 +4,10 @@
   <a class="logo pure-menu-heading" href="@baseUri">@Messages("global.navbar.top.logo")</a>
 
   <ul class="pure-menu-list">
-    <li class="pure-menu-item"><a class="pure-menu-link" href="@{baseUri.addPath("projects")}">Projects</a></li>
+    <li class="pure-menu-item"><a class="pure-menu-link" href="@{baseUri.addPath("projects")}">@Messages("global.navbar.top.repositories.all")</a></li>
     @if(user.nonEmpty) {
       @for(account <- user) {
-        <li class="pure-menu-item"><a class="pure-menu-link" href="@{baseUri.addPath(s"~${account.name}")}">Your projects</a></li>
+        <li class="pure-menu-item"><a class="pure-menu-link" href="@{baseUri.addPath(s"~${account.name}")}">@Messages("global.navbar.top.repositories.yours")</a></li>
       }
       <li class="pure-menu-item"><a class="pure-menu-link" href="@{baseUri.addPath("repo/create")}">+ @Messages("global.navbar.top.repository.new")</a></li>
       <li class="pure-menu-item">
diff -rN -u old-smederee/modules/hub/src/main/twirl/de/smederee/hub/views/publicAlpha.scala.html new-smederee/modules/hub/src/main/twirl/de/smederee/hub/views/publicAlpha.scala.html
--- old-smederee/modules/hub/src/main/twirl/de/smederee/hub/views/publicAlpha.scala.html	1970-01-01 00:00:00.000000000 +0000
+++ new-smederee/modules/hub/src/main/twirl/de/smederee/hub/views/publicAlpha.scala.html	2025-02-02 11:58:49.725472083 +0000
@@ -0,0 +1,40 @@
+@(baseUri: Uri = Uri(path = Uri.Path.Root), lang: LanguageCode = LanguageCode("en"))(csrf: Option[CsrfToken] = None, title: Option[String] = None)
+@myHeaders = {
+  <link rel="stylesheet" href="@{baseUri.addPath("assets/css/landingpage.css")}" />
+  <style>
+    main.content-wrapper {
+      top: unset !important;
+    }
+  </style>
+}
+@main(baseUri, lang)(customHeaders = myHeaders)(csrf, title) {
+@defining(lang.toLocale) { implicit locale =>
+<div class="content">
+  <div class="pure-g">
+    <div class="pure-u-1-1 pure-u-md-1-1">
+      <div class="l-box">
+        <h1>@Messages("landingpage.alpha.title")</h1>
+        <p>@Messages("landingpage.alpha.intro")</p>
+        <hr/>
+        <h2>@Messages("landingpage.alpha.issues.title")</h2>
+        <p>@Messages("landingpage.alpha.issues.intro")</p>
+        <h3>@Messages("landingpage.alpha.issues.incomplete.title")</h3>
+        <p>@Messages("landingpage.alpha.issues.incomplete.text")</p>
+        <h3>@Messages("landingpage.alpha.issues.changes.title")</h3>
+        <p>@Messages("landingpage.alpha.issues.incomplete.text")</p>
+        <h3>@Messages("landingpage.alpha.issues.payment.title")</h3>
+        <p>@Messages("landingpage.alpha.issues.incomplete.text")</p>
+        <hr/>
+        <h2>@Messages("landingpage.alpha.guarantees.title")</h2>
+        <p>@Messages("landingpage.alpha.guarantees.intro")</p>
+        <h3>@Messages("landingpage.alpha.guarantees.data-safety.title")</h3>
+        <p>@Messages("landingpage.alpha.guarantees.data-safety.text")</p>
+        <hr/>
+        <h2>@Messages("landingpage.alpha.future-goals.title")</h2>
+        <p>@Messages("landingpage.alpha.future-goals.intro")</p>
+      </div>
+    </div>
+  </div>
+</div>
+}
+}
diff -rN -u old-smederee/modules/hub/src/main/twirl/de/smederee/hub/views/showAllRepositories.scala.html new-smederee/modules/hub/src/main/twirl/de/smederee/hub/views/showAllRepositories.scala.html
--- old-smederee/modules/hub/src/main/twirl/de/smederee/hub/views/showAllRepositories.scala.html	2025-02-02 11:58:49.725472083 +0000
+++ new-smederee/modules/hub/src/main/twirl/de/smederee/hub/views/showAllRepositories.scala.html	2025-02-02 11:58:49.725472083 +0000
@@ -10,8 +10,8 @@
           <thead>
             <tr>
               <th></th>
-              <th>Name</th>
-              <th>Description</th>
+              <th>@Messages("repositories.all.column.name")</th>
+              <th>@Messages("repositories.all.column.description")</th>
             </tr>
           </thead>
           <tbody>
@@ -29,7 +29,7 @@
           </tbody>
         </table>
         } else {
-          <div class="alert alert-warning">No repositories found.</div>
+          <div class="alert alert-warning">@Messages("repositories.all.none-found")</div>
         }
         </div>
       </div>
diff -rN -u old-smederee/modules/hub/src/main/twirl/de/smederee/hub/views/showRepositories.scala.html new-smederee/modules/hub/src/main/twirl/de/smederee/hub/views/showRepositories.scala.html
--- old-smederee/modules/hub/src/main/twirl/de/smederee/hub/views/showRepositories.scala.html	2025-02-02 11:58:49.725472083 +0000
+++ new-smederee/modules/hub/src/main/twirl/de/smederee/hub/views/showRepositories.scala.html	2025-02-02 11:58:49.725472083 +0000
@@ -10,8 +10,8 @@
           <thead>
             <tr>
               <th></th>
-              <th>Name</th>
-              <th>Description</th>
+              <th>@Messages("repositories.yours.column.name")</th>
+              <th>@Messages("repositories.yours.column.description")</th>
             </tr>
           </thead>
           <tbody>
@@ -25,7 +25,7 @@
           </tbody>
         </table>
         } else {
-          <div class="alert alert-secondary">No repositories found.</div>
+          <div class="alert alert-secondary">@Messages("repositories.yours.none-found")</div>
         }
         </div>
       </div>
diff -rN -u old-smederee/modules/hub/src/main/twirl/de/smederee/hub/views/showRepositoryFiles.scala.html new-smederee/modules/hub/src/main/twirl/de/smederee/hub/views/showRepositoryFiles.scala.html
--- old-smederee/modules/hub/src/main/twirl/de/smederee/hub/views/showRepositoryFiles.scala.html	2025-02-02 11:58:49.725472083 +0000
+++ new-smederee/modules/hub/src/main/twirl/de/smederee/hub/views/showRepositoryFiles.scala.html	2025-02-02 11:58:49.725472083 +0000
@@ -8,11 +8,11 @@
           <h2><a href="@{baseUri.addSegment(s"~${vcsRepository.owner.name}")}">~@vcsRepository.owner.name</a>/@vcsRepository.name</h2>
           <nav class="pure-menu pure-menu-horizontal">
             <ul class="pure-menu-list">
-              <li class="pure-menu-item"><a class="pure-menu-link" href="@repositoryBaseUri"><i class="fa-solid fa-eye"></i> Overview</a></li>
-              <li class="pure-menu-item pure-menu-active"><a class="pure-menu-link" href="@repositoryBaseUri.addSegment("files")"><i class="fa-solid fa-folder-tree"></i> Files</a></li>
-              <li class="pure-menu-item"><a class="pure-menu-link" href="@repositoryBaseUri.addSegment("history")"><i class="fa-solid fa-timeline"></i> Changes</a></li>
+              <li class="pure-menu-item"><a class="pure-menu-link" href="@repositoryBaseUri"><i class="fa-solid fa-eye"></i> @Messages("repository.menu.overview")</a></li>
+              <li class="pure-menu-item pure-menu-active"><a class="pure-menu-link" href="@repositoryBaseUri.addSegment("files")"><i class="fa-solid fa-folder-tree"></i> @Messages("repository.menu.files")</a></li>
+              <li class="pure-menu-item"><a class="pure-menu-link" href="@repositoryBaseUri.addSegment("history")"><i class="fa-solid fa-timeline"></i> @Messages("repository.menu.changes")</a></li>
               @for(website <- vcsRepository.website) {
-              <li class="pure-menu-item"><a class="pure-menu-link" href="@website" target="_blank" title="Click here to open the project website (@website) in a new tab or window."><i class="fa-solid fa-up-right-from-square"></i> Website</a></li>
+              <li class="pure-menu-item"><a class="pure-menu-link" href="@website" target="_blank" title="@Messages("repository.menu.website.tooltip", website)"><i class="fa-solid fa-up-right-from-square"></i> @Messages("repository.menu.website")</a></li>
               }
             </ul>
           </nav>
diff -rN -u old-smederee/modules/hub/src/main/twirl/de/smederee/hub/views/showRepositoryHistory.scala.html new-smederee/modules/hub/src/main/twirl/de/smederee/hub/views/showRepositoryHistory.scala.html
--- old-smederee/modules/hub/src/main/twirl/de/smederee/hub/views/showRepositoryHistory.scala.html	2025-02-02 11:58:49.725472083 +0000
+++ new-smederee/modules/hub/src/main/twirl/de/smederee/hub/views/showRepositoryHistory.scala.html	2025-02-02 11:58:49.729472093 +0000
@@ -8,11 +8,11 @@
           <h2><a href="@{baseUri.addSegment(s"~${vcsRepository.owner.name}")}">~@vcsRepository.owner.name</a>/@vcsRepository.name</h2>
           <nav class="pure-menu pure-menu-horizontal">
             <ul class="pure-menu-list">
-              <li class="pure-menu-item"><a class="pure-menu-link" href="@actionBaseUri"><i class="fa-solid fa-eye"></i> Overview</a></li>
-              <li class="pure-menu-item"><a class="pure-menu-link" href="@actionBaseUri.addSegment("files")"><i class="fa-solid fa-folder-tree"></i> Files</a></li>
-              <li class="pure-menu-item pure-menu-active"><a class="pure-menu-link" href="@actionBaseUri.addSegment("history")"><i class="fa-solid fa-timeline"></i> Changes</a></li>
+              <li class="pure-menu-item"><a class="pure-menu-link" href="@actionBaseUri"><i class="fa-solid fa-eye"></i> @Messages("repository.menu.overview")</a></li>
+              <li class="pure-menu-item"><a class="pure-menu-link" href="@actionBaseUri.addSegment("files")"><i class="fa-solid fa-folder-tree"></i> @Messages("repository.menu.files")</a></li>
+              <li class="pure-menu-item pure-menu-active"><a class="pure-menu-link" href="@actionBaseUri.addSegment("history")"><i class="fa-solid fa-timeline"></i> @Messages("repository.menu.changes")</a></li>
               @for(website <- vcsRepository.website) {
-              <li class="pure-menu-item"><a class="pure-menu-link" href="@website" target="_blank" title="Click here to open the project website (@website) in a new tab or window."><i class="fa-solid fa-up-right-from-square"></i> Website</a></li>
+              <li class="pure-menu-item"><a class="pure-menu-link" href="@website" target="_blank" title="@Messages("repository.menu.website.tooltip", website)"><i class="fa-solid fa-up-right-from-square"></i> @Messages("repository.menu.website")</a></li>
               }
             </ul>
           </nav>
@@ -30,7 +30,7 @@
           <nav class="pure-menu pure-menu-horizontal">
             <ul class="pure-menu-list">
               @for(next <- nextEntry) {
-              <li class="pure-menu-item"><a class="pure-menu-link" href="@repositoryBaseUri.addSegment("history").withOptionQueryParam("from", nextEntry)">Next <i class="fa-solid fa-angle-right"></i></a></li>
+              <li class="pure-menu-item"><a class="pure-menu-link" href="@repositoryBaseUri.addSegment("history").withOptionQueryParam("from", nextEntry)">@Messages("repository.menu.changes.next") <i class="fa-solid fa-angle-right"></i></a></li>
               }
             </ul>
           </nav>
diff -rN -u old-smederee/modules/hub/src/main/twirl/de/smederee/hub/views/showRepositoryOverview.scala.html new-smederee/modules/hub/src/main/twirl/de/smederee/hub/views/showRepositoryOverview.scala.html
--- old-smederee/modules/hub/src/main/twirl/de/smederee/hub/views/showRepositoryOverview.scala.html	2025-02-02 11:58:49.725472083 +0000
+++ new-smederee/modules/hub/src/main/twirl/de/smederee/hub/views/showRepositoryOverview.scala.html	2025-02-02 11:58:49.729472093 +0000
@@ -8,17 +8,17 @@
           <h2><a href="@{baseUri.addSegment(s"~${vcsRepository.owner.name}")}">~@vcsRepository.owner.name</a>/@vcsRepository.name</h2>
           <nav class="pure-menu pure-menu-horizontal">
             <ul class="pure-menu-list">
-              <li class="pure-menu-item pure-menu-active"><a class="pure-menu-link" href="@actionBaseUri"><i class="fa-solid fa-eye"></i> Overview</a></li>
-              <li class="pure-menu-item"><a class="pure-menu-link" href="@actionBaseUri.addSegment("files")"><i class="fa-solid fa-folder-tree"></i> Files</a></li>
-              <li class="pure-menu-item"><a class="pure-menu-link" href="@actionBaseUri.addSegment("history")"><i class="fa-solid fa-timeline"></i> Changes</a></li>
+              <li class="pure-menu-item pure-menu-active"><a class="pure-menu-link" href="@actionBaseUri"><i class="fa-solid fa-eye"></i> @Messages("repository.menu.overview")</a></li>
+              <li class="pure-menu-item"><a class="pure-menu-link" href="@actionBaseUri.addSegment("files")"><i class="fa-solid fa-folder-tree"></i> @Messages("repository.menu.files")</a></li>
+              <li class="pure-menu-item"><a class="pure-menu-link" href="@actionBaseUri.addSegment("history")"><i class="fa-solid fa-timeline"></i> @Messages("repository.menu.changes")</a></li>
               @for(website <- vcsRepository.website) {
-              <li class="pure-menu-item"><a class="pure-menu-link" href="@website" target="_blank" title="Click here to open the project website (@website) in a new tab or window."><i class="fa-solid fa-up-right-from-square"></i> Website</a></li>
+              <li class="pure-menu-item"><a class="pure-menu-link" href="@website" target="_blank" title="@Messages("repository.menu.website.tooltip", website)"><i class="fa-solid fa-up-right-from-square"></i> @Messages("repository.menu.website")</a></li>
               }
             </ul>
           </nav>
           @for(description <- vcsRepository.description) {
             <div class="repo-summary-description">
-              <strong>Summary:</strong> @description
+              <strong>@Messages("repository.description.title")</strong> @description
             </div>
           }
         </div>
@@ -27,15 +27,15 @@
     <div class="pure-g">
       <div class="pure-u-3-5 pure-u-md-3-5">
         <div class="l-box">
-          <h3>Latest changes</h3>
+          <h3>@Messages("repository.overview.latest-changes")</h3>
           <pre class="latest-changes"><code>@vcsRepositoryHistory</code></pre>
         </div>
       </div>
       <div class="pure-u-2-5 pure-u-md-2-5">
         <div class="l-box">
-          <h3>Clone</h3>
+          <h3>@Messages("repository.overview.clone.title")</h3>
           <dl class="clone-links">
-            <dt>read-only</dt>
+            <dt>@Messages("repository.overview.clone.read-only")</dt>
             <dd>
               <form class="pure-form">
                 <fieldset>
@@ -43,7 +43,7 @@
                 </fieldset>
               </form>
             </dd>
-            <dt>read-write</dt>
+            <dt>@Messages("repository.overview.clone.read-write")</dt>
             <dd>TODO</dd>
           </dl>
         </div>
diff -rN -u old-smederee/modules/hub/src/main/twirl/de/smederee/hub/views/welcome.scala.html new-smederee/modules/hub/src/main/twirl/de/smederee/hub/views/welcome.scala.html
--- old-smederee/modules/hub/src/main/twirl/de/smederee/hub/views/welcome.scala.html	2025-02-02 11:58:49.725472083 +0000
+++ new-smederee/modules/hub/src/main/twirl/de/smederee/hub/views/welcome.scala.html	2025-02-02 11:58:49.729472093 +0000
@@ -7,7 +7,7 @@
   <div class="content">
     <div class="ribbon l-box-lrg pure-g" style="background: #2d3e50; color: #aaa; padding: 2em; border-bottom: 1px solid rgba(0,0,0,0.1);">
       <div class="l-box-lrg is-center pure-u-1 pure-u-md-1-2 pure-u-lg-2-5">
-        <img width="300" alt="A neon sign saying: Do something great!" class="pure-img-responsive" src="@{baseUri.addPath("assets/img/clark-tibbs-oqStl2L5oxI-unsplash.jpg")}">
+        <img width="300" alt="@Messages("landingpage.welcome.image.alt")" class="pure-img-responsive" src="@{baseUri.addPath("assets/img/clark-tibbs-oqStl2L5oxI-unsplash.jpg")}">
       </div>
       <div class="pure-u-1 pure-u-md-1-2 pure-u-lg-3-5">
         <h2 class="content-head content-head-ribbon" style="color: white;">@Messages("landingpage.welcome.ribbon.title")</h2>