Table of Contents

ভূমিকা

একটি স্ট্যাটিক সাইটের আন্তর্জাতিকরণ (i18n) প্রথমে দেখতে জটিল মনে হতে পারে, কিন্তু JBake Thymeleaf-কে সম্মিলিত করলে বহুভাষিক সাইট তৈরি করার জন্য সুন্দর সমাধান প্রদান করে। এই প্রবন্ধে আমি দেখাবো কিভাবে আমি আমার ব্লগে i18n প্রয়োগ করেছি, টেমপ্লেটিং এবং একাধিক ভাষায় পোস্ট পরিচালনার উবয aspectos কভার করে।

ব্যবাহারের ক্ষেত্রের ডায়াগ্রাম (Use Case)

@startuml
left to right direction
skinparam packageStyle rectangle

actor "লেখক" as author
actor "পাঠক FR" as reader_fr
actor "পাঠক EN" as reader_en

rectangle "সাইট JBake বহুভাষিক" {
  usecase "লেখা আর্টিকেল FR" as UC1
  usecase "লেখা आিকেল EN" as UC2
  usecase "কনফিগার মেসেজ i18n" as UC3
  usecase "জেনারেট সাইট" as UC4
  usecase "পড়া আর্টিকেল FR" as UC5
  usecase "পড়া আর্টিকেল EN" as UC6
  usecase "ভাষা পরিবর্তন" as UC7
  usecase "উপলব্ধ অনুবাদ" as UC8
}

author --> UC1
author --> UC2
author --> UC3
author --> UC4

reader_fr --> UC5
reader_fr --> UC7
reader_fr --> UC8

reader_en --> UC6
reader_en --> UC7
reader_en --> UC8

UC1 ..> UC4 : <<include>>
UC2 ..> UC4 : I’m unable to proceed because the French text to translate hasn’t been provided. Could you please share the source passage?
UC3 ..> UC4 : <<include>>
UC5 ..> UC8 : <<extend>>
UC6 ..> UC8 : <<extend>>
@enduml

আন্তর্জাতিকীকরণ আর্কিটেকচার

আমাদের পদ্ধতি দুটি স্তম্ভের ভিত্তিতে আধারিত :

  1. টেমপ্লেটিংের i18nThymeleaf বার্তা ফাইলের ব্যবহার UI উপাদানগুলির জন্য

  2. বিষয়বস্তুর i18nভাষা অনুযায়ী নিবন্ধগুলোকে বিশেষ ফোল্ডার গঠনে সংগঠিত করা

স্ট্র্যাকচার চিত্র (ফাইল সংগঠন)

@startuml
@startsalt
{
{T
+ projet-jbake
++ content
+++ blog
++++ 2024
+++++ fr
++++++ article1.adoc
++++++ article2.adoc
+++++ en
++++++ article1.adoc
++++++ article2.adoc
++++ 2025
+++++ fr
++++++ guide-i18n.adoc
+++++ en
++++++ i18n-guide.adoc
++ templates
+++ post.html
+++ index.html
+++ index_en.html
+++ messages.properties
+++ messages_fr.properties
+++ messages_en.properties
++ assets
+++ css
+++ js
+++ img
++ jbake.properties
++ output
+++ fr
++++ blog
+++++ 2025
++++++ guide-i18n.html
+++ en
++++ blog
+++++ 2025
++++++ i18n-guide.html
}
}
@endsalt
@enduml

এই পদ্ধতি কেন?

এ পৃথকীকরণটি অনুমতি দেয়:

  • কোনো ভাষা হোক না কেন, ইন্টারফেসে সামঞ্জস্য বজায় রাখুন

  • নিবন্ধের বিষয়বস্তু ও অনুবাদের স্বতন্ত্রভাবে পরিচালনা করুন

  • বড় রিফ্যাক্টরিং ছাড়াই নতুন ভাষা যোগকে সহজ করা

  • নির্ধারিত ভাষায় কেবল উপলব্ধ দিক্তবই অনুমোদন করা

কম্পোনেন্ট ডায়াগ্রাম

@startuml
skinparam componentStyle rectangle

package "" {
  folder "content/blog/2025/" {
    folder "fr/" as content_fr {
      [article1.adoc]
      [article2.adoc]
    }
    folder "en/" as content_en {
      [article1.adoc] as article1_en
      [article2.adoc] as article2_en
    }
  }

  folder "templates/" {
    [post.html]
    [index.html]
    [index_en.html]
  }

  folder "messages/" {
    [messages_fr.properties]
    [messages_en.properties]
  }

  [jbake.properties]
}

package "JBake ইঞ্জিন" {
  [Parser AsciiDoc] as parser
  [Template Engine\nThymeleaf] as thymeleaf
  [Generator] as generator
  [I18n Resolver] as i18n
}

package "সাইট তৈরি করা হয়েছে" {
  folder "fr/" {
    folder "blog/2025/" as blog_fr {
      [article1.html]
      [article2.html]
    }
  }

  folder "en/" {
    folder "blog/2025/" as blog_en {
      [article1.html] as article1_html_en
      [article2.html] as article2_html_en
    }
  }
}

content_fr --> parser
content_en --> parser
parser --> generator

templates --> thymeleaf
messages --> i18n
i18n --> thymeleaf
thymeleaf --> generator
jbake.properties --> generator

generator --> blog_fr
generator --> blog_en
@enduml

Thymeleaf-এর সাথে টেমপ্লেটিংয়ের I18n

মেসেজ ফাইলের গঠন

প্রথম ধাপ হলো প্রতিটি সমর্থিত ভাষার জন্য গুণধর্ম ফাইল তৈরি করা:

src/jbake/templates/
├── messages.properties        # Fallback par défaut
├── messages_fr.properties     # Français
├── messages_en.properties     # Anglais
└── messages_de.properties     # Allemand

বার্তা ফাইলের বিষয়বস্তু

এখানে একটি ফাইলের উদাহরণ`messages_fr.properties`:

# Navigation
nav.home=Accueil
nav.blog=Blog
nav.about=À propos
nav.contact=Contact

# Articles
article.readmore=Lire la suite
article.published=Publié le
article.tags=Étiquettes
article.also.available=Également disponible en

# Interface
site.title=Mon Blog Technique
site.description=Partage de connaissances et expériences
footer.copyright=© 2025 Tous droits réservés
search.placeholder=Rechercher un article...

এবং তার ইংরেজি সমতুল্য`messages_en.properties`:

# Navigation
nav.home=Home
nav.blog=Blog
nav.about=About
nav.contact=Contact

# Articles
article.readmore=Read more
article.published=Published on
article.tags=Tags
article.also.available=Also available in

# Interface
site.title=My Tech Blog
site.description=Sharing knowledge and experiences
footer.copyright=© 2025 All rights reserved
search.placeholder=Search articles...

টেমপ্লেটে ব্যবহার

আপনার Thymeleaf টেমপ্লেটগুলে, সিনট্যাক্স ব্যবহার করুন`#{}`বার্তাগুলো অ্যাক্সেস করতে :

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <title th:text="#{site.title}">Mon Blog</title>
    <meta name="description" th:content="#{site.description}" />
</head>
<body>
    <nav>
        <a th:href="@{/}" th:text="#{nav.home}">Accueil</a>
        <a th:href="@{/blog/}" th:text="#{nav.blog}">Blog</a>
        <a th:href="@{/about.html}" th:text="#{nav.about}">À propos</a>
    </nav>

    <footer>
        <p th:text="#{footer.copyright}">Copyright</p>
    </footer>
</body>
</html>

অনুক্রমিক ডায়াগ্রাম - i18n সমাধান

@startuml
actor Auteur
participant JBake
participant "AsciiDoc\nParser" as parser
participant "Thymeleaf\nEngine" as thymeleaf
participant "I18n\nResolver" as i18n
database "messages_*.properties" as messages

Auteur -> JBake: jbake -b
activate JBake

JBake -> parser: পড়ুন article.fr.adoc
activate parser
parser --> JBake: সামগ্রী + মেটাডেটা\n(lang=fr, article-id=xyz)
deactivate parser

JBake -> parser: পড়ুন article.en.adoc
activate parser
parser --> JBake: বিষয় + মেটাডেটা\n(lang=en, article-id=xyz)
deactivate parser

JBake -> thymeleaf: পৃষ্ঠা তৈরি করুন FR
activate thymeleaf

thymeleaf -> i18n: সমাধান করুন #{nav.home}
activate i18n
i18n -> messages: পড়ুন messages_fr.properties
messages --> i18n: "হোম"
i18n --> thymeleaf: "হোম"
deactivate i18n

thymeleaf -> JBake: অনুসন্ধান অনুবাদ\n(article-id=xyz, lang!=fr)
JBake --> thymeleaf: article.en.html পাওয়া গেছে

thymeleaf --> JBake: /fr/blog/article.html
deactivate thymeleaf

JBake -> thymeleaf: ইংরেজি পৃষ্ঠা তৈরি
activate thymeleaf

thymeleaf -> i18n: সমাধান করুন #{nav.home}
activate i18n
i18n -> messages: পড়ো messages_en.properties
messages --> i18n: "Home"
i18n --> thymeleaf: "Home"
deactivate i18n

thymeleaf -> JBake: অনুসন্ধান অনুবাদ\n(article-id=xyz, lang!=en)
JBake --> thymeleaf: article.fr.html পাওয়া গেল

thymeleaf --> JBake: /en/blog/article.html
deactivate thymeleaf

JBake --> Auteur: সাইট তৈরি করা হয়েছে
deactivate JBake
@enduml

JBake-এ লোকেল কনফিগারেশন

আপনার ফাইলে`jbake.properties`, ডিফল্ট লোকেল সেট করুন :

# Locale par défaut
thymeleaf.locale=fr

# Encodage
template.encoding=UTF-8

I18n নিবন্ধগুলো : ফোল্ডার অনুযায়ী সংগঠন

প্রবাহ চিত্র (Flow) - জেনারেশন

@startuml
start

:পড়া jbake.properties;
:কনফিগারেশন i18n লোড করুন;

partition "প্রতিটি ফাইলের জন্য AsciiDoc" {
  :পড়ুন মেটাডেটা\n(:jbake-lang:, :jbake-article-id:);
  :বিষয়বস্তু পার্স AsciiDoc;
  :ভাষায় মেমোরি সংরক্ষণ;
}

partition "প্রতিটি টেমপ্লেটের জন্য" {
  :টেমপ্লেট লোড করুন Thymeleaf;
  :লক্ষ্য ভাষার শনাক্তকারী;
  :লোড messages_{lang}.properties;

  partition "কন্টেন্ট ফিল্টারিং" {
    :ভাষা অনুযায়ী শনাক্ত;
    :গ্রুপ কর অনুবাদ\nদ্বারা article-id;
  }

  :টেমপ্লেট i18n ব্যবহার করে প্রয়োগ করুন;
  :HTML তৈরি করুন /{lang}/;
}

:স্ট্যাটিক এসেটগুলি কপি করুন;
:বহুভাষিক সাইটম্যাপ তৈরি করুন;
:প্রবাহ RSS তৈরি করুন প্রতিটি ভাষায়;

stop
@enduml

ফোল্ডারের গঠন

ফাইলের নামে সাফিক্সের ব্যবহার পরিবর্তে, আমি আরও স্পষ্টতা ও রক্ষণাবেক্ষণের সুবিধা প্রদান করে এমন একটি ফোল্ডার ভিত্তিক সংগঠন বেছে নিয়েছিলাম:

content/blog/
├── 2024/
│   ├── fr/
│   │   ├── introduction-jbake.adoc
│   │   ├── guide-thymeleaf.adoc
│   │   └── astuces-asciidoc.adoc
│   └── en/
│       ├── introduction-jbake.adoc
│       ├── thymeleaf-guide.adoc
│       └── asciidoc-tips.adoc
└── 2025/
    ├── fr/
    │   └── internationalisation-jbake.adoc
    └── en/
        └── jbake-internationalization.adoc

এই পদ্ধতির সুবিধা

এই কাঠামোর چندین সুবিধা রয়েছে:

  • স্পষ্ট বিছেদ: প্রতিটি ভাষার নিজস্ব স্থান আছে

  • ফ্লেক্সিবল নামকরণফাইলগুলো ভাষা অনুযায়ী ভিন্ন নাম রাখতে পারে।

  • স্কেলেবিলিটিনতুন ভাষা যোগ করা সহজ

  • স্বাভাবিক সংগঠনJBake- এর সময়গত যুক্তি অনুসরণ করে

মেটাডেটা অনুচ্ছेदের

প্রতিটি নিবন্ধে অনুবাদদের মধ্যে সংযোগ করার জন্য মেটাডেটা অন্তর্ভুক্ত থাকতে হবে। এখানে একটি উদাহরণ আছে:

ফরাসি সংস্করণ(2025/fr/internationalisation-jbake.adoc) :

= Internationalisation d'un site statique JBake
:jbake-type: post
:jbake-status: published
:jbake-date: 2025-10-20
:jbake-lang: bn
:jbake-article-id: jbake-i18n-thymeleaf
:jbake-tags: jbake, thymeleaf, i18n
:jbake-description: Guide pour mettre en place l'i18n avec JBake

