Skip to content
Snippets Groups Projects
Commit a07e15e6 authored by Richard Githuba's avatar Richard Githuba
Browse files

proof of the translation api working

parent 9a33d78f
No related branches found
No related tags found
No related merge requests found
...@@ -35,7 +35,7 @@ public class WebSecurityConfig { ...@@ -35,7 +35,7 @@ public class WebSecurityConfig {
private final String[] whiteListingPath = { private final String[] whiteListingPath = {
// "/event", // "/event",
// "event/*" // "event/*"
"/api/feed/**" // "/api/feed/**" ,
}; };
public WebSecurityConfig(UserService userService, RoleService roleService) { public WebSecurityConfig(UserService userService, RoleService roleService) {
...@@ -53,6 +53,8 @@ public class WebSecurityConfig { ...@@ -53,6 +53,8 @@ public class WebSecurityConfig {
// require authentication for events only // require authentication for events only
//update in future when more protected resources are available //update in future when more protected resources are available
.authorizeHttpRequests((requests) -> requests .authorizeHttpRequests((requests) -> requests
.requestMatchers("/api/translations/**").permitAll()
.requestMatchers("/api/feed/**").permitAll()
.requestMatchers(whiteListingPath).authenticated() .requestMatchers(whiteListingPath).authenticated()
.anyRequest().permitAll() .anyRequest().permitAll()
) )
......
package polish_community_group_11.polish_community.translation.controller; package polish_community_group_11.polish_community.translation.controller;
import jakarta.annotation.PostConstruct;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import polish_community_group_11.polish_community.translation.model.Translation; import polish_community_group_11.polish_community.translation.model.Translation;
...@@ -17,6 +18,18 @@ public class TranslationApisController { ...@@ -17,6 +18,18 @@ public class TranslationApisController {
this.translationService = translationService; this.translationService = translationService;
} }
@GetMapping("/test")
public ResponseEntity<String> test() {
return ResponseEntity.ok("Translation API is working");
}
@PostConstruct
public void init() {
System.out.println("TranslationApisController initialized with mappings:");
System.out.println("/api/translations");
System.out.println("/api/translations/language/{language}");
}
// get all translations // get all translations
@GetMapping @GetMapping
public ResponseEntity<List<Translation>> getAllTranslations() { public ResponseEntity<List<Translation>> getAllTranslations() {
......
package polish_community_group_11.polish_community.translation.repository; package polish_community_group_11.polish_community.translation.repository;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper; import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Repository; import org.springframework.stereotype.Repository;
...@@ -9,6 +11,8 @@ import java.util.List; ...@@ -9,6 +11,8 @@ import java.util.List;
@Repository @Repository
public class TranslationRepositoryImpl implements TranslationRepository { public class TranslationRepositoryImpl implements TranslationRepository {
private static final Logger logger = LoggerFactory.getLogger(TranslationRepositoryImpl.class);
private final JdbcTemplate jdbcTemplate; private final JdbcTemplate jdbcTemplate;
private final RowMapper<Translation> translationMapper; private final RowMapper<Translation> translationMapper;
...@@ -19,9 +23,30 @@ public class TranslationRepositoryImpl implements TranslationRepository { ...@@ -19,9 +23,30 @@ public class TranslationRepositoryImpl implements TranslationRepository {
translation.setId(rs.getInt("id")); translation.setId(rs.getInt("id"));
translation.setKey(rs.getString("translation_key")); translation.setKey(rs.getString("translation_key"));
translation.setLanguage(rs.getString("language")); translation.setLanguage(rs.getString("language"));
translation.setValue(rs.getString("translation_value")); translation.setValue(rs.getString("value"));
return translation; return translation;
}; };
// Test database connection on startup
try {
jdbcTemplate.queryForObject("SELECT 1", Integer.class);
logger.info("Database connection successful");
} catch (Exception e) {
logger.error("Database connection failed", e);
}
}
@Override
public List<Translation> getTranslationsByLanguage(String language) {
try {
logger.info("Attempting to fetch translations for language: {}", language);
String sql = "SELECT * FROM translations WHERE language = ?";
List<Translation> results = jdbcTemplate.query(sql, translationMapper, language);
logger.info("Found {} translations for language {}", results.size(), language);
return results;
} catch (Exception e) {
logger.error("Error fetching translations for language {}: {}", language, e.getMessage());
throw e;
}
} }
// getting all translaions // getting all translaions
...@@ -31,13 +56,6 @@ public class TranslationRepositoryImpl implements TranslationRepository { ...@@ -31,13 +56,6 @@ public class TranslationRepositoryImpl implements TranslationRepository {
return jdbcTemplate.query(sql, translationMapper); return jdbcTemplate.query(sql, translationMapper);
} }
// getting translations for a single language
@Override
public List<Translation> getTranslationsByLanguage(String language) {
String sql = "SELECT * FROM translations WHERE language = ?";
return jdbcTemplate.query(sql, translationMapper, language);
}
// get translation by key and language // get translation by key and language
@Override @Override
public Translation getTranslationByKeyAndLanguage(String key, String language) { public Translation getTranslationByKeyAndLanguage(String key, String language) {
......
...@@ -18,7 +18,7 @@ server.error.whitelabel.enabled=false ...@@ -18,7 +18,7 @@ server.error.whitelabel.enabled=false
server.error.path=/error server.error.path=/error
spring.jpa.hibernate.ddl-auto=none spring.jpa.hibernate.ddl-auto=none
spring.sql.init.schema-locations=classpath:/schema.sql spring.sql.init.schema-locations=classpath:/schema.sql
spring.sql.init.data-locations=classpath:/data.sql, classpath:/data_information_domains.sql spring.sql.init.data-locations=classpath:/data.sql, classpath:/data_information_domains.sql, classpath:/translations.sql
#spring.jpa.hibernate.ddl-auto=none #spring.jpa.hibernate.ddl-auto=none
spring.jpa.defer-datasource-initialization=true spring.jpa.defer-datasource-initialization=true
......
...@@ -153,3 +153,5 @@ create table if not exists translations ( ...@@ -153,3 +153,5 @@ create table if not exists translations (
language varchar(10) not null, language varchar(10) not null,
value text not null value text not null
) engine = InnoDB; ) engine = InnoDB;
ALTER TABLE translations MODIFY value TEXT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
let translations = {}; let translations = [];
let currentLanguage = "english"; let currentLanguage = "en";
/** /**
* Fetch translations for the given language. * Fetch translations for the given language.
...@@ -11,19 +11,35 @@ async function fetchTranslations(language) { ...@@ -11,19 +11,35 @@ async function fetchTranslations(language) {
if (!response.ok) { if (!response.ok) {
throw new Error(`Failed to fetch translations: ${response.statusText}`); throw new Error(`Failed to fetch translations: ${response.statusText}`);
} }
translations = await response.json(); translations = await response.json(); // This is now an array of translation objects
currentLanguage = language; currentLanguage = language;
console.log("Translations updated:", translations); console.log("Translations updated:", translations);
updateUIWithTranslations();
document.dispatchEvent(new Event("translations-updated")); document.dispatchEvent(new Event("translations-updated"));
} catch (error) { } catch (error) {
console.error("Error fetching translations:", error); console.error("Error fetching translations:", error);
} }
} }
function updateUIWithTranslations() {
const elementsToTranslate = document.querySelectorAll("[data-translate-key]");
elementsToTranslate.forEach(element => {
const translationKey = element.getAttribute("data-translate-key");
// Find the translation object with matching key
const translation = translations.find(t => t.key === translationKey);
if (translation) {
element.textContent = translation.value;
} else {
console.warn(`No translation found for key: ${translationKey}`);
}
});
}
// fetch translations on page load // fetch translations on page load
document.addEventListener("DOMContentLoaded", () => { document.addEventListener("DOMContentLoaded", () => {
fetchTranslations(currentLanguage); fetchTranslations(currentLanguage);
}); console.log("I have run");
// handle language selection // handle language selection
const languageSelector = document.querySelector(".languageSelector select"); const languageSelector = document.querySelector(".languageSelector select");
...@@ -35,3 +51,4 @@ if (languageSelector) { ...@@ -35,3 +51,4 @@ if (languageSelector) {
} }
}); });
} }
});
\ No newline at end of file
...@@ -26,7 +26,7 @@ ...@@ -26,7 +26,7 @@
<div class="navMiddle"> <div class="navMiddle">
<a th:href="@{/}" class="navLink"> <a th:href="@{/}" class="navLink">
<img src="/assets/navbarImages/home.png" class="navIcons"><span class="navText">Home</span> <img src="/assets/navbarImages/home.png" class="navIcons" ><span class="navText" data-translate-key="navbar.home"></span>
</a> </a>
<a th:href="@{/feed}" class="navLink"> <a th:href="@{/feed}" class="navLink">
<img src="/assets/navbarImages/feed.png" class="navIcons"><span class="navText">Feed</span> <img src="/assets/navbarImages/feed.png" class="navIcons"><span class="navText">Feed</span>
...@@ -54,8 +54,8 @@ ...@@ -54,8 +54,8 @@
<div class="languageSelector"> <div class="languageSelector">
<img src="/assets/navbarImages/globe.png" class="navIcons"> <img src="/assets/navbarImages/globe.png" class="navIcons">
<select name="language"> <select name="language">
<option value="english">English</option> <option value="en">English</option>
<option value="polish">Polish</option> <option value="pl">Polish</option>
</select> </select>
</div> </div>
...@@ -103,7 +103,7 @@ ...@@ -103,7 +103,7 @@
<p class="footerCompanyName">&copy; LUDEK PCG ltd. All rights reserved.</p> <p class="footerCompanyName">&copy; LUDEK PCG ltd. All rights reserved.</p>
</div> </div>
</footer> </footer>
<script src="/js/layout/layout.js"></script> <script src="/js/layout/layout.js" defer></script>
<script th:replace="~{comments/commentFragment::commentScript}"></script> <script th:replace="~{comments/commentFragment::commentScript}"></script>
</body> </body>
</html> </html>
\ No newline at end of file
INSERT INTO translations (translation_key, language, value) VALUES
-- English translations
('navbar.home', 'en', 'Home'),
('navbar.news', 'en', 'News'),
('navbar.events', 'en', 'Events'),
('navbar.db_info', 'en', 'Info Database'),
('navbar.contact_us', 'en', 'Contact Us'),
('navbar.feed', 'en', 'Feed'),
('navbar.about_us', 'en', 'About Us'),
('navbar.profile', 'en', 'Profile'),
-- Polish translations
('navbar.home', 'pl', 'Strona główna'),
('navbar.news', 'pl', 'Aktualności'),
('navbar.events', 'pl', 'Wydarzenia'),
('navbar.db_info', 'pl', 'Informacje o bazie danych'),
('navbar.contact_us', 'pl', 'Skontaktuj się z nami'),
('navbar.feed', 'pl', 'Kanał'),
('navbar.about_us', 'pl', 'O nas'),
('navbar.profile', 'pl', 'Profil');
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment