5

मैंने कोणीय के लिए कुछ i18n प्लगइन्स देखे हैं लेकिन मैं पहिया को फिर से आविष्कार नहीं करना चाहता हूं। i18next एक अच्छी लाइब्रेरी है और इसलिए, मैं इसका उपयोग करना चाहता हूं।कोणीय और i18next

define(['app', 'jquery', 'i18n'], function(app, $, i18n) {'use strict'; 
    app.directive('i18n', function() { 
     return function($scope, elm, attrs) { 
      attrs.$observe('i18n', function(value) { 
       if ($.fn.i18n) {// for some reason, it isn't loaded quickly enough and first directives process fails 
        $(elm).i18n(); 
       } 
      }); 
     }; 
    }); 
}); 

मेरी पृष्ठ पर, मैं फ्लाई पर भाषा बदल सकते हैं:

मैं एक निर्देश i18n जो सिर्फ i18n पुस्तकालय कॉल बनाया है अब

<a ng-repeat="l in languages"> <img ng-src="images/{{l.id}}.png" title="{{l.label}}" ng-click="setLanguage(l.id)" /> </a> 

, अपने मुख्य नियंत्रक एचटीएमएल पर परिभाषित टैग:

define(['app', 'i18n', 'jquery'], function(app, i18n, $) {'use strict'; 

    return app.controller('BuilderController', ['$scope', '$location', 
    function BuilderController($scope, $location) { 

     /* Catch url changes */ 
     $scope.$watch(function() { 
      return $location.path(); 
     }, function() { 
      $scope.setLanguage(($location.search()).lang || 'en'); 
     }); 

     /* Language */ 
     $scope.languages = [{ 
      id : "en", 
      label : "English" 
     }, { 
      id : "fr", 
      label : "Français" 
     }]; 

     $scope.$watch('language', function() { 
      $location.search('lang', $scope.language); 
      i18n.init({ 
       resGetPath : 'i18n/__lng__/__ns__.json', 
       lng : $scope.language, 
       getAsync : false, 
       sendMissing : true, 
       fallbackLng : 'en', 
       debug : true 
      }); 
      $(document).i18n(); 
     }); 

     $scope.setLanguage = function(id) { 
      $scope.language = id; 
     }; 

    }]); 
}); 

यह कैसे काम करता है: भाषा पर दर्शक नई लोकेल के साथ i18n ऑब्जेक्ट प्रारंभ करता है डी i18n jquery एक्सटेंशन का उपयोग कर सभी डोम अपडेट करें। इस विशेष घटना के बाहर, मेरा निर्देश सिर्फ अन्य सभी कार्यों के लिए काम करता है (i18n निर्देश का उपयोग करके टेम्पलेट्स और बाद में प्रस्तुत किया जाता है)।

हालांकि यह ठीक काम कर रहा है, मुझे पता है कि मुझे नियंत्रक के अंदर डीओएम में हेरफेर नहीं करना चाहिए, लेकिन अंत में कुछ भी नहीं होता है, मुझे एक बेहतर समाधान नहीं मिला है।

आदर्श रूप से, मैं चाहता हूं कि कोणीय सभी डोम को फिर से संकलित करें, सभी निर्देशों को पार्सल अपडेट करने के लिए पार्स करें लेकिन मुझे यह नहीं पता कि यह कैसे किया जाए। मैंने $ स्कोप की कोशिश की है। $ लागू(): काम नहीं कर रहा है क्योंकि इस बिंदु पर पहले से ही डाइजेस्ट में मैंने बेहतर परिणामों के बिना स्कोप.ऑनरेडी प्लगइन का उपयोग किया है।

जाहिर है, मैं कोणीय के लिए बहुत नया हूं और यह समझना मेरे लिए काफी मुश्किल है कि चीजें कैसे काम करती हैं।

उत्तर

7

जहाँ तक मैं कह सकता हूं, यह बेहतर है कि jQuery का उपयोग न करें, क्योंकि इसकी आवश्यकता नहीं है। आप window.i18n.t("YourStringToTranslate") का उपयोग कर jQuery के बिना i18next का उपयोग कर सकते हैं। ;)

क्योंकि आप अपना खुद का निर्देश लिख सकते हैं, आपको $(document).i18n(); का उपयोग करने की आवश्यकता नहीं है। उस उद्देश्य के लिए मैंने कोणीय के लिए एक सरल निर्देश लिखा है।

https://gist.github.com/archer96/5239617

आप देख सकते हैं, तो आप jQuery और आप उपयोग करना भी बेहतर ढंग से अपना बजाय निर्देश अपने नियंत्रक में i18next प्रारंभ नहीं है।

आप इसे किसी भी तत्व को ng-i18next="" विशेषता जोड़ने के द्वारा सिम्प्ली द्वारा इसका उपयोग कर सकते हैं। अपने कोड में कहीं भी $rootScope.i18nextOptions पर अपने विकल्प पास करें (उदाहरण के लिए अपने नियंत्रक में)। फिर यह स्वचालित रूप से सभी अनुवादित तत्वों को अपडेट कर देगा।

मैंने आपका कोड संपादित किया, इसलिए यह मेरे निर्देश के साथ काम करता है।

define(['app', 'i18n', 'jquery'], function(app, i18n, $) { 

    'use strict'; 

    return app.controller('BuilderController', ['$rootScope', '$scope', '$location', 
    function BuilderController($rootScope, $scope, $location) { 

     /* Catch url changes */ 
     $scope.$watch(function() { 
      return $location.path(); 
     }, function() { 
      $scope.setLanguage(($location.search()).lang || 'en'); 
     }); 

     /* Language */ 
     $scope.languages = [{ 
      id : "en", 
      label : "English" 
     }, { 
      id : "fr", 
      label : "Français" 
     }]; 

     // This has changed 
     $scope.$watch('language', function() { 
     $location.search('lang', $scope.language); 
     $rootScope.i18nextOptions = { 
      resGetPath : 'i18n/__lng__/__ns__.json', 
      lng : $scope.language, 
      getAsync : false, 
      sendMissing : true, 
      fallbackLng : 'en', 
      debug : true 
     }; 
     }); 

     $scope.setLanguage = function(id) { 
      $scope.language = id; 
     }; 

    }]); 
}); 

कृपया ध्यान दें कि आपको निर्देश को अपने ऐप की निर्भरता के रूप में सेट करना होगा। एएमडी + jQuery के बिना i18next संस्करण भी शामिल करें। यदि आपको अधिक जानकारी चाहिए, तो वे गिस्ट में उपलब्ध हैं।;)


अब GitHub पर एक i18nextangular मॉड्यूल उपलब्ध नहीं है: https://github.com/i18next/ng-i18next

संबंधित मुद्दे