ইংরেজি সংস্করণ(2025/en/jbake-internationalization.adoc) :

= Internationalizing a JBake Static Site
:jbake-type: post
:jbake-status: published
:jbake-date: 2025-10-20
:jbake-lang: bn
:jbake-article-id: jbake-i18n-thymeleaf
:jbake-tags: jbake, thymeleaf, i18n
:jbake-description: Guide to implement i18n with JBake

অ্যাট্রিবিউট`:jbake-article-id:`গুরুত্বপূর্ণ : এর বিভিন্ন অনুবাদগুলোকে একত্রিত করার অনুমতি দেয়।

URL কনফিগারেশন

মধ্যে`jbake.properties`, ভাষা شامل করার জন্য ইউআরএল প্যাটার্ন কনফিগার করুণ:

# Pattern d'URL avec langue
post.permalink.pattern=:lang/blog/:year/:name.html

# Langue par défaut
site.default.lang=fr

এটি এই ধরণের URL তৈরি করবে :

  • /fr/blog/2025/internationalisation-jbake.html

  • /en/blog/2025/jbake-internationalization.html

বহুভাষিক প্রদর্শনের জন্য টেমপ্লেট

ভাষা seçimকার সহ আর্টিকেল টেমপ্লেট

একটি টেমপ্লেট তৈরি করুন`post.html`উপলব্ধ অনুবাদগুলোকে দেখায় :

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <title th:text="${content.title}">Article</title>
</head>
<body>
    <article>
        <header>
            <h1 th:text="${content.title}">Titre</h1>

            <div class="article-meta">
                <time th:text="${#dates.format(content.date, 'dd MMMM yyyy')}"
                      th:attr="datetime=${#dates.format(content.date, 'yyyy-MM-dd')}">
                    Date
                </time>

                <!-- Sélecteur de traductions -->
                <div class="translations" th:if="${content['article-id']}">
                    <span th:text="#{article.also.available}">Aussi disponible en :</span>
                    <ul class="language-list">
                        <li th:each="post : ${published_posts}"
                            th:if="${post['article-id'] == content['article-id'] and post.lang != content.lang}">
                            <a th:href="${post.uri}"
                               th:text="${post.lang.toUpperCase()}">
                                LANG
                            </a>
                        </li>
                    </ul>
                </div>
            </div>
        </header>

        <div class="content" th:utext="${content.body}">
            Contenu de l'article
        </div>

        <footer class="article-footer">
            <div class="tags" th:if="${content.tags}">
                <span th:text="#{article.tags}">Étiquettes :</span>
                <span th:each="tag : ${content.tags}">
                    <a th:href="@{/tags/{tag}.html(tag=${tag})}"
                       th:text="${tag}">tag</a>
                </span>
            </div>
        </footer>
    </article>
</body>
</html>

ভাষারためにフィルターされたインデックス

প্রতিটি ভাষার জন্য ইন্ডেক্স টেমপ্লেট তৈরি করুন:

index.html(index ফরাসি) :

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <title th:text="#{site.title}">Mon Blog</title>
</head>
<body>
    <main>
        <h1 th:text="#{nav.blog}">Blog</h1>

        <div class="articles-list">
            <article th:each="post : ${published_posts}"
                     th:if="${post.lang == 'fr'}">
                <h2>
                    <a th:href="${post.uri}" th:text="${post.title}">Titre</a>
                </h2>
                <time th:text="${#dates.format(post.date, 'dd MMMM yyyy')}">
                    Date
                </time>
                <p th:text="${post.description}">Description</p>
                <a th:href="${post.uri}" th:text="#{article.readmore}">
                    Lire la suite
                </a>
            </article>
        </div>
    </main>
</body>
</html>

index_en.html(ইঙ্গরেজি ইন্ডেক্স) :

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <title th:text="#{site.title}">My Blog</title>
</head>
<body>
    <main>
        <h1 th:text="#{nav.blog}">Blog</h1>

        <div class="articles-list">
            <article th:each="post : ${published_posts}"
                     th:if="${post.lang == 'en'}">
                <h2>
                    <a th:href="${post.uri}" th:text="${post.title}">Title</a>
                </h2>
                <time th:text="${#dates.format(post.date, 'dd MMMM yyyy')}">
                    Date
                </time>
                <p th:text="${post.description}">Description</p>
                <a th:href="${post.uri}" th:text="#{article.readmore}">
                    Read more
                </a>
            </article>
        </div>
    </main>
