# თავი 9: ინტერნაციონალიზაცია და ლოკალიზაცია --- ## 9.1 თქვენი აპლიკაციის მულტილინგვურად (მრავალენოვნად) ქცევა აქამდე განხილულ ყველა თავში ვვარაუდობდით, რომ აპლიკაცია ერთენოვანია. ჩვენი თარგები (templates) აჩვენებს ინგლისურ ტექსტს, ვალიდაციის შეტყობინებები ინგლისურადაა და შეცდომის გვერდებიც ინგლისურად "საუბრობენ". ეს მისაღებია, როცა თქვენი აუდიტორია ერთ ენას იზიარებს, თუმცა ბევრ აპლიკაციას სჭირდება სხვადასხვა რეგიონის მომხმარებლების მომსახურება — ეს მომხმარებლები კი მოელიან, რომ ინტერფეისი მათ მშობლიურ ენაზე იქნება. ეს თავი გაგაცნობთ **ინტერნაციონალიზაციას (i18n)** და **ლოკალიზაციას (l10n)** Spring Boot-ში. ჩვენ ვისწავლით, როგორ გადავიტანოთ მომხმარებლისთვის განკუთვნილი ყველა ტექსტი გარე **message bundles**-ში, როგორ განვსაზღვროთ მომხმარებლის ლოკალი (locale), როგორ მივცეთ მათ ენის შეცვლის საშუალება და როგორ გამოვაჩინოთ ლოკალიზებული შეტყობინებები FreeMarker-ის თარგებში. ასევე განვიხილავთ ლოკალიზაციას REST API-ებში, ვალიდაციის შეტყობინებებში, Spring Security-ის გვერდებზე და თარიღებისა და რიცხვების ფორმატირებაში. ბოლოს, ვნახავთ თარგმანების მონაცემთა ბაზაში შენახვის გზას იმ აპლიკაციებისთვის, რომლებსაც დინამიური მართვა სჭირდებათ. --- ## 9.2 ინტერნაციონალიზაცია vs. ლოკალიზაცია ეს ორი ტერმინი დაკავშირებულია, მაგრამ განსხვავებული: **ინტერნაციონალიზაცია (i18n)** არის აპლიკაციის დაპროექტების პროცესი ისე, რომ მას *შეეძლოს* მრავალი ენისა და რეგიონის მხარდაჭერა კოდის ცვლილების გარეშე. ეს გულისხმობს ტექსტების ექსტრაქციას (ამოღებას) თარგებიდან და Java კოდიდან გარე ფაილებში, ასევე თარიღების, რიცხვებისა და ვალუტის ფორმატირებას ლოკალის გათვალისწინებით. i18n არის არქიტექტურული სამუშაო — მას აკეთებთ ერთხელ, რაც შესაძლებელს ხდის ლოკალიზაციას. **ლოკალიზაცია (l10n)** არის აპლიკაციის ადაპტაციის პროცესი კონკრეტული ლოკალისთვის — ტექსტის თარგმნა, თარიღის ფორმატების მორგება და რეგიონული კონვენციების დამუშავება. l10n არის კონტენტის სამუშაო — მას აკეთებთ თითოეული ენისთვის, რომლის მხარდაჭერაც გსურთ. ლოკალიზებული აპლიკაციისთვის ორი რამ არის აუცილებელი: თარგმნილი ტექსტური ფაილები (თითო ენაზე) და მექანიზმი იმის დასადგენად, თუ რომელი ენა სურს მიმდინარე მომხმარებელს. --- ## 9.3 Message Bundles Spring Boot იყენებს **message bundles**-ს — `.properties` ფაილების ნაკრებს, რომლებიც შეიცავენ თარგმნილ ტექსტებს საერთო იდენტიფიკატორით (key). ნაგულისხმევად, Spring Boot ეძებს ფაილებს სახელად `messages.properties` classpath-ზე (`src/main/resources/` დირექტორიაში). სამი ენის მხარდასაჭერად, ქმნით სამ ფაილს: ``` src/main/resources/ ├── messages.properties ← ნაგულისხმევი ენა (fallback) ├── messages_en.properties ← ინგლისური ├── messages_ka.properties ← ქართული └── messages_ru.properties ← რუსული ``` თითოეული ფაილი შეიცავს ერთსა და იმავე გასაღებებს (keys) სხვადასხვა თარგმნილი მნიშვნელობებით. **messages.properties** (ნაგულისხმევი — გამოიყენება მაშინ, როცა კონკრეტული ლოკალის ფაილი არ მოიძებნება): ```properties nav.home=Home nav.about=About Us nav.contact=Contact Us greeting=Welcome to our website! ``` **messages_ka.properties** (ქართული): ```properties nav.home=მთავარი nav.about=ჩვენ შესახებ nav.contact=კონტაქტი greeting=კეთილი იყოს თქვენი მობრძანება! ``` ლოკალის სუფიქსი მიჰყვება ISO 639-1 სტანდარტს — `en` ინგლისურისთვის, `ka` ქართულისთვის და ა.შ. Spring Boot ავტომატურად უსაბამებს მომხმარებლის ლოკალს შესაბამის ფაილს. ### Encoding (კოდირება) `.properties` ფაილების ნაგულისხმევი კოდირებაა ISO-8859-1, რომელიც არ უჭერს მხარს სიმბოლოებს ლათინური ანბანის გარეთ. ქართული ან რუსული ენებისთვის გაქვთ ორი გზა: გამოიყენოთ Unicode escape მიმდევრობები (მაგ: `\u10DB`), ან დააკონფიგურიროთ თქვენი IDE, რომ შეინახოს ფაილები **UTF-8** ფორმატში და `application.properties`-ში დაამატოთ: ```properties spring.messages.encoding=UTF-8 ``` --- ## 9.4 ლოკალიზებული შეტყობინებების ჩვენება FreeMarker-ში FreeMarker წვდება Spring-ის message bundles-ს `spring.ftl` მაკროსების საშუალებით. დააიმპორტეთ ბიბლიოთეკა თარგის თავში და გამოიყენეთ `<@spring.message>` ტექსტის ამოსაღებად: ```html <#import "/spring.ftl" as spring>