เมื่อใดที่ฉันควรใช้ ugettext_lazy


141

ฉันมีคำถามเกี่ยวกับการใช้ ugettext และugettext_lazyสำหรับการแปล ฉันเรียนรู้ว่าในรูปแบบที่ฉันควรใช้ugettext_lazyในขณะที่อยู่ในมุมมอง ugettext แต่มีที่ไหนugettext_lazyอีกบ้างที่ฉันควรใช้ด้วย คำจำกัดความของฟอร์มเกี่ยวกับอะไร มีความแตกต่างระหว่างประสิทธิภาพหรือไม่?

แก้ไข: และอีกหนึ่งสิ่ง บางครั้งแทนugettext_lazy, ugettext_noopถูกนำมาใช้ ตามที่เอกสารระบุว่าugettext_noopสตริงมีการทำเครื่องหมายเฉพาะสำหรับการแปลและการแปลในช่วงเวลาที่เป็นไปได้ล่าสุดก่อนที่จะแสดงให้ผู้ใช้เห็น แต่ฉันสับสนเล็กน้อยที่นี่ไม่เหมือนกับสิ่งที่ugettext_lazyทำ มันยังคงยากสำหรับฉันที่จะตัดสินใจซึ่งฉันควรใช้ในรูปแบบและรูปแบบของฉัน

คำตอบ:


197

ugettext() เมื่อเทียบกับ ugettext_lazy()

ในคำจำกัดความเช่นแบบฟอร์มหรือรุ่นที่คุณควรใช้ugettext_lazyเพราะรหัสของคำจำกัดความนี้จะถูกดำเนินการเพียงครั้งเดียว (ส่วนใหญ่เป็นการเริ่มต้นของ django); ugettext_lazyแปลสตริงในรูปแบบขี้เกียจซึ่งหมายถึงเช่น ทุกครั้งที่คุณเข้าถึงชื่อของแอททริบิวต์ในแบบจำลองสตริงจะได้รับการแปลใหม่ - ซึ่งเหมาะสมอย่างยิ่งเพราะคุณอาจจะดูรูปแบบนี้ในภาษาต่าง ๆ ตั้งแต่ django เริ่ม!

ในมุมมองและการเรียกใช้ฟังก์ชันที่คล้ายกันคุณสามารถใช้งานได้อย่างugettextไม่มีปัญหาเพราะทุกครั้งที่มีการเรียกใช้มุมมองจะถูกเรียกugettextใช้งานใหม่ดังนั้นคุณจะได้รับการแปลที่ถูกต้องตามคำขอ!

เกี่ยวกับ ugettext_noop()

ตามที่ไบรซ์ชี้ให้เห็นในคำตอบของเขาฟังก์ชั่นนี้ทำเครื่องหมายสตริงที่สามารถแยกได้สำหรับการแปล แต่ส่งคืนสตริงที่ไม่แปล สิ่งนี้มีประโยชน์สำหรับการใช้สตริงในสองสถานที่ - แปลและไม่แปล ดูตัวอย่างต่อไปนี้:

import logging
from django.http import HttpResponse
from django.utils.translation import ugettext as _, ugettext_noop as _noop

def view(request):
    msg = _noop("An error has occurred")
    logging.error(msg)
    return HttpResponse(_(msg))

16
เป็นที่เข้าใจได้มากกว่าคำอธิบายในเอกสารของ Django ในความคิดของฉัน ขอบคุณ @Bernhard
Utku

14
ขอบคุณ! นอกจากนี้ยังจะเป็นประโยชน์ในการอธิบายเมื่อไม่ใช้ ugettext_lazy เช่นเมื่อส่งผ่านไปยังสิ่งต่าง ๆ ที่คาดว่าสตริงเช่น "" .replace, string concatenation และอื่น ๆ ; วัตถุพร็อกซีขี้เกียจจะไม่ทำงานในกรณีเหล่านั้น มิฉะนั้นคำตอบนี้แสดงว่าคุณปลอดภัยเพียงแค่ใช้ ugettext_lazy เสมอ
mrooney

4
@rooney กรณีเหล่านั้นมีความสำคัญน้อยกว่าเพราะพวกเขาจะให้ข้อผิดพลาดแก่คุณหากคุณทำเช่นนั้นแทนที่จะส่งคืนการแปลภาษาที่ไม่ถูกต้อง นอกจากนี้คุณยังสามารถใช้ "" .replace กับ ugettext_lazy คุณต้องโทรหา str () ในผลลัพธ์เช่น lazytext = ugettext_lazy ('hello') และจากนั้นใช้ str (lazytext) ในภายหลัง
fabspro

1
สิ่งที่เกี่ยวกับmsg = "An error has occurred"; logging.error(msg);return HttpResponse(_(msg))? why need _noop ?ถ้าโดยไม่ต้อง_noop, Django จะไม่พบการแปลความต้องการสตริง?
WeizhongTu

1
การแปลทำงานกับตัวแปร อีกครั้งนี่คือตัวอย่างเอกสารที่เหมือนกันดังนั้นทำไม_noop?
WeizhongTu

17

การใช้งานที่ยอดเยี่ยมของ _noop คือเมื่อคุณต้องการบันทึกข้อความเป็นภาษาอังกฤษสำหรับนักพัฒนา แต่นำเสนอสตริงที่แปลแล้วไปยังวิวเวอร์ ตัวอย่างของสิ่งนี้อยู่ที่http://blog.bessas.me/posts/using-gettext-in-django/


4
ลิงก์ใช้งานไม่ได้…
nalzok

5

รุ่น lazy จะส่งคืนวัตถุพร็อกซีแทนสตริงและในบางสถานการณ์มันจะไม่ทำงานตามที่คาดไว้ ตัวอย่างเช่น:

def get(self, request, format=None):
   search_str = request.GET.get('search', '')
   data = self.search(search_str)
   lst = []
   lst.append({'name': ugettext_lazy('Client'), 'result': data})
   return HttpResponse(json.dumps(lst), content_type='application/json')

จะล้มเหลวเพราะบรรทัดสุดท้ายจะลองเป็นอันดับวัตถุlstใน JSON และแทนที่จะเป็นสตริงสำหรับ "ลูกค้า" มันจะมีวัตถุพร็อกซี่ วัตถุพร็อกซี่ไม่เป็นอนุกรมเป็น json


2
คุณควรใช้ ugettext ในกรณีเหล่านี้
sudip
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.