JavaRush /جاوا بلاگ /Random-SD /گھڻ لساني ايپليڪيشن جو نفاذ

گھڻ لساني ايپليڪيشن جو نفاذ

گروپ ۾ شايع ٿيل
گهڻ لساني ايپليڪيشن جو نفاذ - 1

اڄ اسين multilingualism بابت ڳالهائينداسين. پوء اهو ڇا آهي؟

گهڻ لسانيات، ٻين لفظن ۾، بين الاقواميت ، هڪ ايپليڪيشن کي ترقي ڪرڻ جو حصو آهي جيڪو پروگرام جي منطق کي تبديل ڪرڻ کان سواء ڪيترن ئي ٻولين لاء ترتيب ڏئي سگهجي ٿو. صورتحال تي غور ڪريو: توھان ھڪڙي ويب ايپليڪيشن ٺاھي رھيا آھيو ھڪڙي وڏي واپاري ڪمپنيءَ لاءِ وڏي تعداد ۾ ملڪن جي رهاڪن لاءِ، جنھن ۾، مثال طور، ٻوليون جھڙوڪ روسي، انگريزي ۽ ھسپانوي ڳالھايون وڃن ٿيون. توھان کي ان کي سڀني استعمال ڪندڙن لاءِ آسان بڻائڻ جي ضرورت آھي. خيال هي آهي: هڪ روسي ڳالهائيندڙ پڙهندڙ کي توهان جي ڊيٽا کي روسي ۾ ڏسڻ جو موقعو ملڻ گهرجي، اهو هڪ آمريڪي لاء انگريزي ۾ مواد پڙهڻ لاء وڌيڪ آسان ٿيندو، ۽ هڪ اسپيني لاء - اسپيني ۾ (غير متوقع طور تي، صحيح؟) گهڻ لساني ايپليڪيشن جو نفاذ - 2اڄ ڪيترن ئي بين الاقواميائيزيشن ماڊل تي غور ڪيو وڃي ٿو ، ۽ انهن مان هڪ لاء (جيڪو سڀ کان وڌيڪ مون کي پسند آهي :) اچو ته جاوا ۾ عملدرآمد کي ڏسو. گني پگ جي طور تي اڄ اسان وٽ فلم ڊيٽا بورڊ هوندو. اچو ته وڌيڪ خراب نه ٿي وڃون، تنهنڪري اسان وٽ گهڻا ڳالهائيندڙ نه هوندا. مثال طور، اهو ٺيڪ آهي. ۽ اسان فلمن جا نالا ترجمو ڪنداسين (هدايتڪار - اضافي لاء): گهڻ لساني ايپليڪيشن جو نفاذ - 3

1. هر ٻولي لاءِ ترجمي سان گڏ ٽيبل

هن نموني جو خلاصو: هر ٻوليءَ جي ڊيٽابيس ۾ هڪ الڳ جدول آهي، جنهن ۾ اهي سڀئي سيل آهن جن کي ترجمي جي ضرورت آهي. هن طريقي جو نقصان اهو آهي ته هر دفعي اسان هڪ نئين ٻولي شامل ڪندا آهيون، اسان کي هڪ نئين جدول شامل ڪرڻ جي ضرورت آهي. اهو آهي، اچو ته تصور ڪريون ته اسان جو گراهڪ تمام سٺو ڪم ڪري رهيو آهي، ۽ هو پنهنجي ايپليڪيشن کي دنيا جي ڪيترن ئي ملڪن (حقيقت ۾، ٻولين) تائين وڌائي رهيو آهي. هن جو مطلب آهي ته توهان کي هر زبان ۾ هڪ ٽيبليٽ شامل ڪرڻ جي ضرورت پوندي. نتيجي طور، اسان وٽ ھڪڙو ڊيٽابيس ھوندو جيڪو اڌ يا تقريبن مڪمل طور تي معاون ترجمي جي جدولن تي مشتمل ھوندو: گھڻ لساني ايپليڪيشن جو نفاذ - 4 خود فلمن جي اسڪيمات: گھڻ لساني ايپليڪيشن جو نفاذ - 5ترجمو جدول:
  • روسي گهڻ لساني ايپليڪيشن جو نفاذ - 6
  • اندلسي گهڻ لساني ايپليڪيشن جو نفاذ - 7
  • انگريزي گھڻ لساني ايپليڪيشن جو نفاذ - 8

2. سڀني لاءِ هڪ

هر ٽيبل ۾ جيڪو هڪ مخصوص ماڊل سان تعلق رکي ٿو، هڪ فيلڊ شامل ڪيو ويو آهي هڪ سڃاڻپ ڪندڙ سان ٻولي پليٽ لاءِ. ان مطابق، ڊيٽابيس ۾ پڻ ترجمن سان گڏ ھن جدول تي مشتمل آھي. مسئلو اهو آهي ته هڪ اعتراض ڪيترن ئي ترجمن (ٻولين) سان ملندو آهي. نتيجي طور، اتي موجود ادارن جو نقل ٿيندو، ۽ اهو منطق کي تمام گهڻو پريشان ۽ پيچيده ڪري ٿو، ۽ اهو سٺو ناهي. اسان ڏسون ٿا UML: گھڻ لساني ايپليڪيشن جو نفاذ - 9 ٽيبل فلمون: گهڻ لساني ايپليڪيشن جو نفاذ - 10 ٽيبل ٻوليون: گهڻ لساني ايپليڪيشن جو نفاذ - 11

3. ڪالمن في زبان

جدول ۾ هر ٻوليءَ لاءِ هر ڪالم لاءِ الڳ ترجمي وارو ڪالم ٺاهيو ويو آهي. هن طريقي جو نقصان اهو آهي ته، ٻيهر، جيڪڏهن ٻولين جو هڪ وڏو تعداد شامل ڪيو وڃي، ڊيٽابيس جي جوڙجڪ کي هر دفعي تبديل ڪرڻو پوندو، ۽ اهو هڪ خراب طريقو سمجهيو ويندو آهي. اهو پڻ تصور ڪريو ته بين الاقواميت جي مطالبن جي نشانين کي ڪيئن وڌايو ويندو. اهو هڪ ماڊل تي غور ڪرڻ جي قابل ٿي سگهي ٿو جتي سپورٽ ٻولين جو تعداد اڳ ۾ ڄاڻايل آهي، انهن مان تمام گهڻا نه آهن، ۽ هر ماڊل سڀني ٻولين جي مختلف حالتن ۾ موجود هجڻ گهرجي. UML: گهڻ لساني ايپليڪيشن جو نفاذ - 12سڀ شامل جدول: گهڻ لساني ايپليڪيشن جو نفاذ - 13

4. خارجي ترجمو

هي اختيار خارجي اوزار (گوگل ترجمو، Bing ترجمو، وغيره) سان ڳنڍڻ سان لاڳو ڪيو ويندو آهي. اهو استعمال ڪيو ويندو آهي جيڪڏهن توهان کي معلومات مهيا ڪرڻ جي ضرورت آهي جيترو گهڻن سياحن کي ممڪن آهي، ۽ هن معلومات جو تمام گهڻو آهي. انيڪ. انهي حالت ۾، توهان فيصلو ڪري سگهو ٿا ته معلومات سڌو سنئون ڊيٽابيس ۾ سڀني ٻولين ۾ ذخيرو نه ڪريو، پر متحرڪ طور تي ترجمو ڪرڻ لاء. پر اهو ياد رکڻ جي قابل آهي ته مشين جي ترجمي جي معيار کي گهڻو ڪري ڇڏي ٿو گهربل ٿيڻ لاء. اختيار کي صرف تمام اقتصادي طور تي سمجهي سگهجي ٿو (جڏهن هر اشاعت کي ترجمو ڪرڻ لاء ڪو وسيلا نه آهن). صحيح ترجمي جي سلسلي ۾ هڪ عام مسئلو اهو آهي ته ترجمو ڪندڙ جيڪي ٻولي چڱيءَ طرح نه ٿا ڄاڻن، اهي لفظ جي غلط معنيٰ چونڊي استعمال ڪندڙ کي پريشان ڪري ڇڏيندا آهن، ان ڪري هو آزاديءَ سان ان جي معنيٰ معلوم ڪرڻ تي مجبور ڪندا آهن، جيڪو بٽڻ تي لکيل آهي. اهو پڻ ضروري آهي ته جملي جو نه رڳو صحيح ترجمو ڪيو وڃي، پر ان جي معني کي هڪ مخصوص ٻولي ۽ قوميت ۾ آڻڻ پڻ ضروري آهي. ڊولپرز کي ڪجھ ٻولين ۾ صنفن سان تمام گھڻيون مسئلا آھن. انهن کي استعمال ڪندڙ جي جنس جي لحاظ کان ڪوڊ ۾ جملي کي نقل ڪرڻو پوندو، ۽ اهو به خيال رکڻو پوندو ته نه رڳو اسم جي صنف آهي، پر صفتون ۽ فعل پڻ مختلف نموني سان ڀريل آهن. اھڙا ڪيس آھن جڏھن، ايپليڪيشن ۾ انگريزيءَ کان سواءِ ٻي ٻولي چونڊي، چونڊيل ٻوليءَ جي لفظن سان گڏ، اڃا تائين اڻ ترجمو ٿيل عنصر آھن. اهو اڃا به خراب آهي ته ڪيتريون ئي ٻوليون ڏيکاريل آهن ۽ اهو هڪ قسم جو بابل آهي، جتي هر شيء گڏ ٿيل آهي ۽ صارف ايپليڪيشن کي سمجهي نٿو سگهي. مثال طور: https://cloud.google.com/translate/

5. ايپليڪيشن ليول سپورٽ فائلون

ترجمي کي ذخيرو ڪرڻ لاءِ الڳ فائلون ٺاهيا ويا آهن. اهو ٿي سگهي ٿو هڪ فائيل في زبان يا هڪ فائيل في زبان في ٽيبليٽ (فائن ڪرشنگ). هي اختيار اڪثر ڪري استعمال ڪيو ويندو آهي ڇاڪاڻ ته انهن فائلن ۾ ڪيتريون ئي نصوص محفوظ ڪري سگهجن ٿيون، جنهن جو مطلب آهي ته ٽيبل ۽ ڊيٽابيس پاڻ کي ڦٽو نه ٿيندو. ٻي سهولت اها آهي ته توهان کي انهن شعبن لاءِ ڊيٽابيس تي دستڪ ڏيڻ جي ضرورت ناهي، ۽ ڪوڊ ۾ فائلون متحرڪ طور تي تبديل ڪري سگھجن ٿيون درخواست ڪيل ٻولي جي لحاظ سان. نتيجي طور، فائل اسان لاء لغت جي طور تي ڪم ڪري ٿو، جنهن ۾ اهم ٻولي آهي، قيمت متن آهي. پر اسان هيٺ ڏنل ".properties" فارميٽ تائين محدود نه آهيون، ۽ اهي فائل فارميٽ مختلف ٿي سگهن ٿا - JSON، XML، وغيره. نقصانات آهن ته هن معاملي ۾ ڊيٽابيس جي normalization تمام گھٽجي وئي آهي. انهي سان گڏ، ڊيٽا جي سالميت هاڻي نه رڳو ڊيٽابيس تي منحصر آهي، پر سيريلائيزيشن ميڪانيزم تي پڻ. هن موضوع تي بهترين مضمون ترجمي سان گڏ ڊڪشنري فائلن جو مثال: گهڻ لساني ايپليڪيشن جو نفاذ - 14
  • انگريزي گهڻ لساني ايپليڪيشن جو نفاذ - 15
  • روسي گهڻ لساني ايپليڪيشن جو نفاذ - 16
  • اندلسي گهڻ لساني ايپليڪيشن جو نفاذ - 17

6. هر جدول لاءِ معاون ترجمو ٽيبل

منهنجي خيال ۾، سڀ کان وڌيڪ لچڪدار حل. هن طريقي جو خلاصو اهو آهي ته ٻولين لاءِ هڪ الڳ جدول ٺاهيو وڃي. جڏهن سوال ۾ ٽيبل جي ترجمي جي امڪان کي لاڳو ڪرڻ ضروري آهي، هڪ لنڪ ٻولي ٽيبل سان ٺهيل آهي، ۽ لنڪ ٽيبل تي مشتمل آهي ٻولي جي سڃاڻپ، عنصر id ۽ ترجمي سان ڪالمن. اهو ايترو خوفناڪ ناهي جيترو اهو آواز آهي. اهو طريقو مدد ٿيل ٻولين جي مناسب لچڪدار وڌائڻ جي اجازت ڏئي ٿو. اچو ته هڪ ويجهي نظر وٺو. يو ايم ايل: گهڻ لساني ايپليڪيشن جو نفاذ - 18فلمن سان ٽيبل: گهڻ لساني ايپليڪيشن جو نفاذ - 19ٻولين جو جدول: گهڻ لساني ايپليڪيشن جو نفاذ - 20ترجمن جو جدول: گهڻ لساني ايپليڪيشن جو نفاذ - 21 ۽، جيئن مون مٿي چيو، اچو ته جاوا ڪوڊ ۾ اختيارن مان ھڪڙي جي عمل کي ڏسو (جيئن توھان سمجھو ٿا، اھو آخري اختيار ھوندو). ايپليڪيشن ۾ اهڙي ڪا به شيء ناهي: اسان ڪنٽرولرز کان ٽائو پرت ڏانهن وڃو. اسان ٺاھڻ جي طريقي تي نظر ڪنداسين - مثال طور اھو ڪافي ٿيندو. سو اچو ته)) اسان جو جوهر هڪ فلم آهي:
@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 ۾ اسين ترجمي کي نقشن جي طور تي پاس ڪندا آهيون، اهم ٻولي جو مخفف آهي، قدر آهي ترجمي جي قيمت (فلم جو نالو). ڊي ٽي او:
@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;
   }
}
هتي اسان ڏسون ٿا نسبتا ٽئين پارٽي جي ٻولي سروس جو استعمال ٻولي جي سڃاڻپ کي ان جي مخفف سان ٻيهر حاصل ڪرڻ لاءِ. ۽ ھن سڃاڻپ ڪندڙ سان اسان پنھنجي ترجمن کي محفوظ ڪريون ٿا (پڻ نقشي جي صورت ۾) ڪنيڪشن ٽيبل ۾. اچو ته 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);
   }
}
ڪجھ خاص نه، مختصر نالي سان ڳولھيو. ڊي اي او:
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