JavaRush /Блоги Java /Random-TG /Татбиқи замимаи бисёрзабонӣ

Татбиқи замимаи бисёрзабонӣ

Дар гурӯҳ нашр шудааст
Татбиқи замимаи бисёрзабонӣ - 1

Имрӯз мо дар бораи бисёрзабонӣ сӯҳбат хоҳем кард. Пас, ин чист?

Бисёрзабонӣ, ба ибораи дигар, интернационализатсия як қисми таҳияи барномаест, ки бидуни тағир додани мантиқи барнома метавонад барои якчанд забон мутобиқ карда шавад. Вазъиятро баррасӣ кунед: шумо барои як ширкати бузурги тиҷоратӣ барои сокинони шумораи зиёди кишварҳое, ки дар онҳо, масалан, бо забонҳои русӣ, англисӣ ва испанӣ ҳарф мезананд, веб-барнома эҷод мекунед. Шумо бояд онро барои ҳама корбарон қулай созед. Идея ин аст: хонандаи русзабон бояд имкон дошта бошад, ки маълумоти шуморо бо забони русӣ бубинад, барои як амрикоӣ хондани мавод ба забони англисӣ ва барои испанӣ бо забони испанӣ (ногаҳон, дуруст?) қулайтар хоҳад буд. Татбиқи замимаи бисёрзабонӣ - 2Имрӯз якчанд моделҳои байналмиллалиро баррасӣ кунед ва барои яке аз онҳо (ки аз ҳама бештар ба ман маъқул аст :) Биёед ба татбиқи Java назар андозем. Ҳамчун хуки гвинея имрӯз мо тахтаи маълумотҳои филм хоҳем дошт. Бигзор аз ҳад зиёд каҷрав нашавем, то сухангӯёни зиёд нахоҳем дошт. Масалан, ин хуб аст. Ва мо номи филмҳоро тарҷума мекунем (режиссёрҳо - барои изофаҳо): Татбиқи замимаи бисёрзабонӣ - 3

1. Ҷадвали бо тарҷума барои ҳар як забон

Мохияти ин модел: хар забон дар базаи маълумот чадвали алохида дорад, ки дар он хамаи ячейкахое, ки тарчумаро талаб мекунанд, дар бар мегирад. Камбудии ин усул дар он аст, ки ҳар дафъае, ки мо забони навро илова мекунем, мо бояд ҷадвали нав илова кунем. Яъне, биёед тасаввур кунем, ки муштарии мо хеле хуб кор мекунад ва ӯ барномаи худро дар бисёре аз кишварҳои (воқеъ, забонҳои) ҷаҳон васеъ мекунад. Ин маънои онро дорад, ки шумо бояд ба ҳар забон як планшет илова кунед. Дар натиҷа, мо як пойгоҳи додаҳо дорем, ки нисфи ё қариб пурра аз ҷадвалҳои тарҷумаи ёрирасон иборат аст: Татбиқи татбиқи бисёрзабона - 4 Схемати худи филмҳо: Татбиқи замимаи бисёрзабонӣ - 5Ҷадвалҳои тарҷума:
  • русӣ Татбиқи барномаҳои бисёрзабона - 6
  • испанӣ Татбиқи татбиқи бисёрзабона - 7
  • англисӣ Татбиқи замимаи бисёрзабонӣ - 8

2. Як кас барои ҳама

Дар ҳар як ҷадвале, ки ба модели мушаххас тааллуқ дорад, майдон бо идентификатор барои лавҳаи забон илова карда мешавад. Мувофиқи он, базаи маълумот инчунин ин ҷадвалро бо тарҷумаҳо дар бар мегирад. Масъала дар он аст, ки як an object метавонад ба якчанд тарҷума (забон) мувофиқат кунад. Дар натиҷа, такроршавии субъектҳо ба амал меояд ва ин мантиқро хеле печида ва мушкил мекунад ва ин хуб нест. Мо ба UML назар мекунем: Татбиқи татбиқи бисёрзабона – 9 Филмҳои ҷадвал: Татбиқи барномаҳои бисёрзабона – 10 Забонҳои ҷадвал: Татбиқи татбиқи бисёрзабона – 11

3. Сутун барои як забон

Барои ҳар як сутун барои ҳар як забони ҷадвал сутуни тарҷумаи алоҳида сохта мешавад. Камбудии ин равиш дар он аст, ки боз, агар шумораи зиёди забонҳо илова карда шаванд, сохтори пойгоҳи додаҳо бояд ҳар дафъа тағир дода шавад ва ин равиши бад ҳисобида мешавад. Инчунин тасаввур кунед, ки нишонаҳо, ки интернационализатсияро талаб мекунанд, то чӣ андоза пурқувват хоҳанд буд. Мумкин аст, ки моделеро баррасӣ кунед, ки шумораи забонҳои дастгирӣ пешакӣ маълум аст, шумораи онҳо аз ҳад зиёд нест ва ҳар як модел бояд дар ҳама вариантҳои забон мавҷуд бошад. UML: Татбиқи татбиқи бисёрзабона - 12Ҷадвали ҳама чизро дар бар мегирад: Татбиқи татбиқи бисёрзабона – 13

4. Тарҷумаи беруна

Ин хосият тавассути пайваст кардани асбобҳои беруна (Google translate, Bing translate ва ғайра) амалӣ карда мешавад. Он истифода мешавад, агар ба шумо лозим аст, ки иттилоотро ба шумораи бештари меҳмонон пешниҳод кунед ва ин маълумот хеле зиёд аст. Ин қадар зиёд. Дар ин ҳолат шумо метавонед тасмим гиред, ки маълумотро дар базаи маълумот ба ҳама забонҳо мустақиман нигоҳ надоред, балки онро ба таври динамикӣ тарҷума кунед. Аммо бояд дар хотир дошт, ки сифати тарҷумаи мошин аксар вақт чизи дилхоҳро тарк мекунад. Вариантро метавон танҳо хеле сарфакорона ҳисоб кард (вақте ки барои тарҷумаи ҳар як нашрия захира мавҷуд нест). Мушкилоти маъмул дар робита ба тарҷумаи дуруст ин аст, ки тарҷумонҳое, ки забонро хуб намедонанд, маънои нодурусти калимаро интихоб карда, корбарро ба иштибоҳ андохта, ӯро маҷбур мекунанд, ки маънои он чи дар тугма навишта шудааст, мустақилона бифаҳмад. На танхо дуруст тарчима кардани чумла, балки ба забон ва миллати муайян расондани маънои онро низ зарур аст. Таҳиягарон бо ҷинсият дар баъзе забонҳо мушкилоти зиёде доранд. Онҳо бояд ибораро дар code вобаста ба ҷинси корбар такрор кунанд ва инчунин ба назар гиранд, ки на танҳо исмҳо ҷинс доранд, балки сифатҳо ва феълҳо ҳам ба таври гуногун ифлос мешаванд. Ҳолатҳое вуҷуд доранд, ки бо интихоби забони ғайр аз забони англисӣ дар замима, дар баробари калимаҳои забони интихобшуда, ҳанӯз ҳам унсурҳои тарҷуманашуда мавҷуданд. Аз ин ҳам бадтар аст, ки агар якчанд забонҳо нишон дода шаванд ва он як навъи Бобил аст, ки дар он ҳама чиз омехта шудааст ва корбар барномаро дарк карда наметавонад. Масалан: https://cloud.google.com/translate/

5. Файлҳои дастгирии сатҳи барнома

Барои нигоҳ доштани тарҷумаҳо файлҳои алоҳида сохта мешаванд. Он метавонад як файл барои як забон ё як файл барои як забон дар як планшет бошад (майда-чуйда). Ин хосият аксар вақт бо сабаби он истифода мешавад, ки матнҳои зиёде дар ин файлҳо нигоҳ дошта мешаванд, яъне ҷадвалҳо ва худи пойгоҳи додаҳо варам карда намешаванд. Бароҳатии дигар дар он аст, ки ба шумо лозим нест, ки пойгоҳи додаҳоро барои ин майдонҳо кушед ва файлҳои codeро вобаста ба забони дархостшуда динамикӣ иваз кардан мумкин аст. Дар натиҷа, файл барои мо ҳамчун луғат хизмат мекунад, ки дар он калид забон, арзишаш матн аст. Аммо мо бо формати ".properties" дар зер маҳдуд нестем ва ин форматҳои файл метавонанд ба таври васеъ фарқ кунанд - JSON, XML ва ғайра. Камбудихо дар он аст, ки дар ин сурат нормаи база хеле кам мешавад. Инчунин, якпорчагии маълумот дигар на танҳо аз пойгоҳи додаҳо, балки аз механизми сериализатсия низ вобаста аст. Мақолаи олӣ дар ин мавзӯъ Намунаи файлҳои луғат бо тарҷумаҳо: Татбиқи татбиқи бисёрзабона – 14
  • англисӣ Татбиқи татбиқи бисёрзабона – 15
  • русӣ Татбиқи барномаҳои бисёрзабона - 16
  • испанӣ Татбиқи татбиқи бисёрзабона – 17