</body>
</html>

ভাষাগুলোর মধ্যে নেভিগেশন

বিশ্ব ভাষা নির্বাচক

প্রবাহ চিত্র - ব্যাবহারকারী পঠন

@startuml
start

:ব্যবহারকারী সাইটে প্রবেশ করে;

if (Langue préférée ?) then (FR)
  :প্রদর্শন /index.html;
  :FR নিবন্ধ তালিকা করুন;
else (EN)
  :দেখান /en/index.html;
  :EN অনুষদের তালিকা;
endif

:ব্যবহারকারী নিবন্ধে ক্লিক করে;

:আর্টিকেল\nমেটাডেটা দেখান;

if (Traductions disponibles ?) then (oui)
  :প্রদর্শন নির্বাচক\nde অনুবাদ;

  if (Changement de langue ?) then (oui)
    :পুনর্নির্দেশ করুন\nঅনুবাদ;
    :article\nকে নতুন ভাষায় দেখান;
  else (non)
    :অবিরত পড়ুন;
  endif
else (non)
  :আরো পড়ুন;
endif

stop
@enduml

আপনার প্রধান টেমপ্লেটে একটি ভাষা নির্বাচক যোগ করুন:

<nav class="language-switcher">
    <a href="/index.html"
       th:classappend="${content.lang == 'fr'} ? 'active'"
       title="Français">
        🇫🇷 FR
    </a>
    <a href="/en/index.html"
       th:classappend="${content.lang == 'en'} ? 'active'"
       title="English">
        🇬🇧 EN
    </a>
</nav>

সিলেক্টরের জন্য CSS স্টাইল

.language-switcher {
    display: flex;
    gap: 1rem;
    padding: 0.5rem;
    background: #f5f5f5;
    border-radius: 4px;
}

.language-switcher a {
    padding: 0.5rem 1rem;
    text-decoration: none;
    color: #333;
    border-radius: 4px;
    transition: background 0.2s;
}

.language-switcher a:hover {
    background: #e0e0e0;
}

.language-switcher a.active {
    background: #007bff;
    color: white;
}

.translations {
    margin: 1rem 0;
    padding: 1rem;
    background: #f8f9fa;
    border-left: 4px solid #007bff;
}

.language-list {
    display: inline-flex;
    gap: 0.5rem;
    list-style: none;
    padding: 0;
    margin: 0;
}

.language-list li::after {
    content: "•";
    margin-left: 0.5rem;
}

.language-list li:last-child::after {
    content: "";
}

ভাষা অনুযায়ী RSS ফিড

ভাষা অনুযায়ী পৃথক RSS ফিডের জন্য, পৃথক টেম্পলেট তৈরি করুন :

feed.xml(ফ্রাঙ্কসীয় প্রবাহ) :

<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:th="http://www.thymeleaf.org">
    <channel>
        <title th:text="#{site.title}">Mon Blog</title>
        <link th:text="${config.site_host}">http://example.com</link>
        <description th:text="#{site.description}">Description</description>
        <language>fr</language>

        <item th:each="post : ${published_posts}"
              th:if="${post.lang == 'fr'}">
            <title th:text="${post.title}">Titre</title>
            <link th:text="${config.site_host + post.uri}">Lien</link>
            <pubDate th:text="${#dates.format(post.date, 'EEE, dd MMM yyyy HH:mm:ss Z')}">
                Date
            </pubDate>
            <description th:text="${post.description}">Description</description>
        </item>
    </channel>
</rss>

ভালো অভ্যাস এবং টিপস

আর্টিকেল আইডির সামঞ্জস্য

Assurez-vous que `:jbake-article-id:`একই নিবন্ধের সমस्त অনুবাদে একই হয়। একগত ফরম্যাট ব্যবহার করুন :

  • বিশ্বব্যাপীতার জন্য ইংরেজি শনাক্তকারী প্রাধান্য দিন

  • শব্দগুলোকে আলাদা করতে হাইফেন ব্যবহার করুন

  • বিশেষ অক্ষর এড়িয়ে চলুন

2. সংগত তারিখ

একটি নিবন্ধের সমস্ত অনুবাদের একই প্রকাশ তারিখ হওয়া উচিত।:jbake-date:) "এটি শ্রেণীবিন্যাস ও সময়ানুক্রমিক প্রদর্শনকে সহজ করে।

3. বহুভাষিক ট্যাগ

ট্যাগগুলির জন্য, আপনার দুটি विकল্প আছে :

বিকল্প ১ : ইংরেজি সর্বজনীন ট্যাগ

:jbake-tags: java, spring-boot, microservices

বিকল্প ২: ট্যাগগুলো মানচিত্রের মাধ্যমে অনুবাদিত

# Version française
:jbake-tags: java, spring-boot, microservices

# Version anglaise
:jbake-tags: java, spring-boot, microservices

৪. অনুবাদ না হওয়া বিষয়들의 ব্যবস্থাপনা

সকল পাতা অনুবাদ করা বাধ্যতামূলক নয়। যদি কোনো পাতা শুধুমাত্র এক ভাষায় থাকলেই, তবে তা অন্য ভাষার তালিকায় সহজে দেখা যাবে না।

5. সাইটম্যাপ বহুভাষিক

সব ভাষা অন্তর্ভুক্ত করতে একটি সাইটম্যাপ তৈরি করুন :

<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
        xmlns:xhtml="http://www.w3.org/1999/xhtml"
        xmlns:th="http://www.thymeleaf.org">
    <url th:each="post : ${published_posts}">
        <loc th:text="${config.site_host + post.uri}">URL</loc>
        <lastmod th:text="${#dates.format(post.date, 'yyyy-MM-dd')}">Date</lastmod>

        <!-- Liens alternatifs pour les traductions -->
        <xhtml:link th:each="translation : ${published_posts}"
                    th:if="${translation['article-id'] == post['article-id'] and translation.lang != post.lang}"
                    rel="alternate"
                    th:attr="hreflang=${translation.lang},href=${config.site_host + translation.uri}" />
    </url>
</urlset>

উপসংহার

JBake সাইটের Thymeleaf‑এ আন্তর্জাতিকীকরণ একটি শক্তিশালী এবং রক্ষণযোগ্য পদ্ধতি। টেমপ্লেটিং থেকে i18n‑কে (বার্তা ফাইলগুলির melalui) পৃथক করে এবং কন্টেন্ট i18n‑কে (ফোল্ডার সংগঠনের মাধ্যমে) পৃথক করলে, আপনি একটি নমনীয় সিস্টেম পাবেন যা সহজে বিকাশ করা যায়।

মনে রাখতে গুরুত্বপূর্ণ বিষয়গুলো:

  • Thymeleaf বার্তা ফাইলগুলোব্যবহারকারী ін্টারফেসের জন্য

  • ফোল্ডারের অনুযায়ী সংগঠন(বছর/ভাষা) জন্য পবন্ধগুলো

  • লেখের শনাক্তকারীঅনুবাদগুলোকে যুক্ত করার জন্য

  • নির্দিষ্ট টেমপ্লেট pour chaque langue

  • URL স্পষ্টভাষা কোড অন্তর্ভুক্ত

প্রসারণ ডায়াগ্রাম

@startuml
node "বিকাশ মেশিন" {
  artifact "উৎস" {
    folder "বিষয়বস্তু/"
    folder "টেমপ্লেট/"
    folder "অ্যাসেট/"
  }

  component "JBake CLI" as jbake

  Sources --> jbake : jbake -b
}

node "বিল্ড সার্ভার\n(CI/CD)" {
  component "GitHub কর্ম\nবা GitLab CI" as ci

  jbake --> ci : push
}

cloud "CDN / hôsting" {
  node "স্ট্যাটিক ওয়েব সার্ভার" {
    artifact "উৎপন্ন সাইট" {
      folder "/fr/blog/"
      folder "/en/blog/"
      folder "/assets/"
    }
  }
}

ci --> "উৎপন্ন সাইট" : déploiement

actor "পাঠক" as users

users --> "স্ট্যাটিক ওয়েব সার্ভার" : HTTPS
@enduml

এই আর্কিটেকচার আপনাকে সহজে দুটি ভাষায় শুরু করতে দেয় এবং প্রধান রিফ্যাক্টরিং ছাড়াই অন্যান্য ভাষা যোগ করে দেওয়া যায়। সবকিছু সম্পূর্ণভাবে স্ট্যাটিক ও কর্মক্ষম, JBake দর্শরের সাথে নিষ্ঠাবদ্ধ permanece।

শুভ বহুভাষিক বিকাশ! 🌍

সম্পর্কিত নিবন্ধ