JavaRush /Java Blog /Random-TK /Köp dilli programmany durmuşa geçirmek

Köp dilli programmany durmuşa geçirmek

Toparda çap edildi
Köp dilli programmany durmuşa geçirmek - 1

Bu gün köp dilli bolmak hakda gürleşeris. Onda näme?

Köp dilli bolmak, başgaça aýdylanda, halkaralaşmak , programma logikasyny üýtgetmän birnäçe dile uýgunlaşyp boljak programmany ösdürmegiň bir bölegidir. Situationagdaýy göz öňünde tutuň: köp sanly ýurduň ýaşaýjylary üçin, mysal üçin rus, iňlis we ispan dilleri gürleşilýän uly söwda kompaniýasy üçin web programmasy döredýärsiňiz. Usershli ulanyjylar üçin amatly etmeli. Bu pikir şeýledir: rus dilinde gürleýän okyjynyň maglumatlaryňyzy rus dilinde görmäge mümkinçiligi bolmaly, bir amerikaly üçin materialy iňlis dilinde, ispan üçin bolsa ispan dilinde okamak has amatly bolar (garaşylmadyk ýagdaýda, şeýlemi?) Köp dilli programmany durmuşa geçirmek - 2şu gün birnäçe halkaralaşma modelini göz öňünde tutýarys we olaryň biri üçin (iň halanýan zadym :) Geliň Java-da durmuşa geçirilişine seredeliň. Gwineýa doňuzy hökmünde şu gün film maglumatlar tagtasy bolar. Gaty ýoýalyň, şonuň üçin köp gürleýjimiz bolmaz. Mysal üçin, bu gowy. Filmleriň (reorsissýorlar - goşmaçalar üçin) atlaryny terjime ederis: Köp dilli programmany durmuşa geçirmek - 3

1. Her dil üçin terjime edilen tablisa

Bu modeliň düýp manysy: terjime edilmegini talap edýän ähli öýjükleri öz içine alýan maglumatlar bazasynda her diliň aýratyn tablisasy bar. Bu usulyň ýetmezçiligi, her gezek täze dil goşanymyzda, täze tablisa goşmalydyrys. Customeragny, müşderimiziň gaty gowy işleýändigini göz öňüne getireliň we ýüz tutmasyny dünýäniň köp ýurtlaryna (aslynda dillere) giňeldýär. Diýmek, her dile bir planşet goşmaly bolarsyňyz. Netijede, maglumatlar bazasynyň ýarysy ýa-da tutuşlygyna diýen ýaly kömekçi terjime tablisalaryndan ybarat bolar: Köp dilli programmany durmuşa geçirmek - 4 Filmleriň shemasy: Köp dilli programmany durmuşa geçirmek - 5Terjime tablisalary:
  • Rus Köp dilli programmany durmuşa geçirmek - 6
  • Ispan Köp dilli programmany durmuşa geçirmek - 7
  • Iňlis Köp dilli programmany durmuşa geçirmek - 8

2. Hemmeler üçin biri

Belli bir modele degişli her tablisada dil plastinkasy üçin kesgitleýji meýdan goşulýar. Şoňa laýyklykda maglumatlar binýadynda terjimeler bilen bu tablisa hem bar. Mesele, bir obýektiň birnäçe terjime (dillere) gabat gelmegidir. Netijede, subýektleriň köpeldilmegi bolar we bu logikany gaty bulaşdyrýar we çylşyrymlaşdyrýar we bu gowy däl. UML-e seredýäris: Köp dilli programmany durmuşa geçirmek - 9 Stol filmleri: Köp dilli programmany durmuşa geçirmek - 10 Stol dilleri: Köp dilli programmany durmuşa geçirmek - 11

3. Dil üçin sütün

Tablisadaky her dil üçin her sütün üçin aýratyn terjime sütüni döredilýär. Bu çemeleşmäniň ýetmezçiligi, ýene-de köp sanly dil goşulsa, maglumatlar bazasynyň gurluşyny her gezek üýtgetmeli we bu erbet çemeleşme hasaplanýar. Şeýle hem halkaralaşmagy talap edýän alamatlaryň nähili çişjekdigini göz öňüne getiriň. Goldanýan dilleriň sany öňünden bilinýän, olardan kän däl we her model diliň dürli görnüşlerinde bolmaly bir modeli göz öňünde tutup bileris. UML: Köp dilli programmany durmuşa geçirmek - 12inchli öz içine alýan tablisa: Köp dilli programmany durmuşa geçirmek - 13

4. Daşarky terjime

Bu opsiýa daşarky gurallary birikdirmek arkaly amala aşyrylýar (Google translate, Bing translate we ş.m.). Mümkin boldugyça köp myhmanlara maglumat bermeli bolsaňyz ulanylýar we bu maglumatlar gaty köp. Örän köp. Bu ýagdaýda maglumatlary maglumatlar bazasynda gönüden-göni ähli dillerde saklamak däl-de, ony dinamiki terjime etmek kararyna gelip bilersiňiz. Machineöne ýatdan çykarmaly däldiris, maşyn terjimesiniň hili köplenç islenýän zady galdyrýar. Bu warianty diňe tygşytly hasaplamak bolar (her neşiri terjime etmek üçin çeşme ýok wagty). Dogry terjime nukdaýnazaryndan umumy mesele, dilini gowy bilmeýän terjimeçileriň sözüň nädogry manysyny saýlamagy we ulanyjyny bulaşdyrmak, düwmä ýazylanlaryň manysyny özbaşdak kesgitlemäge mejbur etmegi. Diňe sözlemi dogry terjime etmek bilen çäklenmän, manysyny belli bir dile we millete ýetirmek hem möhümdir. Döredijiler käbir dillerde jynslar bilen baglanyşykly köp kynçylyk çekýärler. Ulanyjynyň jynsyna baglylykda kodyndaky sözlemi köpeltmeli we diňe atlaryň jynsynyň bolman, eýsem sypatlaryň we işlikleriň başgaça täsir edýändigini hem göz öňünde tutmalydyrlar. Programmada iňlis dilinden başga dili saýlap, saýlanan diliň sözleri bilen birlikde henizem terjime edilmedik elementler bar. Birnäçe dil görkezilse we hemme zat garyşyp, ulanyjy programma düşünip bilmeýän Wawilonyň bir görnüşi bolup çyksa hasam erbet. Mysal üçin: https://cloud.google.com/translate/

5. Programma derejesini goldaýan faýllar

Terjimeleri saklamak üçin aýratyn faýllar döredilýär. Dil üçin bir faýl ýa-da planşet üçin bir dilde bir faýl bolup biler (inçe ezmek). Bu opsiýa köplenç bu faýllarda köp tekstiň saklanyp bilinýändigi sebäpli ulanylýar, bu bolsa tablisalaryň we maglumat bazasynyň özi çişmejekdigini aňladýar. Anotherene bir amatlylyk, bu meýdanlar üçin maglumat bazasyny açmak hökman däl we koddaky faýllar talap edilýän dile baglylykda dinamiki çalşylyp bilner. Netijede, faýl biziň üçin sözlük bolup hyzmat edýär, onda açar dil, gymmaty tekstdir. Emma aşakdaky ".properties" formaty bilen çäklenmeýäris we bu faýl formatlary dürli-dürli bolup biler - JSON, XML we ş.m. Adetmezçilikleri, bu ýagdaýda maglumatlar bazasynyň kadalaşmagy ep-esli azalýar. Mundan başga-da, maglumatlaryň bitewiligi diňe maglumatlar bazasyna däl-de, eýsem seriýalaşdyrmak mehanizmine hem baglydyr. Bu mowzukda ajaýyp makala Terjimeler bilen sözlük faýllarynyň mysaly: Köp dilli programmany durmuşa geçirmek - 14
  • Iňlis Köp dilli programmany durmuşa geçirmek - 15
  • Rus Köp dilli programmany durmuşa geçirmek - 16
  • Ispan Köp dilli programmany durmuşa geçirmek - 17

6. Her tablisanyň kömekçi terjime tablisasy

Meniň pikirimçe, iň çeýe çözgüt. Bu çemeleşmäniň düýp manysy, diller üçin aýratyn tablisa döretmekdir. Soralýan tablisa üçin terjime mümkinçiligini durmuşa geçirmek zerur bolanda, dil tablisasy bilen baglanyşyk döredilýär we baglanyşyk tablisasynda dil ID, element ID we terjimeler bilen sütünler bar. Bu ses ýaly gorkunç däl. Bu çemeleşme, goldanýan dilleriň ýeterlik çeýe giňelmegine mümkinçilik berýär. Geliň, has içgin seredeliň. UML: Köp dilli programmany durmuşa geçirmek - 18Filmler bilen tablisa: Köp dilli programmany durmuşa geçirmek - 19Dilleriň tablisasy: Köp dilli programmany durmuşa geçirmek - 20Terjimeleriň tablisasy: Köp dilli programmany durmuşa geçirmek - 21 aboveokarda aýdyşym ýaly, Java kodundaky wariantlaryň biriniň durmuşa geçirilişine seredeliň (düşünşiňiz ýaly, bu iň soňky wariant bolar). Programmanyň özünde beýle zat ýok: dolandyryjylardan tao gatlaklaryna geçeris. Dörediş usulyna serederis - mysal üçin bu ýeterlikdir. Geliň, gideli)) Biziň manymyz film:
@Builder
@Getter
public class Movie {

   private Long id;

   private String producer;
}
Gyzykly zat ýok, diňe birinji tablisanyň modelini durmuşa geçiriň. Dto (Maglumat geçiriş obýekti) öwrüjileri bilen dolandyryjy:
@RestController
@RequiredArgsConstructor
@RequestMapping(path = "/cities")
public class MovieController {

   private final MovieService movieService;

   @PostMapping
   public ResponseEntity<moviedto> create(MovieDTO movieDTO) {
       return new ResponseEntity<>(toDTO(movieService.create(fromDTO(movieDTO), movieDTO.getNameTranslations()), movieDTO.getNameTranslations()), HttpStatus.CREATED);
   }