6. Ҷадвали тарҷумаи ёрирасон барои ҳар як ҷадвал

Ба андешаи ман, ҳалли чандиртарин. Мохияти ин равиш ташкor чадвали алохида барои забонхо мебошад. Ҳангоми зарурати татбиқи имкони тарҷумаҳои ҷадвали мавриди назар, пайванд бо ҷадвали забонҳо сохта мешавад ва ҷадвали истинод идентификатсияи забон, ID элемент ва сутунҳоро бо тарҷумаҳо дар бар мегирад. Он қадар даҳшатнок нест, ки садо медиҳад. Ин равиш имкон медиҳад, ки васеъшавии хеле фасеҳи забонҳои дастгирӣшаванда. Биёед муфассалтар дида бароем. UML: Татбиқи барномаҳои бисёрзабона – 18Ҷадвали филмҳо: Татбиқи барномаҳои бисёрзабона - 19Ҷадвали забонҳо: Ҷадвали Татбиқи барномаҳои бисёрзабона - 20тарҷумаҳо: Татбиқи барномаҳои бисёрзабона - 21 Ва, тавре ки ман дар боло гуфтам, биёед ба татбиқи яке аз вариантҳо дар codeи Java назар андозем (чунон ки шумо мефаҳмед, ин варианти охирин хоҳад буд). Дар худи барнома чунин чизе вуҷуд надорад: мо аз контроллерҳо ба қабатҳои тао мегузарем. Мо усули эҷодро дида мебароем - барои мисол ин кифоя аст. Пас биёед)) Мохияти мо филм аст:
@Builder
@Getter
public class Movie {

   private Long id;

   private String producer;
}
Ҳеҷ чиз ҷолиб нест, танҳо татбиқи модели ҷадвали аввал. Контроллер бо табдилдиҳандаҳои dto (Интиқоли маълумот):
@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 мо тарҷумаҳоро ҳамчун харитаҳо мегузорем, калид ихтисораи забон, арзиш арзиши тарҷума (номи филм) мебошад. 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' : 'Матрица'}"
}
Дар ин ҷо мо худи синфи dto-ро мебинем, тавре ки дар боло навишта шудааст, харитаи тарҷумаҳо, майдонҳои боқимонда намоиши модели филм мебошанд. Биёед ба хидмати филм гузарем:
public interface MovieService {

   Movie create(Movie movie, Map nameList);
}
Татбиқи он:
@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;
   }
}
Дар ин ҷо мо мебинем, ки хидмати нисбатан сеюми LanguageService барои дарёфти ID-и забон бо ихтисораш истифода мешавад. Ва бо ин идентификатор мо тарҷумаҳои худро (инчунин дар шакли харита) дар ҷадвали пайваст захира мекунем. Биёед ба DAO назар андозем:
public interface MovieDAO {

   void create(Movie movie);

   void createTranslator(Long movieId, Map<Long,String> nameTranslations);
}
Татбиқи:
@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));
   }
}
Дар ин ҷо мо нигоҳ доштани моҳият ва забонҳоро барои он мебинем (лугат). Ва ҳа, Spring JDBC дар ин ҷо истифода мешавад: Ман онро барои шурӯъкунандагон афзал мешуморам, зеро он шаффофтар аст. Биёед ба хидмати "шахси сеюм" гузарем. Хадамоти забон:
public interface LanguageService {

   Long getIdByLangCode(String lang);
}
Татбиқи:
@Service
@RequiredArgsConstructor
public class LanguageServiceImpl implements LanguageService {
   private final LanguageDAO languageDAO;

   @Override
   public Long getIdByLangCode(String lang) {
       return languageDAO.getIdByLangCode(lang);
   }
}
Ҳеҷ чизи махсусе нест, бо номи кӯтоҳшуда ҷустуҷӯ кунед. DAO:
public interface LanguageDAO {

   Long getIdByLangCode(String lang);
}
Татбиқи:
@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);
   }
}
Сохтор: Татбиқи татбиқи бисёрзабона - 23 Ҳама моделҳои дар боло тавсифшуда ҳуқуқи зиндагӣ доранд. Шумо бояд қарор кунед, ки кадомашро дар асоси вазъият истифода баред. Албатта, ин ҳама нест: бисёр равишҳои гуногун мавҷуданд, аз ҷумла истифодаи пойгоҳи додаҳо барои забонҳои гуногун, истифодаи кэшҳо, чаҳорчӯбаҳои гуногун ва ғайра. Ин ҳама барои ман имрӯз аст ва... Татбиқи барномаҳои бисёрзабона - 24
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION