Thành viên:Plantaest/Blog/Giới thiệu Mô đun:ParameterAliasNormalizer và giải pháp sử dụng tham số tiếng Việt cho bản mẫu

Đăng lại từ Wikipedia:Thảo luận/Lưu 60 § Giới thiệu Mô đun:ParameterAliasNormalizer và giải pháp sử dụng tham số tiếng Việt cho bản mẫu.

Xin chào mọi người. Hôm nay, tôi xin giới thiệu một giải pháp kỹ thuật để sửa một số lỗi đặc thù của bản mẫu.

Vấn đề dịch tham số nhưng không chừa lại tên tham số tiếng Anh sửa

Bối cảnh là một số bản mẫu ban đầu được dịch sang tiếng Việt, và dịch luôn cả tên tham số, một số bản mẫu khi dịch đôi khi không để lại tham số tiếng Anh ban đầu. Ví dụ như tham số gốc của bản mẫu là: (1)

{{{name|}}}

Thay vì dịch là: (2)

{{{name|{{{tên|}}}}}}

Thì lại dịch là: (3)

{{{tên|}}}

Điều này dẫn đến việc bản mẫu không thể nhận biết được các tham số tiếng Anh gốc khi dán trực tiếp mã bản mẫu từ enwiki (vì tham số "name" đã bị mất, còn mỗi tham số "tên").

Một số bản mẫu sở hữu tham số tiếng Việt đã được nhúng trong một lượng lớn bài viết, tích lũy qua nhiều năm tháng, dẫn đến đôi khi xảy ra những trường hợp phức tạp khi muốn cập nhật mới.

Ví dụ như ở Bản mẫu:Thông tin sông, xem lại một phiên bản cũ, ta có thể thấy dòng mã sau:

| subheader = {{{tên địa phương|{{{Tên địa phương|}}}}}}

Nghĩa là nếu gọi bản mẫu này ở một trang nào đó, thì mã {{Thông tin sông | tên địa phương = ABC}} sẽ hoạt động, nhưng {{Thông tin sông | name_native = ABC}} (tham số gốc từ bản mẫu enwiki) thì lại không hoạt động.

Do đó, vấn đề ở đây là khi dịch phần tham số của bản mẫu, cần giữ lại tên tham số tiếng Anh gốc, rồi lồng tên tham số tiếng Việt tương ứng như (2). Điều này sẽ giúp khi dán trực tiếp bản mẫu từ enwiki thì bản mẫu vẫn hoạt động bình thường.

Vấn đề của Bản mẫu:Thông tin sông từng được nêu ra ở TNCBQV.

Vấn đề không thể dịch tên tham số khi bản mẫu dùng mô đun sửa

Như ở mục trên, chúng ta có thể dùng song hành nhiều tên tham số khác nhau (có Anh có Việt) cho cùng một tham số. Ví dụ như tham số {{{name|{{{tên|}}}}}} sẽ nhận giá trị từ cả tên tham số "name" hoặc "tên".

Nhưng đây là cú pháp của bản mẫu. Nên nếu như bản mẫu đó là một mô đun trá hình (bản mẫu nhúng mô đun), thì không thể áp dụng được. Vấn đề phức tạp này đã xảy ra với Bản mẫu:Thông tin chiến tranh.

Bối cảnh là, bản mẫu Thông tin chiến tranh (phiên bản trước ngày 27/1/2021) có thể vẫn nhận diện tốt cả tên tham số tiếng Anh và tiếng Việt, bằng việc dùng cú pháp như (2). Như vậy, khi nhúng bản mẫu Thông tin chiến tranh, có thể dùng song hành tên tham số tiếng Anh và tiếng Việt.

Nhưng phiên bản bản mẫu này ở enwiki đã chuyển sang dùng mô đun Lua, và có những cập nhật mới. Việc dùng mô đun cho bản mẫu khiến các tên tham số tiếng Việt bị mất. Ví dụ, nếu khi chưa dùng mô đun, thì hai mã {{Thông tin chiến tranh | partof = ABC}}{{Thông tin chiến tranh | một phần của = ABC}} là tương đương nhau; nhưng khi dùng mô đun cho bản mẫu, thì chỉ có "partof" hoạt động, còn "một phần của" thì không.

Nguyên nhân ở mô đun hỗ trợ Bản mẫu:Thông tin chiến tranhMô đun:Infobox military conflict chỉ đang "trỏ" đến những tên tham số tiếng Anh. Ví dụ như mã self.args.partof sẽ bắt lấy giá trị của tham số "partof". Tuy chúng ta vẫn có thể ép mô đun bắt được tham số tiếng Việt, bằng việc dùng ngoặc vuông [] để trỏ đến tên tham số, ví dụ như self.args["một phần của"]. Nhưng việc này làm tăng thêm "chi phí" không cần thiết, và tác động nhiều đến mã gốc là điều không nên.

Vì lý do đó, khi cho bản mẫu Thông tin chiến tranh dùng mô đun, đã khiến các tên tham số tiếng Việt cũ không còn hoạt động, bản mẫu bị mất nội dung ở những bài dùng tên tham số tiếng Việt. Xem vụ việc 1vụ việc 2.

Bên cạnh đó, dù cho là không xảy ra trường hợp như bản mẫu Thông tin chiến tranh, thì việc dịch tên tham số như kiểu (2) vẫn gặp một số bất cập.

  • Thứ nhất là việc dịch đã tác động đến nhiều phần của mã gốc. Ví dụ, bản mẫu gốc ban đầu có 20 tham số, thì việc dịch sẽ kẹp thêm 20 tham số nữa, tổng là 40 tham số (40 tham số để đại diện cho 20 tham số "thực"). Điều này gây ảnh hưởng đến hiệu suất.
  • Thứ hai là việc dịch cũng không được thuận tiện, khi trong bản mẫu, các tham số thường nằm rải rác đều khắp bản mẫu.
  • Thứ ba là có thể không tái sử dụng được chức năng ban đầu của bản mẫu. Ví dụ, cuối các bản mẫu infobox ở enwiki hiện hay có mã {{#invoke:Check for unknown parameters ... }} nhằm bắt những trường hợp nhập sai tên tham số để cho vào thể loại bảo trì. Nhưng yêu cầu của mô đun Check for unknown parameters là cần cung cấp danh sách tên tham số của bản mẫu. Nên do đó, ban đầu đã có 20 tham số, dịch thì tăng lên thành 40, thì cũng phải cập nhật cho đủ danh sách này nếu muốn bắt ngoại lệ, khá mất công.

Giải pháp sử dụng Mô đun:ParameterAliasNormalizer để ánh xạ tên tham số tiếng Việt về tiếng Anh (tên gốc) sửa

Hiện nay, tôi thấy giải pháp tối ưu nhất để dùng song hành tên tham số tiếng Việt lẫn tiếng Anh, đồng thời kế thừa được những tham số cũ, dùng được ở bản mẫu nhúng mô đun, mà không cần tác động sâu vào cú pháp bản mẫu, và vẫn đảm bảo hoạt động các chức năng của bản mẫu gốc như Check for unknown parameters, thì chỉ có Mô đun:ParameterAliasNormalizer.

Để hiểu về cách mô đun này hoạt động, thì cần xem lại cách mà MediaWiki render một bản mẫu.

Ví dụ như ban đầu, ở một trang bất kỳ (trang A), ta nhúng đoạn mã như: {{Thông tin sông | tên sông = Hoàng Hà | độ dài = 5.464 km}}. Thì nếu như bản mẫu được nhúng ở đây (Thông tin sông) đã có khai báo trong mã nguồn của nó hai tham số "tên sông" và "độ dài" thì trang A sẽ hiển thị được bản mẫu hoàn chỉnh. Xem minh họa dưới.

 
Render bản mẫu thông thường

Nhưng giả sử như, chúng ta không muốn tác động đến mã gốc (xét phần tham số) của bản mẫu. Nghĩa rằng, khi nhập bản mẫu Thông tin sông từ enwiki vào viwiki, chúng ta để nguyên phần tham số, ví dụ như không dịch {{{name|}}} thành {{{tên sông|}}} hay {{{name|{{{tên sông|}}}}}}, tương tự với "length" (độ dài). Thì có cách nào, khi nhúng mã {{Thông tin sông | tên sông = Hoàng Hà | độ dài = 5.464 km}} thì bản mẫu vẫn hiển thị đúng, dù là bản mẫu đang không được khai báo các tham số tiếng Việt này.

Giải pháp ở đây là dùng Mô đun:ParameterAliasNormalizer, theo quy trình điển hình là:

  1. Bước 1: Chuyển toàn bộ mã nguồn của bản mẫu gốc (ví dụ như mã nguồn trong trang Bản mẫu:Thông tin sông) vào trang con /main (ví dụ như Bản mẫu:Thông tin sông/main). Khi dịch mã bản mẫu gốc, chúng ta chỉ cần dịch các label (nhãn, ghi chú, text), không được dịch các tham số.
  2. Bước 2: Quay lại trang chính của bản mẫu, lúc này đang trống (ví dụ trang chính là Bản mẫu:Thông tin sông), tiến hành nhúng Mô đun:ParameterAliasNormalizer như mẫu sau:
{{#invoke: ParameterAliasNormalizer | main
| __template = Thông tin sông/main
<!-- param aliases -->
| name                = tên sông
| length              = độ dài
}}

Đoạn mã trên có ý nghĩa là khi ở một trang nào đó, chúng ta nhúng mã bản mẫu như {{Thông tin sông | tên sông = Hoàng Hà | độ dài = 5.464 km}}, thì bản mẫu sẽ gọi ra mô đun ParameterAliasNormalizer. Mô đun này sẽ thu thập các tham số (bao gồm tên và giá trị tham số) của bản mẫu, kiểm tra rằng: Nếu tên tham số là "tên sông" chẳng hạn (một tên tham số đang có trong "từ điển" của mô đun), thì mô đun sẽ lấy giá trị của tham số này (lúc này là "Hoàng Hà") gán cho tên tham số tiếng Anh tương ứng của "tên sông" là "name". Nghĩa là, chúng ta nhập tên sông = Hoàng Hà | độ dài = 5.464 km, nhưng qua mô đun thì nó sẽ ánh xạ thành name = Hoàng Hà | length = 5.464 km. Và các tham số được ánh xạ này sẽ được gửi đến Bản mẫu:Thông tin sông/main (bản mẫu mã gốc) để bung bản mẫu hiển thị ra ngoài trang ban đầu. Xem minh họa dưới.

 
Render bản mẫu thông qua trung gian ParameterAliasNormalizer

Như vậy, bằng phương pháp trên, chúng ta không cần phải dịch trực tiếp tên tham số của bản mẫu, chỉ cần dịch ở "trang từ điển", tránh tác động đến mã gốc ban đầu. Việc này có ích khi muốn dùng song song tên tham số tiếng Việt lẫn tiếng Anh trong cùng một bản mẫu mà không cần dùng cú pháp lồng tham số; hay như khi bản mẫu dùng mô đun, mà mô đun chỉ hỗ trợ tham số tiếng Anh, thì phải dùng ParameterAliasNormalizer để ánh xạ tên tham số tiếng Việt với tên tham số tiếng Anh tương ứng mà mô đun hỗ trợ, như vậy mô đun mới bung được dữ liệu nếu bản mẫu nhúng mô đun đang dùng tên tham số tiếng Việt.

Mô đun ParameterAliasNormalizer do thành viên MeigyokuThmn sáng tạo, và tôi cũng đã cải thiện một số vấn đề của mô đun này để tiện dụng hơn. Hiện tại, các bản mẫu Thông tin sông, Thông tin cầuThông tin chiến tranh đang sử dụng ParameterAliasNormalizer để vừa nâng cấp được bản mẫu lên phiên bản mới nhất tương ứng ở enwiki, mà vẫn bảo tồn được các tham số tiếng Việt, tham số cũ.

P/S: Ý kiến cá nhân là nên áp dụng mô đun ParameterAliasNormalizer đối với các bản mẫu dùng mô đun hay bản mẫu phức tạp nhiều tham số (từ 10-15 tham số trở lên). Còn đối với bản mẫu không dùng mô đun, số lượng tham số ít (từ 1-5 tham số) thì có thể áp dụng trực tiếp cú pháp lồng tham số như (2) nếu muốn dịch tên tham số, vì mức độ phức tạp chưa quá lớn để áp dụng trung gian ParameterAliasNormalizer.

P.T.Đ (thảo luận) 16:33, ngày 27 tháng 1 năm 2021 (UTC)

Bình luận sửa

Quá   Tuyệt!, cảm ơn MeigyokuThmnP.T.Đ rất nhiều. Tôi thường làm việc với bản mẫu theo mã wiki thuần nên rất ái ngại mỗi khi đụng phải bản mẫu dùng Lua, nay có bản mẫu "trung gian" này thì việc dịch bản mẫu Lua không còn phức tạp nữa. Tiếc là lâu rồi không thấy MeigyokuThmn hoạt động. --minhhuy (thảo luận) 17:28, ngày 27 tháng 1 năm 2021 (UTC)

P.s: tôi có thắc mắc thêm là nếu chúng ta đang xài đến 2 tham số tiếng Việt khác nhau thì phải ánh xạ như thế nào? Mô-đun này có hỗ trợ 2 cách dịch của 1 tham số không? --minhhuy (thảo luận) 17:30, ngày 27 tháng 1 năm 2021 (UTC)
Bạn có thể xem mã nguồn của Bản mẫu:Thông tin sông. Ví dụ như mã:
| name = tên/river_name/tên sông
Với mã này, mô đun sẽ bắt giá trị của các tham số "tên" hoặc "river_name" hoặc "tên sông" để ánh xạ đến tham số gốc "name". Cần dấu "/" phân biệt giữa các tên tham số bên phải, để mô đun có thể đọc được. P.T.Đ (thảo luận) 17:37, ngày 27 tháng 1 năm 2021 (UTC)
  Hay lắm, cảm ơn các bạn rất nhiều. — Prenn + 17:39, ngày 27 tháng 1 năm 2021 (UTC)
Quá hay và quá tiện. Cản ơn bạn Đăng đã tạo ra luồng gió mới trong không gian kỹ thuật của Wikipedia Vi. Hy vọng bạn sẽ có thêm nhiều cuộc cách mạng kỹ thuật lớn cho cộng đồng chúng ta. SicMundusCreatusEst (tiếng Latin) 18:09, ngày 27 tháng 1 năm 2021 (UTC)

Cập nhật nhỏ: Vì do là tên tham số có thể có dấu "/", như Bản mẫu:Aircraft specs, nên dấu này sẽ không an toàn để phân tách các trường hợp ánh xạ của 1 tham số. Do đó, tôi vừa chuyển sang đôi dấu sượt ngược "\\" để tránh rủi ro nếu có xảy ra. Trần Nguyễn Minh Huy cập nhật thêm chỗ này nhé. P.T.Đ (thảo luận) 18:18, ngày 27 tháng 1 năm 2021 (UTC)