-
Notifications
You must be signed in to change notification settings - Fork 6
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
768735e
commit b949086
Showing
8 changed files
with
489 additions
and
16 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,160 @@ | ||
<!DOCTYPE html> | ||
<html lang="en"> | ||
<head> | ||
<meta charset="UTF-8"> | ||
<meta name="viewport" content="width=device-width, initial-scale=1.0"> | ||
<title>Ứng dụng Dịch Sách</title> | ||
<style> | ||
body { | ||
font-family: Arial, sans-serif; | ||
line-height: 1.6; | ||
margin: 0; | ||
padding: 20px; | ||
transition: background-color 0.3s, color 0.3s; | ||
} | ||
.dark-mode { | ||
background-color: #1a1a1a; | ||
color: #ffffff; | ||
} | ||
.container { | ||
max-width: 800px; | ||
margin: 0 auto; | ||
} | ||
header { | ||
display: flex; | ||
justify-content: space-between; | ||
align-items: center; | ||
margin-bottom: 20px; | ||
} | ||
button { | ||
padding: 5px 10px; | ||
margin-left: 10px; | ||
cursor: pointer; | ||
} | ||
.paragraph { | ||
margin-bottom: 20px; | ||
} | ||
.translation { | ||
color: #666; | ||
position: relative; | ||
} | ||
.dark-mode .translation { | ||
color: #aaa; | ||
} | ||
.editing { | ||
border: 1px solid #ccc; | ||
padding: 5px; | ||
} | ||
.edit-buttons { | ||
position: absolute; | ||
right: 0; | ||
top: 0; | ||
} | ||
.hidden { | ||
display: none; | ||
} | ||
</style> | ||
</head> | ||
<body> | ||
<div class="container"> | ||
<header> | ||
<h1>Ứng dụng Dịch Sách</h1> | ||
<div> | ||
<button id="darkModeToggle">🌙</button> | ||
<button id="translationToggle">📖</button> | ||
<input type="range" id="fontSizeSlider" min="12" max="24" value="16"> | ||
<span id="fontSizeDisplay">16px</span> | ||
</div> | ||
</header> | ||
<main id="content"></main> | ||
</div> | ||
|
||
<script> | ||
const paragraphs = [ | ||
{ | ||
original: "It was the best of times, it was the worst of times, it was the age of wisdom, it was the age of foolishness...", | ||
translated: "Đó là thời kỳ tốt đẹp nhất, cũng là thời kỳ tồi tệ nhất, đó là thời đại của sự khôn ngoan, cũng là thời đại của sự ngu xuẩn...", | ||
isEditing: false | ||
}, | ||
{ | ||
original: "It was the epoch of belief, it was the epoch of incredulity, it was the season of Light, it was the season of Darkness, it was the spring of hope, it was the winter of despair.", | ||
translated: "Đó là thời đại của niềm tin, là thời đại của sự hoài nghi, là mùa của Ánh sáng, là mùa của Bóng tối, là mùa xuân của hy vọng, là mùa đông của tuyệt vọng.", | ||
isEditing: false | ||
}, | ||
{ | ||
original: "We had everything before us, we had nothing before us, we were all going direct to Heaven, we were all going direct the other way—in short, the period was so far like the present period, that some of its noisiest authorities insisted on its being received, for good or for evil, in the superlative degree of comparison only.", | ||
translated: "Chúng ta có tất cả trước mắt, chúng ta chẳng có gì trước mắt, tất cả chúng ta đều đang đi thẳng tới Thiên đường, tất cả chúng ta đều đang đi thẳng theo hướng ngược lại—tóm lại, thời kỳ đó giống thời kỳ hiện tại đến nỗi một số nhà chức trách ồn ào nhất của nó khăng khăng rằng nó chỉ có thể được chấp nhận, dù tốt hay xấu, ở mức độ so sánh tối cao.", | ||
isEditing: false | ||
} | ||
]; | ||
|
||
let showTranslation = true; | ||
|
||
function renderParagraphs() { | ||
const content = document.getElementById('content'); | ||
content.innerHTML = ''; | ||
paragraphs.forEach((paragraph, index) => { | ||
const div = document.createElement('div'); | ||
div.className = 'paragraph'; | ||
div.innerHTML = ` | ||
<p>${paragraph.original}</p> | ||
<div class="translation ${showTranslation ? '' : 'hidden'}"> | ||
<p ondblclick="startEditing(${index})">${paragraph.translated}</p> | ||
<div class="edit-buttons ${paragraph.isEditing ? '' : 'hidden'}"> | ||
<button onclick="aiTranslate(${index})">AI</button> | ||
<button onclick="saveTranslation(${index})">Lưu</button> | ||
</div> | ||
</div> | ||
`; | ||
content.appendChild(div); | ||
}); | ||
} | ||
|
||
function startEditing(index) { | ||
paragraphs[index].isEditing = true; | ||
renderParagraphs(); | ||
const translationElement = document.querySelectorAll('.translation')[index]; | ||
const paragraphElement = translationElement.querySelector('p'); | ||
paragraphElement.contentEditable = true; | ||
paragraphElement.focus(); | ||
paragraphElement.className = 'editing'; | ||
} | ||
|
||
function saveTranslation(index) { | ||
const translationElement = document.querySelectorAll('.translation')[index]; | ||
const paragraphElement = translationElement.querySelector('p'); | ||
paragraphs[index].translated = paragraphElement.innerText; | ||
paragraphs[index].isEditing = false; | ||
renderParagraphs(); | ||
} | ||
|
||
function aiTranslate(index) { | ||
console.log(`Đang dịch đoạn ${index + 1} bằng AI...`); | ||
setTimeout(() => { | ||
paragraphs[index].translated = `Đây là bản dịch AI mới cho đoạn ${index + 1}.`; | ||
console.log(`Dịch xong đoạn ${index + 1}!`); | ||
renderParagraphs(); | ||
}, 2000); | ||
} | ||
|
||
document.getElementById('darkModeToggle').addEventListener('click', () => { | ||
document.body.classList.toggle('dark-mode'); | ||
}); | ||
|
||
document.getElementById('translationToggle').addEventListener('click', () => { | ||
showTranslation = !showTranslation; | ||
renderParagraphs(); | ||
}); | ||
|
||
const fontSizeSlider = document.getElementById('fontSizeSlider'); | ||
const fontSizeDisplay = document.getElementById('fontSizeDisplay'); | ||
fontSizeSlider.addEventListener('input', (e) => { | ||
const fontSize = e.target.value; | ||
document.body.style.fontSize = `${fontSize}px`; | ||
fontSizeDisplay.textContent = `${fontSize}px`; | ||
}); | ||
|
||
renderParagraphs(); | ||
</script> | ||
</body> | ||
</html> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.