JavaRush /Blog Jawa /Random-JV /Implementasi aplikasi multibahasa

Implementasi aplikasi multibahasa

Diterbitake ing grup
Implementasi aplikasi multibasa - 1

Dina iki kita bakal ngomong babagan multibahasa. Dadi apa iku?

Multilingualisme, kanthi tembung liya, internasionalisasi , minangka bagean saka ngembangake aplikasi sing bisa diadaptasi kanggo sawetara basa tanpa ngganti logika program. Coba kahanan kasebut: sampeyan nggawe aplikasi web kanggo perusahaan dagang gedhe kanggo warga ing pirang-pirang negara, contone, basa kayata Rusia, Inggris, lan Spanyol digunakake. Sampeyan kudu nggawe trep kanggo kabeh pangguna. Ide iki yaiku: maca sing nganggo basa Rusia kudu bisa ndeleng data sampeyan ing basa Rusia, wong Amerika bakal luwih seneng maca materi ing basa Inggris, lan wong Spanyol - ing basa Spanyol (ora disangka, bener?) Ayo nimbang sawetara model internasionalisasiImplementasi aplikasi multibasa - 2 saiki . , lan kanggo salah siji saka wong-wong mau (sing paling aku seneng :) Ayo kang katon ing implementasine ing Jawa. Minangka babi guinea, dina iki kita bakal duwe piring data film. Aja nganti keblinger, supaya ora akeh penutur. Contone, iku OK. Lan kita bakal nerjemahake jeneng film (sutradara - kanggo tambahan): Implementasi aplikasi multibasa - 3

1. Tabel kanthi terjemahan kanggo saben basa

Inti saka model iki: saben basa duwe tabel kapisah ing database, sing ngemot kabeh sel sing mbutuhake terjemahan. Kerugian metode iki yaiku saben kita nambah basa anyar, kita kudu nambah tabel anyar. Yaiku, ayo bayangake manawa pelanggan kita nindakake kanthi apik, lan dheweke ngembangake aplikasi menyang pirang-pirang negara (nyatane, basa) ing saindenging jagad. Iki tegese sampeyan kudu nambah siji tablet saben ilat. Akibaté, kita bakal duwe database setengah utawa meh kabeh kasusun saka tabel terjemahan tambahan: Implementasi aplikasi multibasa - 4 Skema film dhewe: Implementasi aplikasi multibasa - 5Tabel terjemahan:
  • Rusian Implementasi aplikasi multibasa - 6
  • Spanyol Implementasi aplikasi multibasa - 7
  • Inggris Implementasi aplikasi multibasa - 8

2. Siji kanggo kabeh

Ing saben tabel sing kalebu model tartamtu, ditambahake lapangan kanthi pengenal kanggo piring basa. Dadi, database uga ngemot tabel iki kanthi terjemahan. Masalahe yaiku siji obyek bisa cocog karo sawetara terjemahan (basa). Akibaté, bakal ana duplikasi entitas, lan iki banget mbingungake lan rumit logika, lan iki ora apik. Kita ndeleng UML: Implementasi aplikasi multibasa - 9 Film tabel: Implementasi aplikasi multibasa - 10 Basa tabel: Implementasi aplikasi multibasa - 11

3. Kolom saben lathi

Kolom terjemahan sing kapisah digawe kanggo saben kolom kanggo saben basa ing tabel. Kerugian saka pendekatan iki yaiku, maneh, yen akeh basa ditambahake, struktur database kudu diganti saben wektu, lan iki dianggep minangka pendekatan sing ala. Bayangake uga kepiye tandha-tandha sing nuntut internasionalisasi. Perlu dipikirake model ing ngendi jumlah basa sing didhukung dikenal luwih dhisik, ora akeh banget, lan saben model kudu ana ing kabeh variasi basa. UML: Implementasi aplikasi multibasa - 12Tabel kabeh klebu: Implementasi aplikasi multibasa - 13

4. Terjemahan njaba

Opsi iki dileksanakake kanthi nyambungake alat eksternal (Google translate, Bing translate, etc.). Iki digunakake yen sampeyan perlu kanggo nyedhiyani informasi kanggo akeh pengunjung sabisa, lan ana akeh informasi iki. akeh banget. Ing kasus iki, sampeyan bisa mutusake supaya ora langsung nyimpen informasi ing basis data ing kabeh basa, nanging nerjemahake kanthi dinamis. Nanging kudu eling yen kualitas terjemahan mesin asring akeh sing dikarepake. Opsi kasebut mung bisa dianggep ekonomis banget (yen ora ana sumber daya kanggo nerjemahake saben publikasi). Masalah umum babagan terjemahan sing bener yaiku penerjemah sing ora ngerti basa kasebut kanthi becik milih makna sing salah saka tembung lan mbingungake pangguna, meksa dheweke bisa nemtokake makna sing ditulis ing tombol kasebut. Sampeyan uga penting ora mung nerjemahake ukara kanthi bener, nanging uga nggawa makna menyang basa lan kewarganegaraan tartamtu. Pangembang duwe akeh masalah karo jender ing sawetara basa. Padha kudu duplikat frase ing kode gumantung gender pangguna, lan uga njupuk menyang akun sing ora mung nouns duwe gender, nanging uga adjectives lan kriya inflected beda. Ana kasus nalika, wis milih basa liyane saka Inggris ing aplikasi, bebarengan karo tembung saka basa sing dipilih, isih ana unsur untranslated. Luwih elek yen sawetara basa ditampilake lan dadi kaya Babil, sing kabeh dicampur lan pangguna ora bisa ngerti aplikasi kasebut. Contone: https://cloud.google.com/translate/

5. File dhukungan tingkat aplikasi

File kapisah digawe kanggo nyimpen terjemahan. Bisa dadi siji file saben ilat utawa siji file saben ilat saben tablet (fine crushing). Opsi iki asring digunakake amarga akeh teks sing bisa disimpen ing file kasebut, sing tegese tabel lan database ora bakal kembung. Penak uga dumunung ing kasunyatan sing ora perlu kanggo ngalahake ing database kanggo lapangan iki, lan ing kode file bisa mbosenke diganti gumantung ing basa dijaluk. Akibaté, file kasebut minangka kamus kanggo kita, ing ngendi kunci yaiku basa, nilai kasebut minangka teks. Nanging kita ora diwatesi ing format ".properties" ing ngisor iki, lan format file iki bisa beda-beda - JSON, XML, etc. Kerugian yaiku ing kasus iki normalisasi basis data wis suda banget. Uga, integritas data ora mung gumantung ing database, nanging uga ing mekanisme serialization. Artikel sing apik babagan topik iki Conto file kamus kanthi terjemahan: Implementasi aplikasi multibasa - 14
  • Inggris Implementasi aplikasi multibasa - 15
  • Rusian Implementasi aplikasi multibasa - 16
  • Spanyol Implementasi aplikasi multibasa - 17

6. Tabel terjemahan tambahan kanggo saben tabel

Ing mratelakake panemume, solusi paling fleksibel. Inti saka pendekatan iki yaiku nggawe tabel sing kapisah kanggo basa. Yen perlu kanggo ngleksanakake kamungkinan terjemahan kanggo tabel kasebut, link digawe karo tabel basa, lan tabel link ngemot id basa, unsur id lan kolom karo terjemahan. Iku ora medeni minangka muni. Pendekatan iki ngidini ekstensibilitas basa sing didhukung cukup fleksibel. Ayo dideleng kanthi cetha. UML: Implementasi aplikasi multibasa - 18Tabel karo film: Implementasi aplikasi multibasa - 19Tabel basa: Implementasi aplikasi multibasa - 20Tabel terjemahan: Implementasi aplikasi multibasa - 21 Lan, kaya aku ngandika ndhuwur, ayo kang katon ing implementasine saka salah siji opsi ing kode Jawa (sing ngerti, iki bakal dadi pilihan pungkasan). Ora ana sing kaya ngono ing aplikasi kasebut: kita bakal pindhah saka pengontrol menyang lapisan dao. Kita bakal ndeleng cara nggawe - contone, iki bakal cukup. Dadi ayo)) Inti kita yaiku film:
@Builder
@Getter
public class Movie {

   private Long id;

   private String producer;
}
Ora ana sing menarik, mung ngetrapake model tabel pisanan. Kontroler nganggo konverter dto (Obyek Transfer Data):
@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();
   }
}
Ing DTO kita ngliwati terjemahan minangka peta, kunci yaiku singkatan basa, nilai yaiku nilai terjemahan (jeneng film). 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' : 'Матрица'}"
}
Ing kene kita ndeleng kelas dto dhewe, kaya sing ditulis ing ndhuwur, peta kanggo terjemahan, kolom sing isih ana minangka tampilan model Film. Ayo pindhah menyang layanan film:
public interface MovieService {

   Movie create(Movie movie, Map nameList);
}
Implementasine:
@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;
   }
}
Ing kene kita ndeleng panggunaan layanan LanguageService pihak katelu sing relatif kanggo njupuk id basa kanthi singkatan. Lan kanthi pengenal iki, kita nyimpen terjemahan (uga ing wangun peta) menyang tabel sambungan. Ayo ndeleng DAO:
public interface MovieDAO {

   void create(Movie movie);

   void createTranslator(Long movieId, Map<Long,String> nameTranslations);
}
Implementasine:
@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));
   }
}
Ing kene kita ndeleng pelestarian inti lan basa kanggo (kamus). Lan ya, Spring JDBC digunakake ing kene: Aku nganggep luwih becik kanggo pamula, amarga luwih transparan. Ayo pindhah menyang layanan "pihak katelu". Layanan basa:
public interface LanguageService {

   Long getIdByLangCode(String lang);
}
Implementasine:
@Service
@RequiredArgsConstructor
public class LanguageServiceImpl implements LanguageService {
   private final LanguageDAO languageDAO;

   @Override
   public Long getIdByLangCode(String lang) {
       return languageDAO.getIdByLangCode(lang);
   }
}
Ora ana sing khusus, goleki kanthi jeneng sing disingkat. DAO:
public interface LanguageDAO {

   Long getIdByLangCode(String lang);
}
Implementasine:
@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);
   }
}
Struktur: Implementasi aplikasi multibasa - 23 Kabeh model sing diterangake ing ndhuwur nduweni hak kanggo urip. Sampeyan kudu mutusake apa sing bakal digunakake adhedhasar kahanan. Mesthi wae, ora kabeh: ana akeh pendekatan sing beda, kalebu nggunakake basis data sing beda kanggo basa sing beda, nggunakake cache, kerangka kerja sing beda, lan liya-liyane. Iku kabeh kanggo aku dina iki lan ... Implementasi aplikasi multibasa - 24
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION