mirror of
				https://github.com/LibreTranslate/LibreTranslate.git
				synced 2025-11-04 03:27:14 -05:00 
			
		
		
		
	feat: support batch translation
This commit is contained in:
		
							parent
							
								
									72248f0050
								
							
						
					
					
						commit
						2c5eba14b4
					
				
							
								
								
									
										41
									
								
								app/app.py
									
									
									
									
									
								
							
							
						
						
									
										41
									
								
								app/app.py
									
									
									
									
									
								
							@ -16,7 +16,7 @@ def get_remote_address():
 | 
				
			|||||||
def create_app(char_limit=-1, req_limit=-1, ga_id=None, debug=False, frontend_language_source="en", frontend_language_target="en"):
 | 
					def create_app(char_limit=-1, req_limit=-1, ga_id=None, debug=False, frontend_language_source="en", frontend_language_target="en"):
 | 
				
			||||||
    from app.init import boot
 | 
					    from app.init import boot
 | 
				
			||||||
    boot()
 | 
					    boot()
 | 
				
			||||||
    
 | 
					
 | 
				
			||||||
    from app.language import languages
 | 
					    from app.language import languages
 | 
				
			||||||
    app = Flask(__name__)
 | 
					    app = Flask(__name__)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -36,9 +36,9 @@ def create_app(char_limit=-1, req_limit=-1, ga_id=None, debug=False, frontend_la
 | 
				
			|||||||
        })
 | 
					        })
 | 
				
			||||||
    else:
 | 
					    else:
 | 
				
			||||||
        frontend_argos_language_source = next(iter([l for l in languages if l.code == frontend_language_source]), None)
 | 
					        frontend_argos_language_source = next(iter([l for l in languages if l.code == frontend_language_source]), None)
 | 
				
			||||||
    
 | 
					
 | 
				
			||||||
    frontend_argos_language_target = next(iter([l for l in languages if l.code == frontend_language_target]), None)
 | 
					    frontend_argos_language_target = next(iter([l for l in languages if l.code == frontend_language_target]), None)
 | 
				
			||||||
    
 | 
					
 | 
				
			||||||
    # Raise AttributeError to prevent app startup if user input is not valid.
 | 
					    # Raise AttributeError to prevent app startup if user input is not valid.
 | 
				
			||||||
    if frontend_argos_language_source is None:
 | 
					    if frontend_argos_language_source is None:
 | 
				
			||||||
        raise AttributeError(f"{frontend_language_source} as frontend source language is not supported.")
 | 
					        raise AttributeError(f"{frontend_language_source} as frontend source language is not supported.")
 | 
				
			||||||
@ -126,17 +126,20 @@ def create_app(char_limit=-1, req_limit=-1, ga_id=None, debug=False, frontend_la
 | 
				
			|||||||
          - in: formData
 | 
					          - in: formData
 | 
				
			||||||
            name: q
 | 
					            name: q
 | 
				
			||||||
            schema:
 | 
					            schema:
 | 
				
			||||||
              type: string
 | 
					              oneOf:
 | 
				
			||||||
              example: Hello world!
 | 
					                - type: string
 | 
				
			||||||
 | 
					                  example: Hello world!
 | 
				
			||||||
 | 
					                - type: array
 | 
				
			||||||
 | 
					                  example: ['Hello world!']
 | 
				
			||||||
            required: true
 | 
					            required: true
 | 
				
			||||||
            description: Text to translate
 | 
					            description: Text(s) to translate
 | 
				
			||||||
          - in: formData
 | 
					          - in: formData
 | 
				
			||||||
            name: source
 | 
					            name: source
 | 
				
			||||||
            schema:
 | 
					            schema:
 | 
				
			||||||
              type: string
 | 
					              type: string
 | 
				
			||||||
              example: en
 | 
					              example: en
 | 
				
			||||||
            required: true
 | 
					            required: true
 | 
				
			||||||
            description: Source language code      
 | 
					            description: Source language code
 | 
				
			||||||
          - in: formData
 | 
					          - in: formData
 | 
				
			||||||
            name: target
 | 
					            name: target
 | 
				
			||||||
            schema:
 | 
					            schema:
 | 
				
			||||||
@ -152,8 +155,10 @@ def create_app(char_limit=-1, req_limit=-1, ga_id=None, debug=False, frontend_la
 | 
				
			|||||||
              type: object
 | 
					              type: object
 | 
				
			||||||
              properties:
 | 
					              properties:
 | 
				
			||||||
                translatedText:
 | 
					                translatedText:
 | 
				
			||||||
                  type: string
 | 
					                  oneOf:
 | 
				
			||||||
                  description: Translated text
 | 
					                    - type: string
 | 
				
			||||||
 | 
					                    - type: array
 | 
				
			||||||
 | 
					                  description: Translated text(s)
 | 
				
			||||||
          400:
 | 
					          400:
 | 
				
			||||||
            description: Invalid request
 | 
					            description: Invalid request
 | 
				
			||||||
            schema:
 | 
					            schema:
 | 
				
			||||||
@ -200,8 +205,16 @@ def create_app(char_limit=-1, req_limit=-1, ga_id=None, debug=False, frontend_la
 | 
				
			|||||||
        if not target_lang:
 | 
					        if not target_lang:
 | 
				
			||||||
            abort(400, description="Invalid request: missing target parameter")
 | 
					            abort(400, description="Invalid request: missing target parameter")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        batch = isinstance(q, list)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if char_limit != -1:
 | 
					        if char_limit != -1:
 | 
				
			||||||
            q = q[:char_limit]
 | 
					            if batch:
 | 
				
			||||||
 | 
					              chars = sum([len(text) for text in q])
 | 
				
			||||||
 | 
					            else:
 | 
				
			||||||
 | 
					              chars = len(q)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if char_limit < chars:
 | 
				
			||||||
 | 
					              abort(400, description="Invalid request: Request (%d) exceeds character limit (%d)" % (chars, char_limit))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if source_lang == 'auto':
 | 
					        if source_lang == 'auto':
 | 
				
			||||||
            candidate_langs = list(filter(lambda l: l.lang in language_map, detect_langs(q)))
 | 
					            candidate_langs = list(filter(lambda l: l.lang in language_map, detect_langs(q)))
 | 
				
			||||||
@ -217,20 +230,24 @@ def create_app(char_limit=-1, req_limit=-1, ga_id=None, debug=False, frontend_la
 | 
				
			|||||||
                    source_lang = 'en'
 | 
					                    source_lang = 'en'
 | 
				
			||||||
            else:
 | 
					            else:
 | 
				
			||||||
                source_lang = 'en'
 | 
					                source_lang = 'en'
 | 
				
			||||||
            
 | 
					
 | 
				
			||||||
            if debug:
 | 
					            if debug:
 | 
				
			||||||
                print("Auto detected: %s" % source_lang)
 | 
					                print("Auto detected: %s" % source_lang)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        src_lang = next(iter([l for l in languages if l.code == source_lang]), None)
 | 
					        src_lang = next(iter([l for l in languages if l.code == source_lang]), None)
 | 
				
			||||||
        tgt_lang = next(iter([l for l in languages if l.code == target_lang]), None)
 | 
					        tgt_lang = next(iter([l for l in languages if l.code == target_lang]), None)
 | 
				
			||||||
        
 | 
					
 | 
				
			||||||
        if src_lang is None:
 | 
					        if src_lang is None:
 | 
				
			||||||
            abort(400, description="%s is not supported" % source_lang)
 | 
					            abort(400, description="%s is not supported" % source_lang)
 | 
				
			||||||
        if tgt_lang is None:
 | 
					        if tgt_lang is None:
 | 
				
			||||||
            abort(400, description="%s is not supported" % target_lang)
 | 
					            abort(400, description="%s is not supported" % target_lang)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        translator = src_lang.get_translation(tgt_lang)
 | 
					        translator = src_lang.get_translation(tgt_lang)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        try:
 | 
					        try:
 | 
				
			||||||
 | 
					          if batch:
 | 
				
			||||||
 | 
					            return jsonify({"translatedText": [translator.translate(text) for text in q] })
 | 
				
			||||||
 | 
					          else:
 | 
				
			||||||
            return jsonify({"translatedText": translator.translate(q) })
 | 
					            return jsonify({"translatedText": translator.translate(q) })
 | 
				
			||||||
        except Exception as e:
 | 
					        except Exception as e:
 | 
				
			||||||
            abort(500, description="Cannot translate text: %s" % str(e))
 | 
					            abort(500, description="Cannot translate text: %s" % str(e))
 | 
				
			||||||
 | 
				
			|||||||
@ -247,9 +247,9 @@
 | 
				
			|||||||
window.Prism = window.Prism || {};
 | 
					window.Prism = window.Prism || {};
 | 
				
			||||||
window.Prism.manual = true;
 | 
					window.Prism.manual = true;
 | 
				
			||||||
</script>
 | 
					</script>
 | 
				
			||||||
	
 | 
					
 | 
				
			||||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.22.0/prism.min.js"></script>
 | 
					<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.22.0/prism.min.js"></script>
 | 
				
			||||||
	
 | 
					
 | 
				
			||||||
<script>
 | 
					<script>
 | 
				
			||||||
// API host/endpoint
 | 
					// API host/endpoint
 | 
				
			||||||
var BaseUrl = window.location.protocol + "//" + window.location.host;
 | 
					var BaseUrl = window.location.protocol + "//" + window.location.host;
 | 
				
			||||||
@ -317,7 +317,7 @@ document.addEventListener('DOMContentLoaded', function(){
 | 
				
			|||||||
				return;
 | 
									return;
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		    self.loading = false;			
 | 
							    self.loading = false;
 | 
				
			||||||
		  } else {
 | 
							  } else {
 | 
				
			||||||
			self.error = "Cannot load /languages";
 | 
								self.error = "Cannot load /languages";
 | 
				
			||||||
			self.loading = false;
 | 
								self.loading = false;
 | 
				
			||||||
@ -346,8 +346,8 @@ document.addEventListener('DOMContentLoaded', function(){
 | 
				
			|||||||
			if (this.charactersLimit !== -1 && this.inputText.length >= this.charactersLimit){
 | 
								if (this.charactersLimit !== -1 && this.inputText.length >= this.charactersLimit){
 | 
				
			||||||
				this.inputText = this.inputText.substring(0, this.charactersLimit);
 | 
									this.inputText = this.inputText.substring(0, this.charactersLimit);
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
            
 | 
					
 | 
				
			||||||
			
 | 
					
 | 
				
			||||||
	  },
 | 
						  },
 | 
				
			||||||
	  computed: {
 | 
						  computed: {
 | 
				
			||||||
	  	requestCode: function(){
 | 
						  	requestCode: function(){
 | 
				
			||||||
@ -423,7 +423,7 @@ document.addEventListener('DOMContentLoaded', function(){
 | 
				
			|||||||
				  	var res = JSON.parse(this.response);
 | 
									  	var res = JSON.parse(this.response);
 | 
				
			||||||
					// Success!
 | 
										// Success!
 | 
				
			||||||
					if (res.translatedText !== undefined){
 | 
										if (res.translatedText !== undefined){
 | 
				
			||||||
						self.translatedText = res.translatedText; 
 | 
											self.translatedText = res.translatedText;
 | 
				
			||||||
					    self.loadingTranslation = false;
 | 
										    self.loadingTranslation = false;
 | 
				
			||||||
					    self.output = JSON.stringify(res, null, 4);
 | 
										    self.output = JSON.stringify(res, null, 4);
 | 
				
			||||||
					}else{
 | 
										}else{
 | 
				
			||||||
@ -450,7 +450,7 @@ document.addEventListener('DOMContentLoaded', function(){
 | 
				
			|||||||
			this.$refs.translatedTextarea.select();
 | 
								this.$refs.translatedTextarea.select();
 | 
				
			||||||
			this.$refs.translatedTextarea.setSelectionRange(0, 9999999); /* For mobile devices */
 | 
								this.$refs.translatedTextarea.setSelectionRange(0, 9999999); /* For mobile devices */
 | 
				
			||||||
			document.execCommand("copy");
 | 
								document.execCommand("copy");
 | 
				
			||||||
			
 | 
					
 | 
				
			||||||
			if (this.copyTextLabel === "Copy Text"){
 | 
								if (this.copyTextLabel === "Copy Text"){
 | 
				
			||||||
				this.copyTextLabel = "Copied!";
 | 
									this.copyTextLabel = "Copied!";
 | 
				
			||||||
				var self = this;
 | 
									var self = this;
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user