   private Movie fromDTO(MovieDTO dto) {
       return Movie.builder()
               .id(dto.getId())
               .producer(dto.getProducer())
               .build();
   }

   private MovieDTO toDTO(Movie movie, Map<string, string=""> nameTranslation) {
       return MovieDTO.builder()
               .id(movie.getId())
               .producer(movie.getProducer())
               .nameTranslations(nameTranslation)
               .build();
   }
}
DTO-da terjimeleri karta hökmünde geçirýäris, açar diliň gysgaldylmagy, gymmaty terjime bahasy (filmiň ady). DTO:
@Builder
@Getter
@NoArgsConstructor
@AllArgsConstructor
public class MovieDTO {

   @JsonProperty("id")
   private Long id;

   @JsonProperty("name")
   private String producer;

   @JsonProperty("nameTranslations")
   private Map<String, String> nameTranslations;//example = "{'en': 'The Matrix', 'ru' : 'Матрица'}"
}
Bu ýerde dto synpynyň özi, ýokarda ýazylyşy ýaly, terjimeleriň kartasy, galan meýdanlar Kino modeliniň ekranydyr. Geliň, kino hyzmatyna geçeliň:
public interface MovieService {

   Movie create(Movie movie, Map nameList);
}
Ony durmuşa geçirmek:
@Service
@RequiredArgsConstructor
public class MovieServiceImpl implements MovieService {

   private final MovieDAO movieDAO;
   private LanguageService languageService;

   @Override
   public Movie create(Movie movie, Map<string, string=""> nameList) {
       movieDAO.create(movie);
       Map<Long, String> map = new HashMap<>();
       nameList.forEach((x, y) -> map.put(languageService.getIdByLangCode(x), y));
       movieDAO.createTranslator(movie.getId(), map);
       return movie;
   }
}
Bu ýerde dil ID-ni gysgaltmak arkaly almak üçin birneme üçünji tarap “LanguageService” hyzmatynyň ulanylyşyny görýäris. Bu kesgitleýji bilen terjimelerimizi (karta görnüşinde hem) baglanyşyk tablisasyna ýazdyrýarys. DAO-a seredeliň:
public interface MovieDAO {

   void create(Movie movie);

   void createTranslator(Long movieId, Map<Long,String> nameTranslations);
}
Durmuşa geçirmek:
@RequiredArgsConstructor
@Repository
public class MovieDAOImpl implements MovieDAO {
   private final JdbcTemplate jdbcTemplate;

   private static final String CREATE_MOVIE = "INSERT INTO movies(id, producer) VALUES(?, ?)";

   private static final String CREATE_TRANSLATOR = "INSERT INTO movies_translator(movies_id, language_id, name) VALUES(?, ?, ?)";

   @Override
   public void create(Movie movie) {
       jdbcTemplate.update(CREATE_MOVIE, movie.getId(), movie.getProducer());
   }

   @Override
   public void createTranslator(Long movieId, Map<Long, String> nameTranslations) {
       nameTranslations.forEach((x, y) -> jdbcTemplate.update(CREATE_TRANSLATOR, movieId, x, y));
   }
}
Bu ýerde onuň manysynyň we dilleriniň saklanmagyny görýäris (sözlük). Hawa, Bahar JDBC bu ýerde ulanylýar: Has açyk bolany üçin, täze başlanlar üçin has amatly hasaplaýaryn. Geliň, “üçünji tarap” hyzmatyna geçeliň. Dil hyzmaty:
public interface LanguageService {

   Long getIdByLangCode(String lang);
}
Durmuşa geçirmek:
@Service
@RequiredArgsConstructor
public class LanguageServiceImpl implements LanguageService {
   private final LanguageDAO languageDAO;

   @Override
   public Long getIdByLangCode(String lang) {
       return languageDAO.getIdByLangCode(lang);
   }
}
Üýtgeşik zat ýok, gysgaldylan at bilen gözläň. DAO:
public interface LanguageDAO {

   Long getIdByLangCode(String lang);
}
Durmuşa geçirmek:
@RequiredArgsConstructor
@Repository
public class LanguageDAOImpl implements LanguageDAO {
   private final JdbcTemplate jdbcTemplate;

   private static final String FIND_ID_BY_LANG_CODE = "SELECT id FROM languages WHERE lang_code = ?";

   @Override
   public Long getIdByLangCode(String lang) {
       return jdbcTemplate.queryForObject(FIND_ID_BY_LANG_CODE, Long.class, lang);
   }
}
Gurluşy: Köp dilli programmany durmuşa geçirmek - 23 aboveokarda beýan edilen modelleriň hemmesiniň ýaşamaga hukugy bar. Haýsy ýagdaýa görä ulanmalydygyny çözmeli. Elbetde, bularyň hemmesi däl: dürli diller üçin dürli maglumat bazalaryny ulanmak, keşleri, dürli çarçuwalary we ş.m. goşmak bilen başga-da köp dürli çemeleşmeler bar. Bu gün meniň üçin we ... Köp dilli programmany durmuşa geçirmek - 24
Teswirler
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION