{"users":[{"id":115923,"username":"Discourse","name":null,"avatar_template":"/user_avatar/meta.discourse.org/discourse/{size}/148734_2.png","admin":true,"trust_level":4},{"id":100484,"username":"JammyDodger","name":"","avatar_template":"/user_avatar/meta.discourse.org/jammydodger/{size}/254611_2.png","trust_level":3},{"id":118713,"username":"Jerome_Hordies","name":"Jerome Hordies","avatar_template":"/user_avatar/meta.discourse.org/jerome_hordies/{size}/267141_2.png","trust_level":1},{"id":27384,"username":"merefield","name":"Robert","avatar_template":"/user_avatar/meta.discourse.org/merefield/{size}/176214_2.png","trust_level":3},{"id":150659,"username":"Jukebo","name":"Jusi","avatar_template":"/user_avatar/meta.discourse.org/jukebo/{size}/423583_2.png","trust_level":1},{"id":23968,"username":"david","name":"David Taylor","avatar_template":"/user_avatar/meta.discourse.org/david/{size}/157490_2.png","flair_name":"team","flair_url":"https://global.discourse-cdn.com/meta/original/3X/e/b/ebee30bd98aef20357e4a177a5a1e45b877ce088.svg","flair_color":"111","flair_group_id":47,"primary_group_name":"team","admin":true,"trust_level":3},{"id":-1,"username":"system","name":"system","avatar_template":"/user_avatar/meta.discourse.org/system/{size}/443519_2.png","admin":true,"moderator":true,"trust_level":4},{"id":166720,"username":"opcourdis","name":null,"avatar_template":"https://avatars.discourse-cdn.com/v4/letter/o/45deac/{size}.png","trust_level":2},{"id":83775,"username":"fitzy","name":"Michael Fitz-Payne","avatar_template":"/user_avatar/meta.discourse.org/fitzy/{size}/192549_2.png","flair_name":"team","flair_url":"https://global.discourse-cdn.com/meta/original/3X/e/b/ebee30bd98aef20357e4a177a5a1e45b877ce088.svg","flair_color":"111","flair_group_id":47,"primary_group_name":"team","trust_level":4},{"id":82960,"username":"manuel","name":"Manuel Kostka","avatar_template":"/user_avatar/meta.discourse.org/manuel/{size}/468169_2.png","flair_name":"team","flair_url":"https://global.discourse-cdn.com/meta/original/3X/e/b/ebee30bd98aef20357e4a177a5a1e45b877ce088.svg","flair_color":"111","flair_group_id":47,"primary_group_name":"team","admin":true,"trust_level":2},{"id":135392,"username":"NateDhaliwal","name":"Nate Dhaliwal","avatar_template":"/user_avatar/meta.discourse.org/natedhaliwal/{size}/313494_2.png","flair_name":"plugin_authors","flair_url":"plug","flair_bg_color":"dddddd","flair_color":"111111","flair_group_id":48,"trust_level":3},{"id":66204,"username":"fzngagan","name":"Faizaan Gagan","avatar_template":"/user_avatar/meta.discourse.org/fzngagan/{size}/259349_2.png","flair_name":"team","flair_url":"https://global.discourse-cdn.com/meta/original/3X/e/b/ebee30bd98aef20357e4a177a5a1e45b877ce088.svg","flair_color":"111","flair_group_id":47,"primary_group_name":"team","admin":true,"trust_level":3},{"id":13900,"username":"thoka","name":"Thomas Kalka","avatar_template":"/user_avatar/meta.discourse.org/thoka/{size}/115652_2.png","trust_level":2},{"id":15209,"username":"pfaffman","name":"Jay Pfaffman","avatar_template":"/user_avatar/meta.discourse.org/pfaffman/{size}/120154_2.png","flair_name":"support-experts","flair_url":"https://global.discourse-cdn.com/meta/original/3X/e/2/e250ec403580530d19e6a9ed42d0d525a51a9dbe.svg","flair_bg_color":"FFFFFF","flair_group_id":142,"trust_level":4},{"id":16539,"username":"Osama","name":"","avatar_template":"/user_avatar/meta.discourse.org/osama/{size}/98013_2.png","flair_name":"team","flair_url":"https://global.discourse-cdn.com/meta/original/3X/e/b/ebee30bd98aef20357e4a177a5a1e45b877ce088.svg","flair_color":"111","flair_group_id":47,"primary_group_name":"team","admin":true,"trust_level":2},{"id":95552,"username":"Moin","name":"","avatar_template":"/user_avatar/meta.discourse.org/moin/{size}/554653_2.png","trust_level":3},{"id":127446,"username":"gormus","name":"Osman Görmüş","avatar_template":"/user_avatar/meta.discourse.org/gormus/{size}/428592_2.png","flair_name":"theme_authors","flair_url":"paintbrush","flair_bg_color":"ddd","flair_color":"111","flair_group_id":73,"trust_level":2},{"id":13093,"username":"pacharanero","name":"Marcus Baw","avatar_template":"/user_avatar/meta.discourse.org/pacharanero/{size}/500583_2.png","flair_name":"VolunteerMods","flair_url":"https://global.discourse-cdn.com/meta/original/4X/2/7/d/27de051915b8a604d176484cd260d10cfc956d42.svg","flair_group_id":276,"primary_group_name":"VolunteerMods","trust_level":4},{"id":98247,"username":"vinyll","name":"Vincent Agnano","avatar_template":"/user_avatar/meta.discourse.org/vinyll/{size}/222495_2.png","trust_level":2},{"id":406,"username":"RGJ","name":"Richard - Communiteq","avatar_template":"/user_avatar/meta.discourse.org/rgj/{size}/523185_2.png","flair_name":"support-experts","flair_url":"https://global.discourse-cdn.com/meta/original/3X/e/2/e250ec403580530d19e6a9ed42d0d525a51a9dbe.svg","flair_bg_color":"FFFFFF","flair_group_id":142,"trust_level":4},{"id":1,"username":"sam","name":"Sam Saffron","avatar_template":"/user_avatar/meta.discourse.org/sam/{size}/102149_2.png","flair_name":"team","flair_url":"https://global.discourse-cdn.com/meta/original/3X/e/b/ebee30bd98aef20357e4a177a5a1e45b877ce088.svg","flair_color":"111","flair_group_id":47,"primary_group_name":"team","admin":true,"trust_level":3},{"id":36685,"username":"Arkshine","name":"","avatar_template":"/user_avatar/meta.discourse.org/arkshine/{size}/298682_2.png","flair_name":"support-advocates","flair_url":"https://global.discourse-cdn.com/meta/original/3X/e/4/e4038d4d9848de2eabab38e17b8bdb69da154024.svg","flair_bg_color":"FFFFFF","flair_group_id":148,"trust_level":3},{"id":191806,"username":"saros","name":"saros","avatar_template":"https://avatars.discourse-cdn.com/v4/letter/s/77aa72/{size}.png","trust_level":1},{"id":14353,"username":"simon","name":"","avatar_template":"/user_avatar/meta.discourse.org/simon/{size}/339122_2.png","trust_level":2},{"id":114728,"username":"darkpixlz","name":"Pyx ","avatar_template":"/user_avatar/meta.discourse.org/darkpixlz/{size}/549896_2.png","flair_name":"VolunteerMods","flair_url":"https://global.discourse-cdn.com/meta/original/4X/2/7/d/27de051915b8a604d176484cd260d10cfc956d42.svg","flair_group_id":276,"primary_group_name":"VolunteerMods","trust_level":4},{"id":125230,"username":"Pieces","name":"","avatar_template":"https://avatars.discourse-cdn.com/v4/letter/p/958977/{size}.png","trust_level":2},{"id":169973,"username":"yuriy","name":"Yuriy Kurant","avatar_template":"/user_avatar/meta.discourse.org/yuriy/{size}/498097_2.png","trust_level":2},{"id":15442,"username":"jericson","name":"Jon Ericson","avatar_template":"/user_avatar/meta.discourse.org/jericson/{size}/116215_2.png","flair_name":"support-explorers","flair_url":"https://global.discourse-cdn.com/meta/original/4X/d/1/b/d1ba0acf09b9d01f87f9e05bbee1dc5b0e316d5f.png","flair_bg_color":"dddddd","flair_color":"111111","flair_group_id":118,"trust_level":2},{"id":23163,"username":"j.jaffeux","name":"Joffrey Jaffeux","avatar_template":"/user_avatar/meta.discourse.org/j.jaffeux/{size}/60297_2.png","flair_name":"team","flair_url":"https://global.discourse-cdn.com/meta/original/3X/e/b/ebee30bd98aef20357e4a177a5a1e45b877ce088.svg","flair_color":"111","flair_group_id":47,"primary_group_name":"team","admin":true,"trust_level":2},{"id":2770,"username":"awesomerobot","name":"Kris","avatar_template":"/user_avatar/meta.discourse.org/awesomerobot/{size}/142900_2.png","flair_name":"team","flair_url":"https://global.discourse-cdn.com/meta/original/3X/e/b/ebee30bd98aef20357e4a177a5a1e45b877ce088.svg","flair_color":"111","flair_group_id":47,"primary_group_name":"team","admin":true,"trust_level":3},{"id":21029,"username":"pmusaraj","name":"Penar Musaraj","avatar_template":"/user_avatar/meta.discourse.org/pmusaraj/{size}/119489_2.png","flair_name":"team","flair_url":"https://global.discourse-cdn.com/meta/original/3X/e/b/ebee30bd98aef20357e4a177a5a1e45b877ce088.svg","flair_color":"111","flair_group_id":47,"primary_group_name":"team","admin":true,"trust_level":3},{"id":125035,"username":"misham","name":"Mykhailo","avatar_template":"/user_avatar/meta.discourse.org/misham/{size}/282796_2.png","trust_level":1},{"id":13378,"username":"angus","name":"Angus McLeod","avatar_template":"/user_avatar/meta.discourse.org/angus/{size}/341715_2.png","flair_name":"support-experts","flair_url":"https://global.discourse-cdn.com/meta/original/3X/e/2/e250ec403580530d19e6a9ed42d0d525a51a9dbe.svg","flair_bg_color":"FFFFFF","flair_group_id":142,"trust_level":4}],"primary_groups":[{"id":47,"name":"team"},{"id":276,"name":"VolunteerMods"}],"flair_groups":[{"id":47,"name":"team","flair_url":"https://global.discourse-cdn.com/meta/original/3X/e/b/ebee30bd98aef20357e4a177a5a1e45b877ce088.svg","flair_bg_color":"","flair_color":"111"},{"id":48,"name":"plugin_authors","flair_url":"plug","flair_bg_color":"dddddd","flair_color":"111111"},{"id":142,"name":"support-experts","flair_url":"https://global.discourse-cdn.com/meta/original/3X/e/2/e250ec403580530d19e6a9ed42d0d525a51a9dbe.svg","flair_bg_color":"FFFFFF","flair_color":""},{"id":73,"name":"theme_authors","flair_url":"paintbrush","flair_bg_color":"ddd","flair_color":"111"},{"id":276,"name":"VolunteerMods","flair_url":"https://global.discourse-cdn.com/meta/original/4X/2/7/d/27de051915b8a604d176484cd260d10cfc956d42.svg","flair_bg_color":"","flair_color":""},{"id":148,"name":"support-advocates","flair_url":"https://global.discourse-cdn.com/meta/original/3X/e/4/e4038d4d9848de2eabab38e17b8bdb69da154024.svg","flair_bg_color":"FFFFFF","flair_color":""},{"id":118,"name":"support-explorers","flair_url":"https://global.discourse-cdn.com/meta/original/4X/d/1/b/d1ba0acf09b9d01f87f9e05bbee1dc5b0e316d5f.png","flair_bg_color":"dddddd","flair_color":"111111"}],"topic_list":{"can_create_topic":false,"filter":"latest","more_topics_url":"/c/documentation/developer-guides/56?page=1","per_page":30,"top_tags":[{"id":478,"name":"如何操作","slug":"how-to"},{"id":820,"name":"主题指南","slug":"theme-guides"},{"id":819,"name":"代码","slug":"code"},{"id":274,"name":"插件指南","slug":"plugin-guides"},{"id":484,"name":"教程","slug":"tutorial"},{"id":150,"name":"开发人员安装","slug":"dev-install"},{"id":482,"name":"参考","slug":"reference"},{"id":479,"name":"解释","slug":"explanation"},{"id":70,"name":"余烬","slug":"ember"},{"id":58,"name":"测试","slug":"testing"},{"id":543,"name":"人工智能","slug":"ai"},{"id":643,"name":"自动深色","slug":"auto-dark"},{"id":275,"name":"自动化","slug":"automation"},{"id":436,"name":"css","slug":"css"},{"id":814,"name":"定制","slug":"customization"},{"id":24,"name":"docker","slug":"docker"},{"id":799,"name":"索引","slug":"index"},{"id":52,"name":"markdown","slug":"markdown"},{"id":328,"name":"插件api","slug":"plugin-api"},{"id":566,"name":"主题创建者","slug":"theme-creator"},{"id":16,"name":"翻译","slug":"translation"},{"id":25,"name":"维基帖子","slug":"wiki-posts"}],"topics":[{"fancy_title":"开发者指南索引","fancy_title_localized":true,"locale":"en","id":308036,"title":"Developer Guides Index","slug":"developer-guides-index","posts_count":1,"reply_count":1,"highest_post_number":1,"image_url":null,"created_at":"2024-05-15T06:05:51.350Z","last_posted_at":"2024-05-15T06:05:51.457Z","bumped":true,"bumped_at":"2026-09-19T05:45:40.300Z","archetype":"regular","unseen":false,"pinned":true,"unpinned":null,"excerpt":"关于使用插件、主题和主题组件扩展 Discourse、处理核心代码以及使用 Discourse API 的文档。\n简介\n\n简介：Discourse 开发入门\n\n开发&hellip;","visible":true,"closed":true,"archived":false,"bookmarked":null,"liked":null,"thumbnails":null,"tags":[{"id":799,"name":"索引","slug":"index"}],"tags_descriptions":{"索引":"文档类别索引主题。"},"views":2262,"like_count":14,"has_summary":false,"last_poster_username":"Discourse","category_id":56,"op_like_count":14,"pinned_globally":false,"featured_link":null,"has_accepted_answer":false,"can_vote":false,"posters":[{"extras":"latest","description":"原始發帖人、最新發帖人","user_id":115923,"primary_group_id":null,"flair_group_id":null},{"extras":null,"description":"最近發文者","user_id":100484,"primary_group_id":null,"flair_group_id":null}]},{"fancy_title":"为主题和主题组件添加可本地化字符串","fancy_title_localized":true,"locale":"en","id":109867,"title":"Add localizable strings to themes and theme components","slug":"add-localizable-strings-to-themes-and-theme-components","posts_count":23,"reply_count":14,"highest_post_number":24,"image_url":"https://global.discourse-cdn.com/meta/optimized/4X/4/7/e/47e010f967d46f02641044230b73e321aa47f7ae_2_1024x576.png","created_at":"2019-02-22T22:21:45.254Z","last_posted_at":"2024-08-09T19:58:55.662Z","bumped":true,"bumped_at":"2026-09-24T02:59:43.642Z","archetype":"regular","unseen":false,"pinned":false,"unpinned":null,"excerpt":"对于希望为 Discourse 主题或主题组件添加自定义语言和翻译的用户，现在可以包含本地化字符串，这些字符串可供 UI 组件使用。翻译内容存储在 th&hellip;","visible":true,"closed":false,"archived":false,"bookmarked":null,"liked":null,"thumbnails":[{"max_width":null,"max_height":null,"width":1378,"height":776,"url":"https://global.discourse-cdn.com/meta/original/4X/4/7/e/47e010f967d46f02641044230b73e321aa47f7ae.png"},{"max_width":1024,"max_height":1024,"width":1024,"height":576,"url":"https://global.discourse-cdn.com/meta/optimized/4X/4/7/e/47e010f967d46f02641044230b73e321aa47f7ae_2_1024x576.png"},{"max_width":800,"max_height":800,"width":800,"height":450,"url":"https://global.discourse-cdn.com/meta/optimized/4X/4/7/e/47e010f967d46f02641044230b73e321aa47f7ae_2_800x450.png"},{"max_width":600,"max_height":600,"width":600,"height":337,"url":"https://global.discourse-cdn.com/meta/optimized/4X/4/7/e/47e010f967d46f02641044230b73e321aa47f7ae_2_600x337.png"},{"max_width":400,"max_height":400,"width":400,"height":225,"url":"https://global.discourse-cdn.com/meta/optimized/4X/4/7/e/47e010f967d46f02641044230b73e321aa47f7ae_2_400x225.png"},{"max_width":300,"max_height":300,"width":300,"height":168,"url":"https://global.discourse-cdn.com/meta/optimized/4X/4/7/e/47e010f967d46f02641044230b73e321aa47f7ae_2_300x168.png"},{"max_width":200,"max_height":200,"width":200,"height":112,"url":"https://global.discourse-cdn.com/meta/optimized/4X/4/7/e/47e010f967d46f02641044230b73e321aa47f7ae_2_200x112.png"}],"tags":[{"id":478,"name":"如何操作","slug":"how-to"},{"id":820,"name":"主题指南","slug":"theme-guides"}],"tags_descriptions":{"如何操作":"操作指南包含解决特定问题的步骤"},"views":5822,"like_count":54,"has_summary":false,"last_poster_username":"david","category_id":56,"op_like_count":32,"pinned_globally":false,"featured_link":null,"has_accepted_answer":false,"can_vote":false,"posters":[{"extras":null,"description":"原始發帖人","user_id":115923,"primary_group_id":null,"flair_group_id":null},{"extras":null,"description":"頻繁發帖人","user_id":118713,"primary_group_id":null,"flair_group_id":null},{"extras":null,"description":"頻繁發帖人","user_id":27384,"primary_group_id":null,"flair_group_id":null},{"extras":null,"description":"最近發文者","user_id":150659,"primary_group_id":null,"flair_group_id":null},{"extras":"latest","description":"最新發帖人","user_id":23968,"primary_group_id":47,"flair_group_id":47}]},{"fancy_title":"Using service objects in Discourse","fancy_title_localized":false,"locale":null,"id":333641,"title":"Using service objects in Discourse","slug":"using-service-objects-in-discourse","posts_count":1,"reply_count":0,"highest_post_number":1,"image_url":null,"created_at":"2024-10-30T15:56:38.400Z","last_posted_at":"2024-10-30T15:56:38.536Z","bumped":true,"bumped_at":"2026-09-23T16:22:12.679Z","archetype":"regular","unseen":false,"pinned":false,"unpinned":null,"excerpt":"Overview\nA service is a small object that encompasses business logic for a given action. \nFrom outside, it should be seen as a sort of black box. You provide it with parameters, it runs (including all the side effects it&hellip;","visible":true,"closed":false,"archived":false,"bookmarked":null,"liked":null,"thumbnails":null,"tags":[],"tags_descriptions":{},"views":929,"like_count":17,"has_summary":false,"last_poster_username":"system","category_id":56,"op_like_count":17,"pinned_globally":false,"featured_link":null,"has_accepted_answer":false,"can_vote":false,"posters":[{"extras":"latest single","description":"原始發帖人、最新發帖人","user_id":-1,"primary_group_id":null,"flair_group_id":null}]},{"fancy_title":"在 Fedora Linux 上配置 Discourse 开发环境","fancy_title_localized":true,"locale":"en","id":163348,"title":"Set up Discourse for development on Fedora Linux","slug":"set-up-discourse-for-development-on-fedora-linux","posts_count":14,"reply_count":12,"highest_post_number":26,"image_url":null,"created_at":"2020-09-08T11:00:32.308Z","last_posted_at":"2026-06-19T05:20:22.329Z","bumped":true,"bumped_at":"2026-09-22T21:14:49.351Z","archetype":"regular","unseen":false,"pinned":false,"unpinned":null,"excerpt":"本指南已在 Fedora 31 和 33 的全新安装环境中经过测试，但也可能适用于同样使用 dnf 作为包管理工具的旧版本。这并非官方指南，但可能对其他开发者……","visible":true,"closed":false,"archived":false,"bookmarked":null,"liked":null,"thumbnails":null,"tags":[{"id":478,"name":"如何操作","slug":"how-to"},{"id":150,"name":"开发人员安装","slug":"dev-install"}],"tags_descriptions":{"如何操作":"操作指南包含解决特定问题的步骤","开发人员安装":"为开发安装 Discourse 的说明和问题"},"views":4863,"like_count":44,"has_summary":false,"last_poster_username":"NateDhaliwal","category_id":56,"op_like_count":27,"pinned_globally":false,"featured_link":null,"has_accepted_answer":false,"can_vote":false,"posters":[{"extras":null,"description":"原始發帖人","user_id":115923,"primary_group_id":null,"flair_group_id":null},{"extras":null,"description":"頻繁發帖人","user_id":166720,"primary_group_id":null,"flair_group_id":null},{"extras":null,"description":"頻繁發帖人","user_id":83775,"primary_group_id":47,"flair_group_id":47},{"extras":null,"description":"最近發文者","user_id":82960,"primary_group_id":47,"flair_group_id":47},{"extras":"latest","description":"最新發帖人","user_id":135392,"primary_group_id":null,"flair_group_id":48}]},{"fancy_title":"Using the AI bot via the Discourse API","fancy_title_localized":false,"locale":null,"id":412826,"title":"Using the AI bot via the Discourse API","slug":"using-the-ai-bot-via-the-discourse-api","posts_count":1,"reply_count":0,"highest_post_number":1,"image_url":null,"created_at":"2026-09-19T05:45:35.552Z","last_posted_at":"2026-09-19T05:45:35.638Z","bumped":true,"bumped_at":"2026-09-19T05:45:35.638Z","archetype":"regular","unseen":false,"pinned":false,"unpinned":null,"excerpt":"Overview\nDiscourse AI exposes an admin/API endpoint for streaming an AI Agent reply over a raw chunked HTTP response. \n\nProtocol: Raw chunked HTTP transfer encoding (NOT Server-Sent Events).\nImplementation: Hijacks the&hellip;","visible":true,"closed":false,"archived":false,"bookmarked":null,"liked":null,"thumbnails":null,"tags":[],"tags_descriptions":{},"views":53,"like_count":2,"has_summary":false,"last_poster_username":"system","category_id":56,"op_like_count":2,"pinned_globally":false,"featured_link":null,"has_accepted_answer":false,"can_vote":false,"posters":[{"extras":"latest single","description":"原始發帖人、最新發帖人","user_id":-1,"primary_group_id":null,"flair_group_id":null}]},{"fancy_title":"开发者 Markdown 扩展指南","fancy_title_localized":true,"locale":"en","id":66023,"title":"Developer's guide to Markdown extensions","slug":"developers-guide-to-markdown-extensions","posts_count":2,"reply_count":13,"highest_post_number":24,"image_url":null,"created_at":"2017-07-11T21:23:25.941Z","last_posted_at":"2026-06-01T08:45:53.539Z","bumped":true,"bumped_at":"2026-09-11T18:11:04.601Z","archetype":"regular","unseen":false,"pinned":false,"unpinned":null,"excerpt":"Discourse 使用了一个名为 Markdown-it 的 Markdown 引擎。\n以下是一些开发笔记，可帮助你修复核心中的 bug 或创建新的插件。\n基础知识\nDiscourse 仅在引擎之上提供了少量辅助功能，……","visible":true,"closed":false,"archived":false,"bookmarked":null,"liked":null,"thumbnails":null,"tags":[{"id":482,"name":"参考","slug":"reference"},{"id":52,"name":"markdown","slug":"markdown"},{"id":819,"name":"代码","slug":"code"}],"tags_descriptions":{},"views":13740,"like_count":36,"has_summary":false,"last_poster_username":"NateDhaliwal","category_id":56,"op_like_count":36,"pinned_globally":false,"featured_link":null,"has_accepted_answer":false,"can_vote":false,"posters":[{"extras":null,"description":"原始發帖人","user_id":115923,"primary_group_id":null,"flair_group_id":null},{"extras":"latest","description":"最新發帖人","user_id":135392,"primary_group_id":null,"flair_group_id":48}]},{"fancy_title":"为 Discourse 添加新的“托管”身份验证方法","fancy_title_localized":true,"locale":"en","id":106695,"title":"Adding a new 'managed' authentication method to Discourse","slug":"adding-a-new-managed-authentication-method-to-discourse","posts_count":3,"reply_count":1,"highest_post_number":7,"image_url":null,"created_at":"2019-01-16T13:44:45.295Z","last_posted_at":"2023-11-29T07:48:14.411Z","bumped":true,"bumped_at":"2026-09-11T09:12:27.661Z","archetype":"regular","unseen":false,"pinned":false,"unpinned":null,"excerpt":"继《未来社交身份验证改进》之后……\n我们目前正在将所有“关联账户”信息迁移到单个数据库表中。这将有助于显著减少重复逻辑，&hellip;","visible":true,"closed":false,"archived":false,"bookmarked":null,"liked":null,"thumbnails":null,"tags":[{"id":479,"name":"解释","slug":"explanation"}],"tags_descriptions":{},"views":3826,"like_count":30,"has_summary":false,"last_poster_username":"thoka","category_id":56,"op_like_count":23,"pinned_globally":false,"featured_link":null,"has_accepted_answer":false,"can_vote":false,"posters":[{"extras":null,"description":"原始發帖人","user_id":115923,"primary_group_id":null,"flair_group_id":null},{"extras":null,"description":"最近發文者","user_id":66204,"primary_group_id":47,"flair_group_id":47},{"extras":"latest","description":"最新發帖人","user_id":13900,"primary_group_id":null,"flair_group_id":null}]},{"fancy_title":"Theme Developer Tutorial: 7. Wrapping up","fancy_title_localized":false,"locale":null,"id":357802,"title":"Theme Developer Tutorial: 7. Wrapping up","slug":"theme-developer-tutorial-7-wrapping-up","posts_count":1,"reply_count":0,"highest_post_number":1,"image_url":null,"created_at":"2025-03-18T15:59:12.182Z","last_posted_at":"2025-03-18T15:59:12.273Z","bumped":true,"bumped_at":"2026-09-10T17:41:14.475Z","archetype":"regular","unseen":false,"pinned":false,"unpinned":null,"excerpt":"This tutorial has been a whistle-stop tour through the process of creating a Discourse theme and experimenting with a few of the most common APIs. Of course, there’s plenty more to learn, so let’s map out some more place&hellip;","visible":true,"closed":false,"archived":false,"bookmarked":null,"liked":null,"thumbnails":null,"tags":[],"tags_descriptions":{},"views":386,"like_count":2,"has_summary":false,"last_poster_username":"system","category_id":56,"op_like_count":2,"pinned_globally":false,"featured_link":null,"has_accepted_answer":false,"can_vote":false,"posters":[{"extras":"latest single","description":"原始發帖人、最新發帖人","user_id":-1,"primary_group_id":null,"flair_group_id":null}]},{"fancy_title":"Theme Developer Tutorial: 6. Using the JS API","fancy_title_localized":false,"locale":null,"id":357801,"title":"Theme Developer Tutorial: 6. Using the JS API","slug":"theme-developer-tutorial-6-using-the-js-api","posts_count":4,"reply_count":2,"highest_post_number":4,"image_url":null,"created_at":"2025-03-18T15:59:11.630Z","last_posted_at":"2025-04-14T23:16:42.528Z","bumped":true,"bumped_at":"2026-09-10T17:41:13.433Z","archetype":"regular","unseen":false,"pinned":false,"unpinned":null,"excerpt":"In the last couple of chapters, we’ve explored how to use the JavaScript API to render content into outlets. renderInOutlet is the most commonly-used API, but there are a ton more! In this chapter we’ll try out a few of &hellip;","visible":true,"closed":false,"archived":false,"bookmarked":null,"liked":null,"thumbnails":null,"tags":[],"tags_descriptions":{},"views":1150,"like_count":9,"has_summary":false,"last_poster_username":"pfaffman","category_id":56,"op_like_count":3,"pinned_globally":false,"featured_link":null,"has_accepted_answer":false,"can_vote":false,"posters":[{"extras":null,"description":"原始發帖人","user_id":-1,"primary_group_id":null,"flair_group_id":null},{"extras":null,"description":"最近發文者","user_id":23968,"primary_group_id":47,"flair_group_id":47},{"extras":"latest","description":"最新發帖人","user_id":15209,"primary_group_id":null,"flair_group_id":142}]},{"fancy_title":"为你的 Discourse 主题添加设置","fancy_title_localized":true,"locale":"en","id":82557,"title":"Add settings to your Discourse theme","slug":"add-settings-to-your-discourse-theme","posts_count":7,"reply_count":52,"highest_post_number":91,"image_url":"https://global.discourse-cdn.com/meta/original/4X/f/1/8/f184f8f16a50a7e3c15efc462e1f07b6dbada223.jpeg","created_at":"2018-03-08T22:28:58.820Z","last_posted_at":"2025-07-08T19:43:17.589Z","bumped":true,"bumped_at":"2026-09-10T17:41:12.366Z","archetype":"regular","unseen":false,"pinned":false,"unpinned":null,"excerpt":"Discourse 允许主题为站点管理员提供“设置”功能，这些设置由主题开发者添加，使站点管理员无需修改任何代码，也不必担心失去对主题的控制，即可通过用户界面自定义主题……","visible":true,"closed":false,"archived":false,"bookmarked":null,"liked":null,"thumbnails":[{"max_width":null,"max_height":null,"width":735,"height":339,"url":"https://global.discourse-cdn.com/meta/original/4X/f/1/8/f184f8f16a50a7e3c15efc462e1f07b6dbada223.jpeg"},{"max_width":600,"max_height":600,"width":600,"height":276,"url":"https://global.discourse-cdn.com/meta/optimized/4X/f/1/8/f184f8f16a50a7e3c15efc462e1f07b6dbada223_2_600x276.jpeg"},{"max_width":400,"max_height":400,"width":400,"height":184,"url":"https://global.discourse-cdn.com/meta/optimized/4X/f/1/8/f184f8f16a50a7e3c15efc462e1f07b6dbada223_2_400x184.jpeg"},{"max_width":300,"max_height":300,"width":300,"height":138,"url":"https://global.discourse-cdn.com/meta/optimized/4X/f/1/8/f184f8f16a50a7e3c15efc462e1f07b6dbada223_2_300x138.jpeg"},{"max_width":200,"max_height":200,"width":200,"height":92,"url":"https://global.discourse-cdn.com/meta/optimized/4X/f/1/8/f184f8f16a50a7e3c15efc462e1f07b6dbada223_2_200x92.jpeg"}],"tags":[{"id":478,"name":"如何操作","slug":"how-to"},{"id":820,"name":"主题指南","slug":"theme-guides"}],"tags_descriptions":{"如何操作":"操作指南包含解决特定问题的步骤"},"views":17553,"like_count":69,"has_summary":false,"last_poster_username":"gormus","category_id":56,"op_like_count":54,"pinned_globally":false,"featured_link":null,"has_accepted_answer":false,"can_vote":false,"posters":[{"extras":null,"description":"原始發帖人","user_id":115923,"primary_group_id":null,"flair_group_id":null},{"extras":null,"description":"頻繁發帖人","user_id":16539,"primary_group_id":47,"flair_group_id":47},{"extras":null,"description":"頻繁發帖人","user_id":15209,"primary_group_id":null,"flair_group_id":142},{"extras":null,"description":"最近發文者","user_id":95552,"primary_group_id":null,"flair_group_id":null},{"extras":"latest","description":"最新發帖人","user_id":127446,"primary_group_id":null,"flair_group_id":73}]},{"fancy_title":"主题开发者快速参考指南","fancy_title_localized":true,"locale":"en","id":110448,"title":"Theme Developer Quick Reference Guide","slug":"theme-developer-quick-reference-guide","posts_count":3,"reply_count":2,"highest_post_number":4,"image_url":null,"created_at":"2019-03-01T16:22:45.321Z","last_posted_at":"2021-06-28T17:13:16.090Z","bumped":true,"bumped_at":"2026-09-10T17:41:10.461Z","archetype":"regular","unseen":false,"pinned":false,"unpinned":null,"excerpt":"随着主题功能越来越强大，需要了解的工作机制也越来越多。我们在 #theme-guides 下提供了大量详细的文档，但如果你只是想快速回顾一下，这份指南可能会有所帮助。\n通用 Re&hellip;","visible":true,"closed":false,"archived":false,"bookmarked":null,"liked":null,"thumbnails":null,"tags":[{"id":482,"name":"参考","slug":"reference"},{"id":820,"name":"主题指南","slug":"theme-guides"}],"tags_descriptions":{},"views":10048,"like_count":58,"has_summary":false,"last_poster_username":"vinyll","category_id":56,"op_like_count":40,"pinned_globally":false,"featured_link":null,"has_accepted_answer":false,"can_vote":false,"posters":[{"extras":null,"description":"原始發帖人","user_id":115923,"primary_group_id":null,"flair_group_id":null},{"extras":null,"description":"最近發文者","user_id":13093,"primary_group_id":276,"flair_group_id":276},{"extras":"latest","description":"最新發帖人","user_id":98247,"primary_group_id":null,"flair_group_id":null}]},{"fancy_title":"Designing for Responsive Widths (Breakpoints, Viewport &amp; Containers)","fancy_title_localized":false,"locale":null,"id":409279,"title":"Designing for Responsive Widths (Breakpoints, Viewport & Containers)","slug":"designing-for-responsive-widths-breakpoints-viewport-containers","posts_count":1,"reply_count":0,"highest_post_number":1,"image_url":null,"created_at":"2026-08-04T15:57:19.956Z","last_posted_at":"2026-08-04T15:57:20.124Z","bumped":true,"bumped_at":"2026-09-10T17:41:09.474Z","archetype":"regular","unseen":false,"pinned":false,"unpinned":null,"excerpt":"This document outlines the APIs used to adapt Discourse’s user interface to different widths — both the browser viewport, and individual containers on the page. \nWe design “mobile first” and then add customizations for l&hellip;","visible":true,"closed":false,"archived":false,"bookmarked":null,"liked":null,"thumbnails":null,"tags":[],"tags_descriptions":{},"views":123,"like_count":3,"has_summary":false,"last_poster_username":"system","category_id":56,"op_like_count":3,"pinned_globally":false,"featured_link":null,"has_accepted_answer":false,"can_vote":false,"posters":[{"extras":"latest single","description":"原始發帖人、最新發帖人","user_id":-1,"primary_group_id":null,"flair_group_id":null}]},{"fancy_title":"Designing for Different Devices (Touch &amp; Hover)","fancy_title_localized":false,"locale":null,"id":367810,"title":"Designing for Different Devices (Touch & Hover)","slug":"designing-for-different-devices-touch-hover","posts_count":15,"reply_count":11,"highest_post_number":15,"image_url":null,"created_at":"2025-05-27T18:17:05.719Z","last_posted_at":"2026-01-25T21:34:26.908Z","bumped":true,"bumped_at":"2026-09-10T17:41:08.406Z","archetype":"regular","unseen":false,"pinned":false,"unpinned":null,"excerpt":"This document outlines the APIs used to adapt Discourse’s user interface for different devices. \nTouch &amp; Hover\nSome devices only have touchscreens, some only have a traditional mouse pointer, and some have both. Importan&hellip;","visible":true,"closed":false,"archived":false,"bookmarked":null,"liked":null,"thumbnails":null,"tags":[],"tags_descriptions":{},"views":1265,"like_count":26,"has_summary":false,"last_poster_username":"merefield","category_id":56,"op_like_count":13,"pinned_globally":false,"featured_link":null,"has_accepted_answer":false,"can_vote":false,"posters":[{"extras":null,"description":"原始發帖人","user_id":-1,"primary_group_id":null,"flair_group_id":null},{"extras":null,"description":"頻繁發帖人","user_id":23968,"primary_group_id":47,"flair_group_id":47},{"extras":null,"description":"頻繁發帖人","user_id":135392,"primary_group_id":null,"flair_group_id":48},{"extras":null,"description":"最近發文者","user_id":406,"primary_group_id":null,"flair_group_id":142},{"extras":"latest","description":"最新發帖人","user_id":27384,"primary_group_id":null,"flair_group_id":null}]},{"fancy_title":"Guidelines for CSS classes using BEM","fancy_title_localized":false,"locale":null,"id":361851,"title":"Guidelines for CSS classes using BEM","slug":"guidelines-for-css-classes-using-bem","posts_count":1,"reply_count":0,"highest_post_number":1,"image_url":null,"created_at":"2025-04-15T05:48:23.418Z","last_posted_at":"2025-04-15T05:48:23.483Z","bumped":true,"bumped_at":"2026-09-10T17:41:07.479Z","archetype":"regular","unseen":false,"pinned":false,"unpinned":null,"excerpt":"Background\nWhen writing CSS classes for Discourse components, themes, or plugins, we follow a modified variant of Block Element Modifier (BEM). Following these guidelines will make it much less likely for CSS conflicts t&hellip;","visible":true,"closed":false,"archived":false,"bookmarked":null,"liked":null,"thumbnails":null,"tags":[],"tags_descriptions":{},"views":387,"like_count":8,"has_summary":false,"last_poster_username":"system","category_id":56,"op_like_count":8,"pinned_globally":false,"featured_link":null,"has_accepted_answer":false,"can_vote":false,"posters":[{"extras":"latest single","description":"原始發帖人、最新發帖人","user_id":-1,"primary_group_id":null,"flair_group_id":null}]},{"fancy_title":"Customizing the topic list","fancy_title_localized":false,"locale":null,"id":350411,"title":"Customizing the topic list","slug":"customizing-the-topic-list","posts_count":1,"reply_count":0,"highest_post_number":1,"image_url":null,"created_at":"2025-02-04T10:40:33.076Z","last_posted_at":"2025-02-04T10:40:33.148Z","bumped":true,"bumped_at":"2026-09-10T17:41:06.489Z","archetype":"regular","unseen":false,"pinned":false,"unpinned":null,"excerpt":"The topic-list is one of the most-used and most-customized user-interfaces in Discourse. There are many different tools available to theme and plugin developers to achieve this customization, each with their own advantag&hellip;","visible":true,"closed":false,"archived":false,"bookmarked":null,"liked":null,"thumbnails":null,"tags":[],"tags_descriptions":{},"views":872,"like_count":8,"has_summary":false,"last_poster_username":"system","category_id":56,"op_like_count":8,"pinned_globally":false,"featured_link":null,"has_accepted_answer":false,"can_vote":false,"posters":[{"extras":"latest single","description":"原始發帖人、最新發帖人","user_id":-1,"primary_group_id":null,"flair_group_id":null}]},{"fancy_title":"使用 DModal API 在 Discourse 中渲染模态窗口（即弹窗/对话框）","fancy_title_localized":true,"locale":"en","id":268304,"title":"Using the DModal API to render Modal windows (aka popups/dialogs) in Discourse","slug":"using-the-dmodal-api-to-render-modal-windows-aka-popups-dialogs-in-discourse","posts_count":1,"reply_count":1,"highest_post_number":1,"image_url":"https://global.discourse-cdn.com/meta/original/4X/4/0/b/40be9a7c253202136882269ba77d47ad86bd6d35.png","created_at":"2023-07-03T09:52:06.275Z","last_posted_at":"2023-07-03T09:52:06.275Z","bumped":true,"bumped_at":"2026-09-10T17:41:03.594Z","archetype":"regular","unseen":false,"pinned":false,"unpinned":null,"excerpt":"Discourse 3.1.0.beta6 引入了全新的基于组件的 <DModal> API。DModal 是 UI 套件的一部分，可从 discourse/ui-kit/d-modal 导入。\n\n:information_source: 此 API 取代了旧的基于控制器的 API，&hellip;","visible":true,"closed":false,"archived":false,"bookmarked":null,"liked":null,"thumbnails":[{"max_width":null,"max_height":null,"width":696,"height":258,"url":"https://global.discourse-cdn.com/meta/original/4X/4/0/b/40be9a7c253202136882269ba77d47ad86bd6d35.png"},{"max_width":600,"max_height":600,"width":600,"height":222,"url":"https://global.discourse-cdn.com/meta/optimized/4X/4/0/b/40be9a7c253202136882269ba77d47ad86bd6d35_2_600x222.png"},{"max_width":400,"max_height":400,"width":400,"height":148,"url":"https://global.discourse-cdn.com/meta/optimized/4X/4/0/b/40be9a7c253202136882269ba77d47ad86bd6d35_2_400x148.png"},{"max_width":300,"max_height":300,"width":300,"height":111,"url":"https://global.discourse-cdn.com/meta/optimized/4X/4/0/b/40be9a7c253202136882269ba77d47ad86bd6d35_2_300x111.png"},{"max_width":200,"max_height":200,"width":200,"height":74,"url":"https://global.discourse-cdn.com/meta/optimized/4X/4/0/b/40be9a7c253202136882269ba77d47ad86bd6d35_2_200x74.png"}],"tags":[{"id":819,"name":"代码","slug":"code"}],"tags_descriptions":{},"views":2256,"like_count":17,"has_summary":false,"last_poster_username":"Discourse","category_id":56,"op_like_count":17,"pinned_globally":false,"featured_link":null,"has_accepted_answer":false,"can_vote":false,"posters":[{"extras":"latest","description":"原始發帖人、最新發帖人","user_id":115923,"primary_group_id":null,"flair_group_id":null},{"extras":null,"description":"最近發文者","user_id":1,"primary_group_id":47,"flair_group_id":47}]},{"fancy_title":"The UI kit of shared Discourse components, helpers, and modifiers","fancy_title_localized":false,"locale":null,"id":411319,"title":"The UI kit of shared Discourse components, helpers, and modifiers","slug":"the-ui-kit-of-shared-discourse-components-helpers-and-modifiers","posts_count":1,"reply_count":0,"highest_post_number":1,"image_url":null,"created_at":"2026-08-31T17:34:15.933Z","last_posted_at":"2026-08-31T17:34:16.178Z","bumped":true,"bumped_at":"2026-09-10T17:41:01.737Z","archetype":"regular","unseen":false,"pinned":false,"unpinned":null,"excerpt":"ui-kit is the layer of reusable, domain-free building blocks that core, plugins, and themes compose their interfaces from. It lives under frontend/discourse/app/ui-kit/ and ships three kinds of primitive: \n\nComponents:&hellip;","visible":true,"closed":false,"archived":false,"bookmarked":null,"liked":null,"thumbnails":null,"tags":[],"tags_descriptions":{},"views":122,"like_count":3,"has_summary":false,"last_poster_username":"system","category_id":56,"op_like_count":3,"pinned_globally":false,"featured_link":null,"has_accepted_answer":false,"can_vote":false,"posters":[{"extras":"latest single","description":"原始發帖人、最新發帖人","user_id":-1,"primary_group_id":null,"flair_group_id":null}]},{"fancy_title":"在 Windows 上安装 Discourse 用于开发","fancy_title_localized":true,"locale":"en","id":75149,"title":"Install Discourse on Windows for development","slug":"install-discourse-on-windows-for-development","posts_count":17,"reply_count":57,"highest_post_number":120,"image_url":null,"created_at":"2017-12-01T06:36:51.406Z","last_posted_at":"2026-04-22T10:18:42.190Z","bumped":true,"bumped_at":"2026-09-09T03:30:27.819Z","archetype":"regular","unseen":false,"pinned":false,"unpinned":null,"excerpt":":information_source: 本教程已在 Windows 10 和 11 上进行了测试。\n要在 Windows 上设置 Discourse 开发环境，您可以使用 Windows 子系统 for Linux 功能来实现。\n此设置需要 &hellip;","visible":true,"closed":false,"archived":false,"bookmarked":null,"liked":null,"thumbnails":null,"tags":[{"id":478,"name":"如何操作","slug":"how-to"},{"id":150,"name":"开发人员安装","slug":"dev-install"}],"tags_descriptions":{"如何操作":"操作指南包含解决特定问题的步骤","开发人员安装":"为开发安装 Discourse 的说明和问题"},"views":74917,"like_count":68,"has_summary":false,"last_poster_username":"merefield","category_id":56,"op_like_count":52,"pinned_globally":false,"featured_link":null,"has_accepted_answer":false,"can_vote":false,"posters":[{"extras":null,"description":"原始發帖人","user_id":115923,"primary_group_id":null,"flair_group_id":null},{"extras":null,"description":"頻繁發帖人","user_id":36685,"primary_group_id":null,"flair_group_id":148},{"extras":null,"description":"頻繁發帖人","user_id":135392,"primary_group_id":null,"flair_group_id":48},{"extras":null,"description":"最近發文者","user_id":191806,"primary_group_id":null,"flair_group_id":null},{"extras":"latest","description":"最新發帖人","user_id":27384,"primary_group_id":null,"flair_group_id":null}]},{"fancy_title":"在 Ubuntu 或 Debian 上安装 Discourse 用于开发","fancy_title_localized":true,"locale":"en","id":14727,"title":"Install Discourse on Ubuntu or Debian for Development","slug":"install-discourse-on-ubuntu-or-debian-for-development","posts_count":84,"reply_count":490,"highest_post_number":756,"image_url":null,"created_at":"2014-04-12T22:22:07.751Z","last_posted_at":"2025-06-22T00:31:14.326Z","bumped":true,"bumped_at":"2026-09-09T03:30:25.595Z","archetype":"regular","unseen":false,"pinned":false,"unpinned":null,"excerpt":":warning: 本指南涵盖开发环境中的安装步骤。如需生产环境安装指南，请参阅：使用官方支持的说明在生产环境中安装 Discourse \n\n\n所以你想安装 Discour&hellip;","visible":true,"closed":false,"archived":false,"bookmarked":null,"liked":null,"thumbnails":null,"tags":[{"id":478,"name":"如何操作","slug":"how-to"},{"id":150,"name":"开发人员安装","slug":"dev-install"}],"tags_descriptions":{"如何操作":"操作指南包含解决特定问题的步骤","开发人员安装":"为开发安装 Discourse 的说明和问题"},"views":202292,"like_count":134,"has_summary":true,"last_poster_username":"NateDhaliwal","category_id":56,"op_like_count":66,"pinned_globally":false,"featured_link":null,"has_accepted_answer":false,"can_vote":false,"posters":[{"extras":null,"description":"原始發帖人","user_id":115923,"primary_group_id":null,"flair_group_id":null},{"extras":null,"description":"頻繁發帖人","user_id":14353,"primary_group_id":null,"flair_group_id":null},{"extras":null,"description":"頻繁發帖人","user_id":114728,"primary_group_id":276,"flair_group_id":276},{"extras":null,"description":"最近發文者","user_id":27384,"primary_group_id":null,"flair_group_id":null},{"extras":"latest","description":"最新發帖人","user_id":135392,"primary_group_id":null,"flair_group_id":48}]},{"fancy_title":"在 macOS 上安装 Discourse 用于开发","fancy_title_localized":true,"locale":"en","id":15772,"title":"Install Discourse on macOS for development","slug":"install-discourse-on-macos-for-development","posts_count":103,"reply_count":236,"highest_post_number":402,"image_url":null,"created_at":"2014-05-19T16:59:50.976Z","last_posted_at":"2026-04-24T18:38:20.659Z","bumped":true,"bumped_at":"2026-09-09T03:30:24.313Z","archetype":"regular","unseen":false,"pinned":false,"unpinned":null,"excerpt":":warning: 本指南介绍了 macOS 开发环境的安装说明，有关生产环境的指南，请参阅：使用官方支持的说明在生产环境中安装 Discourse \n\n你想安装 Disc&hellip;","visible":true,"closed":false,"archived":false,"bookmarked":null,"liked":null,"thumbnails":null,"tags":[{"id":478,"name":"如何操作","slug":"how-to"},{"id":150,"name":"开发人员安装","slug":"dev-install"}],"tags_descriptions":{"如何操作":"操作指南包含解决特定问题的步骤","开发人员安装":"为开发安装 Discourse 的说明和问题"},"views":116970,"like_count":283,"has_summary":true,"last_poster_username":"jericson","category_id":56,"op_like_count":78,"pinned_globally":false,"featured_link":null,"has_accepted_answer":false,"can_vote":false,"posters":[{"extras":null,"description":"原始發帖人","user_id":115923,"primary_group_id":null,"flair_group_id":null},{"extras":null,"description":"頻繁發帖人","user_id":125230,"primary_group_id":null,"flair_group_id":null},{"extras":null,"description":"頻繁發帖人","user_id":14353,"primary_group_id":null,"flair_group_id":null},{"extras":null,"description":"最近發文者","user_id":169973,"primary_group_id":null,"flair_group_id":null},{"extras":"latest","description":"最新發帖人","user_id":15442,"primary_group_id":null,"flair_group_id":118}]},{"fancy_title":"Bundle splitting for plugins","fancy_title_localized":false,"locale":null,"id":411886,"title":"Bundle splitting for plugins","slug":"bundle-splitting-for-plugins","posts_count":1,"reply_count":0,"highest_post_number":1,"image_url":null,"created_at":"2026-09-08T11:07:29.302Z","last_posted_at":"2026-09-08T11:07:29.464Z","bumped":true,"bumped_at":"2026-09-08T11:07:29.464Z","archetype":"regular","unseen":false,"pinned":false,"unpinned":null,"excerpt":"By default, every javascript module in a plugin is loaded when Discourse boots. This guide describes the staticModules system, which allows code to be automatically loaded on-demand, thereby improving initial boot times. &hellip;","visible":true,"closed":false,"archived":false,"bookmarked":null,"liked":null,"thumbnails":null,"tags":[],"tags_descriptions":{},"views":78,"like_count":1,"has_summary":false,"last_poster_username":"system","category_id":56,"op_like_count":1,"pinned_globally":false,"featured_link":null,"has_accepted_answer":false,"can_vote":false,"posters":[{"extras":"latest single","description":"原始發帖人、最新發帖人","user_id":-1,"primary_group_id":null,"flair_group_id":null}]},{"fancy_title":"Using Transformers to customize client-side values and behavior","fancy_title_localized":false,"locale":null,"id":349954,"title":"Using Transformers to customize client-side values and behavior","slug":"using-transformers-to-customize-client-side-values-and-behavior","posts_count":3,"reply_count":0,"highest_post_number":3,"image_url":null,"created_at":"2025-01-31T20:19:51.229Z","last_posted_at":"2026-09-05T02:53:05.790Z","bumped":true,"bumped_at":"2026-09-05T02:53:05.790Z","archetype":"regular","unseen":false,"pinned":false,"unpinned":null,"excerpt":"Discourse core includes a number of “transformer” hooks which can be used to customize client behavior. These fall into two categories: \n\n\nValue Transformers take an output from Discourse core, and optionally modify it, &hellip;","visible":true,"closed":false,"archived":false,"bookmarked":null,"liked":null,"thumbnails":null,"tags":[],"tags_descriptions":{},"views":771,"like_count":13,"has_summary":false,"last_poster_username":"NateDhaliwal","category_id":56,"op_like_count":10,"pinned_globally":false,"featured_link":null,"has_accepted_answer":false,"can_vote":false,"posters":[{"extras":null,"description":"原始發帖人","user_id":-1,"primary_group_id":null,"flair_group_id":null},{"extras":"latest","description":"最新發帖人","user_id":135392,"primary_group_id":null,"flair_group_id":48}]},{"fancy_title":"Discourse toolkit to render forms","fancy_title_localized":false,"locale":null,"id":326439,"title":"Discourse toolkit to render forms","slug":"discourse-toolkit-to-render-forms","posts_count":29,"reply_count":18,"highest_post_number":33,"image_url":null,"created_at":"2024-09-13T21:20:27.941Z","last_posted_at":"2025-12-23T17:55:56.356Z","bumped":true,"bumped_at":"2026-09-01T18:53:43.134Z","archetype":"regular","unseen":false,"pinned":false,"unpinned":null,"excerpt":"Basic Usage\nFormKit exposes a single component as its public API: &lt;Form /&gt;. All other elements are yielded as contextual components, modifiers, or plain data. \nEvery form is composed of one or multiple fields, represen&hellip;","visible":true,"closed":false,"archived":false,"bookmarked":null,"liked":null,"thumbnails":null,"tags":[],"tags_descriptions":{},"views":1853,"like_count":55,"has_summary":false,"last_poster_username":"merefield","category_id":56,"op_like_count":6,"pinned_globally":false,"featured_link":null,"has_accepted_answer":false,"can_vote":false,"posters":[{"extras":null,"description":"原始發帖人","user_id":-1,"primary_group_id":null,"flair_group_id":null},{"extras":null,"description":"頻繁發帖人","user_id":23163,"primary_group_id":47,"flair_group_id":47},{"extras":null,"description":"頻繁發帖人","user_id":2770,"primary_group_id":47,"flair_group_id":47},{"extras":null,"description":"最近發文者","user_id":15209,"primary_group_id":null,"flair_group_id":142},{"extras":"latest","description":"最新發帖人","user_id":27384,"primary_group_id":null,"flair_group_id":null}]},{"fancy_title":"Drag, resize, and gesture primitives","fancy_title_localized":false,"locale":null,"id":410549,"title":"Drag, resize, and gesture primitives","slug":"drag-resize-and-gesture-primitives","posts_count":1,"reply_count":0,"highest_post_number":1,"image_url":null,"created_at":"2026-08-20T16:44:51.931Z","last_posted_at":"2026-08-20T16:44:52.183Z","bumped":true,"bumped_at":"2026-08-31T17:35:02.656Z","archetype":"regular","unseen":false,"pinned":false,"unpinned":null,"excerpt":"ui-kit ships the input-driven gesture primitives: dragging a payload onto a \ntarget, resizing a region, and reading a swipe or a pointer drag. This page is \nthe usage reference. Each primitive’s own TSDoc carries the f&hellip;","visible":true,"closed":false,"archived":false,"bookmarked":null,"liked":null,"thumbnails":null,"tags":[],"tags_descriptions":{},"views":125,"like_count":5,"has_summary":false,"last_poster_username":"system","category_id":56,"op_like_count":5,"pinned_globally":false,"featured_link":null,"has_accepted_answer":false,"can_vote":false,"posters":[{"extras":"latest single","description":"原始發帖人、最新發帖人","user_id":-1,"primary_group_id":null,"flair_group_id":null}]},{"fancy_title":"JavaScript type hinting &amp; validation (typescript)","fancy_title_localized":false,"locale":null,"id":395136,"title":"JavaScript type hinting & validation (typescript)","slug":"javascript-type-hinting-validation-typescript","posts_count":1,"reply_count":0,"highest_post_number":1,"image_url":null,"created_at":"2026-02-04T10:38:25.830Z","last_posted_at":"2026-02-04T10:38:25.913Z","bumped":true,"bumped_at":"2026-08-31T17:34:58.115Z","archetype":"regular","unseen":false,"pinned":false,"unpinned":null,"excerpt":"Discourse ships type information for its JavaScript code. This can provide inline documentation, autocomplete, and other useful IDE features. It can also be used for some basic type validation, using the @ts-check direct&hellip;","visible":true,"closed":false,"archived":false,"bookmarked":null,"liked":null,"thumbnails":null,"tags":[],"tags_descriptions":{},"views":241,"like_count":8,"has_summary":false,"last_poster_username":"system","category_id":56,"op_like_count":8,"pinned_globally":false,"featured_link":null,"has_accepted_answer":false,"can_vote":false,"posters":[{"extras":"latest single","description":"原始發帖人、最新發帖人","user_id":-1,"primary_group_id":null,"flair_group_id":null}]},{"fancy_title":"AppEvents Triggers Reference","fancy_title_localized":false,"locale":null,"id":338465,"title":"AppEvents Triggers Reference","slug":"appevents-triggers-reference","posts_count":1,"reply_count":0,"highest_post_number":1,"image_url":null,"created_at":"2024-11-26T10:20:08.061Z","last_posted_at":"2024-11-26T10:20:08.461Z","bumped":true,"bumped_at":"2026-08-31T17:34:52.470Z","archetype":"regular","unseen":false,"pinned":false,"unpinned":null,"excerpt":"AppEvents\nThe AppEvent system in Discourse provides a pub/sub mechanism for handling UI updates and component interactions - and these events are triggered via calls of AppEvent.trigger. \nThis topic consolidates a list&hellip;","visible":true,"closed":false,"archived":false,"bookmarked":null,"liked":null,"thumbnails":null,"tags":[],"tags_descriptions":{},"views":565,"like_count":10,"has_summary":false,"last_poster_username":"system","category_id":56,"op_like_count":10,"pinned_globally":false,"featured_link":null,"has_accepted_answer":false,"can_vote":false,"posters":[{"extras":"latest single","description":"原始發帖人、最新發帖人","user_id":-1,"primary_group_id":null,"flair_group_id":null}]},{"fancy_title":"Write end-to-end system specs for the Discourse user interface","fancy_title_localized":false,"locale":null,"id":325937,"title":"Write end-to-end system specs for the Discourse user interface","slug":"write-end-to-end-system-specs-for-the-discourse-user-interface","posts_count":4,"reply_count":2,"highest_post_number":5,"image_url":"https://global.discourse-cdn.com/meta/original/4X/5/5/5/55573c386666cc876d212e64995fd6a7a8bccc64.png","created_at":"2024-09-11T04:07:31.148Z","last_posted_at":"2025-08-28T14:51:13.004Z","bumped":true,"bumped_at":"2026-08-31T17:34:46.127Z","archetype":"regular","unseen":false,"pinned":false,"unpinned":null,"excerpt":"Background\nRails system specs are used to simulate the actions of a real user using the app in a browser. We use the Playwright ruby driver which is becoming an industry standard. The tests run locally and in CI out of t&hellip;","visible":true,"closed":false,"archived":false,"bookmarked":null,"liked":null,"thumbnails":[{"max_width":null,"max_height":null,"width":990,"height":602,"url":"https://global.discourse-cdn.com/meta/original/4X/5/5/5/55573c386666cc876d212e64995fd6a7a8bccc64.png"},{"max_width":800,"max_height":800,"width":800,"height":486,"url":"https://global.discourse-cdn.com/meta/optimized/4X/5/5/5/55573c386666cc876d212e64995fd6a7a8bccc64_2_800x486.png"},{"max_width":600,"max_height":600,"width":600,"height":364,"url":"https://global.discourse-cdn.com/meta/optimized/4X/5/5/5/55573c386666cc876d212e64995fd6a7a8bccc64_2_600x364.png"},{"max_width":400,"max_height":400,"width":400,"height":243,"url":"https://global.discourse-cdn.com/meta/optimized/4X/5/5/5/55573c386666cc876d212e64995fd6a7a8bccc64_2_400x243.png"},{"max_width":300,"max_height":300,"width":300,"height":182,"url":"https://global.discourse-cdn.com/meta/optimized/4X/5/5/5/55573c386666cc876d212e64995fd6a7a8bccc64_2_300x182.png"},{"max_width":200,"max_height":200,"width":200,"height":121,"url":"https://global.discourse-cdn.com/meta/optimized/4X/5/5/5/55573c386666cc876d212e64995fd6a7a8bccc64_2_200x121.png"}],"tags":[],"tags_descriptions":{},"views":740,"like_count":12,"has_summary":false,"last_poster_username":"merefield","category_id":56,"op_like_count":9,"pinned_globally":false,"featured_link":null,"has_accepted_answer":false,"can_vote":false,"posters":[{"extras":null,"description":"原始發帖人","user_id":-1,"primary_group_id":null,"flair_group_id":null},{"extras":null,"description":"最近發文者","user_id":21029,"primary_group_id":47,"flair_group_id":47},{"extras":"latest","description":"最新發帖人","user_id":27384,"primary_group_id":null,"flair_group_id":null}]},{"fancy_title":"（不推荐）从主题或插件覆盖 Discourse 模板","fancy_title_localized":true,"locale":"en","id":247487,"title":"(not recommended) Overriding Discourse templates from a Theme or Plugin","slug":"not-recommended-overriding-discourse-templates-from-a-theme-or-plugin","posts_count":10,"reply_count":6,"highest_post_number":14,"image_url":null,"created_at":"2022-12-02T13:52:58.399Z","last_posted_at":"2024-03-07T13:20:54.842Z","bumped":true,"bumped_at":"2026-08-31T17:34:42.109Z","archetype":"regular","unseen":false,"pinned":false,"unpinned":null,"excerpt":"理想情况下，在通过主题/插件自定义 Discourse 时，您应使用 CSS、JavaScript 插件 API 或插件插槽（plugin outlets）。如果这些方法都不适用于您的使用场景，欢迎向 Discourse 核心提交 PR，或发起一个 <span class=\"hashtag-icon-placeholder\"></span>Devel&hellip;","visible":true,"closed":false,"archived":false,"bookmarked":null,"liked":null,"thumbnails":null,"visibility_reason_id":4,"tags":[{"id":478,"name":"如何操作","slug":"how-to"}],"tags_descriptions":{"如何操作":"操作指南包含解决特定问题的步骤"},"views":2949,"like_count":42,"has_summary":false,"last_poster_username":"merefield","category_id":56,"op_like_count":17,"pinned_globally":false,"featured_link":null,"has_accepted_answer":false,"can_vote":false,"posters":[{"extras":null,"description":"原始發帖人","user_id":115923,"primary_group_id":null,"flair_group_id":null},{"extras":null,"description":"頻繁發帖人","user_id":23968,"primary_group_id":47,"flair_group_id":47},{"extras":null,"description":"頻繁發帖人","user_id":125035,"primary_group_id":null,"flair_group_id":null},{"extras":null,"description":"最近發文者","user_id":100484,"primary_group_id":null,"flair_group_id":null},{"extras":"latest","description":"最新發帖人","user_id":27384,"primary_group_id":null,"flair_group_id":null}]},{"fancy_title":"防止意外序列化 ActiveRecord 模型","fancy_title_localized":true,"locale":"en","id":314495,"title":"Preventing accidental serialization of ActiveRecord models","slug":"preventing-accidental-serialization-of-activerecord-models","posts_count":3,"reply_count":1,"highest_post_number":5,"image_url":null,"created_at":"2024-07-01T19:58:28.233Z","last_posted_at":"2024-07-23T17:59:58.860Z","bumped":true,"bumped_at":"2026-08-31T17:34:40.981Z","archetype":"regular","unseen":false,"pinned":false,"unpinned":null,"excerpt":"我们引入了一个补丁，以防止在未指定要序列化的字段的情况下意外序列化 ActiveRecord 模型。此更改确保我们能够控制包含哪些字段，从而避免潜在的 is&hellip;","visible":true,"closed":false,"archived":false,"bookmarked":null,"liked":null,"thumbnails":null,"tags":[{"id":482,"name":"参考","slug":"reference"}],"tags_descriptions":{},"views":547,"like_count":12,"has_summary":false,"last_poster_username":"pfaffman","category_id":56,"op_like_count":6,"pinned_globally":false,"featured_link":null,"has_accepted_answer":false,"can_vote":false,"posters":[{"extras":null,"description":"原始發帖人","user_id":115923,"primary_group_id":null,"flair_group_id":null},{"extras":null,"description":"最近發文者","user_id":13378,"primary_group_id":null,"flair_group_id":142},{"extras":"latest","description":"最新發帖人","user_id":15209,"primary_group_id":null,"flair_group_id":142}]},{"fancy_title":"在 Discourse 中创建路由并显示数据","fancy_title_localized":true,"locale":"en","id":48827,"title":"Creating Routes in Discourse and Showing Data","slug":"creating-routes-in-discourse-and-showing-data","posts_count":1,"reply_count":25,"highest_post_number":1,"image_url":null,"created_at":"2016-08-18T20:18:49.501Z","last_posted_at":"2016-08-18T20:18:49.572Z","bumped":true,"bumped_at":"2026-08-31T17:34:38.704Z","archetype":"regular","unseen":false,"pinned":false,"unpinned":null,"excerpt":"随着时间的推移，Discourse 的复杂性不断增加，对于初学者来说，要理解数据如何从后端的 Ruby on Rails 应用程序一路传递到前端的 Ember.js 应用程序，可能会感到有些 daunting（令人望而生畏）。\n本教程将……","visible":true,"closed":false,"archived":false,"bookmarked":null,"liked":null,"thumbnails":null,"tags":[{"id":484,"name":"教程","slug":"tutorial"},{"id":70,"name":"余烬","slug":"ember"}],"tags_descriptions":{"教程":""},"views":11921,"like_count":46,"has_summary":false,"last_poster_username":"Discourse","category_id":56,"op_like_count":46,"pinned_globally":false,"featured_link":null,"has_accepted_answer":false,"can_vote":false,"posters":[{"extras":"latest","description":"原始發帖人、最新發帖人","user_id":115923,"primary_group_id":null,"flair_group_id":null},{"extras":null,"description":"最近發文者","user_id":100484,"primary_group_id":null,"flair_group_id":null}]}]}}