Skip to content

Added i18n multilingual support#614

Open
Kunlun-Hub wants to merge 45 commits intonetbirdio:mainfrom
Kunlun-Hub:main
Open

Added i18n multilingual support#614
Kunlun-Hub wants to merge 45 commits intonetbirdio:mainfrom
Kunlun-Hub:main

Conversation

@Kunlun-Hub
Copy link
Copy Markdown

Description

I have added internationalization (i18n) multilingual support functionality based on the original codebase.

Changes

  • ✅ Integrated multilingual internationalization framework
  • ✅ Supported languages: [List the languages you support]
  • ✅ Language files location: [Specify the file location]
  • ✅ Users can switch languages through [Describe the switching method]
    Added i18n multilingual support, and has completed the translation of most Chinese languages.

@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented Apr 15, 2026

Important

Review skipped

Too many files!

This PR contains 295 files, which is 145 over the limit of 150.

⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 683fdfb5-eb5f-40e1-a3d2-00d764bcf336

📥 Commits

Reviewing files that changed from the base of the PR and between b53802a and 4cebefb.

⛔ Files ignored due to path filters (5)
  • package-lock.json is excluded by !**/package-lock.json
  • src/app/apple-icon.png is excluded by !**/*.png
  • src/app/favicon.ico is excluded by !**/*.ico
  • src/assets/netbird-full.svg is excluded by !**/*.svg
  • src/assets/netbird.svg is excluded by !**/*.svg
📒 Files selected for processing (295)
  • .github/workflows/build_and_push.yml
  • .gitignore
  • README.md
  • docker/Dockerfile
  • package.json
  • public/OidcServiceWorker.js
  • public/OidcTrustedDomains.js
  • public/install.sh
  • src/app/(dashboard)/access-control/page.tsx
  • src/app/(dashboard)/control-center/page.tsx
  • src/app/(dashboard)/dns/nameservers/page.tsx
  • src/app/(dashboard)/dns/settings/page.tsx
  • src/app/(dashboard)/dns/zones/page.tsx
  • src/app/(dashboard)/events/audit/page.tsx
  • src/app/(dashboard)/events/dns/page.tsx
  • src/app/(dashboard)/events/network/page.tsx
  • src/app/(dashboard)/events/proxy/page.tsx
  • src/app/(dashboard)/group/page.tsx
  • src/app/(dashboard)/groups/page.tsx
  • src/app/(dashboard)/network-routes/page.tsx
  • src/app/(dashboard)/network/page.tsx
  • src/app/(dashboard)/networks/page.tsx
  • src/app/(dashboard)/overview/page.tsx
  • src/app/(dashboard)/peer/page.tsx
  • src/app/(dashboard)/peers/page.tsx
  • src/app/(dashboard)/posture-checks/page.tsx
  • src/app/(dashboard)/reverse-proxy/custom-domains/page.tsx
  • src/app/(dashboard)/reverse-proxy/services/page.tsx
  • src/app/(dashboard)/settings/page.tsx
  • src/app/(dashboard)/setup-keys/page.tsx
  • src/app/(dashboard)/team/service-users/page.tsx
  • src/app/(dashboard)/team/user/page.tsx
  • src/app/(dashboard)/team/users/page.tsx
  • src/app/(remote-access)/peer/rdp/page.tsx
  • src/app/(remote-access)/peer/ssh/page.tsx
  • src/app/error/page.tsx
  • src/app/invite/page.tsx
  • src/assets/icons/IdentityProviderIcons.tsx
  • src/auth/OIDCError.tsx
  • src/auth/SessionLost.tsx
  • src/components/Badge.tsx
  • src/components/Card.tsx
  • src/components/DatePickerWithRange.tsx
  • src/components/DeviceCard.tsx
  • src/components/Dialog.tsx
  • src/components/DropdownInput.tsx
  • src/components/FancyToggleSwitch.tsx
  • src/components/Input.tsx
  • src/components/JSONFileUpload.tsx
  • src/components/NetworkRouteSelector.tsx
  • src/components/NoPeersGettingStarted.tsx
  • src/components/Notification.tsx
  • src/components/PeerGroupSelector.tsx
  • src/components/PeerSelector.tsx
  • src/components/PortSelector.tsx
  • src/components/SettingCard.tsx
  • src/components/UserSelector.tsx
  • src/components/VersionInfo.tsx
  • src/components/modal/Modal.tsx
  • src/components/select/SelectDropdown.tsx
  • src/components/select/SelectDropdownSearchInput.tsx
  • src/components/table/DataTable.tsx
  • src/components/table/DataTableFilter.tsx
  • src/components/table/DataTableGlobalSearch.tsx
  • src/components/table/DataTableMultiSelectPopup.tsx
  • src/components/table/DataTablePagination.tsx
  • src/components/table/DataTableRefreshButton.tsx
  • src/components/table/DataTableRowsPerPage.tsx
  • src/components/ui/AccessControlGroupCount.tsx
  • src/components/ui/AddGroupButton.tsx
  • src/components/ui/AddPeerButton.tsx
  • src/components/ui/AnnouncementBanner.tsx
  • src/components/ui/CitySelector.tsx
  • src/components/ui/CountrySelector.tsx
  • src/components/ui/DarkModeToggle.tsx
  • src/components/ui/HelpAndSupportButton.tsx
  • src/components/ui/InputDomain.tsx
  • src/components/ui/InstallNetBirdButton.tsx
  • src/components/ui/MultipleGroups.tsx
  • src/components/ui/NoResults.tsx
  • src/components/ui/NoResultsCard.tsx
  • src/components/ui/PageNotFound.tsx
  • src/components/ui/PeerCountBadge.tsx
  • src/components/ui/RestrictedAccess.tsx
  • src/components/ui/UserDropdown.tsx
  • src/contexts/AnalyticsProvider.tsx
  • src/contexts/ApplicationProvider.tsx
  • src/contexts/DialogProvider.tsx
  • src/contexts/GroupProvider.tsx
  • src/contexts/PoliciesProvider.tsx
  • src/contexts/ReverseProxiesProvider.tsx
  • src/hooks/useCopyToClipboard.ts
  • src/hooks/useUrlTab.ts
  • src/i18n/I18nProvider.tsx
  • src/i18n/messages.ts
  • src/interfaces/Account.ts
  • src/interfaces/IdentityProvider.ts
  • src/interfaces/NetworkLog.ts
  • src/layouts/AppLayout.tsx
  • src/layouts/DashboardLayout.tsx
  • src/layouts/Header.tsx
  • src/layouts/Navigation.tsx
  • src/modules/access-control/AccessControlModal.tsx
  • src/modules/access-control/ssh/SSHAccessType.tsx
  • src/modules/access-control/ssh/SSHAuthorizedGroups.tsx
  • src/modules/access-control/ssh/SSHUsernameSelector.tsx
  • src/modules/access-control/table/AccessControlActionCell.tsx
  • src/modules/access-control/table/AccessControlActiveCell.tsx
  • src/modules/access-control/table/AccessControlDestinationsCell.tsx
  • src/modules/access-control/table/AccessControlDirectionCell.tsx
  • src/modules/access-control/table/AccessControlPortsCell.tsx
  • src/modules/access-control/table/AccessControlPostureCheckCell.tsx
  • src/modules/access-control/table/AccessControlProtocolCell.tsx
  • src/modules/access-control/table/AccessControlRuleEndpointCell.tsx
  • src/modules/access-control/table/AccessControlSourcesCell.tsx
  • src/modules/access-control/table/AccessControlTable.tsx
  • src/modules/access-control/useAccessControl.helpers.test.ts
  • src/modules/access-control/useAccessControl.helpers.ts
  • src/modules/access-control/useAccessControl.ts
  • src/modules/access-tokens/AccessTokenActionCell.tsx
  • src/modules/access-tokens/AccessTokensTable.tsx
  • src/modules/access-tokens/CreateAccessTokenModal.tsx
  • src/modules/activity/ActivityDescription.tsx
  • src/modules/activity/ActivityEntryRow.tsx
  • src/modules/activity/ActivityEventCodeSelector.tsx
  • src/modules/activity/ActivityTable.tsx
  • src/modules/activity/ActivityTypeIcon.tsx
  • src/modules/activity/DNSLogsTable.tsx
  • src/modules/activity/NetworkLogsTable.tsx
  • src/modules/activity/UsersDropdownSelector.tsx
  • src/modules/common-table-rows/GroupsRow.tsx
  • src/modules/common-table-rows/LastTimeRow.tsx
  • src/modules/control-center/nodes/SelectGroupNode.tsx
  • src/modules/control-center/nodes/SelectUserNode.tsx
  • src/modules/dns/nameservers/NameserverModal.tsx
  • src/modules/dns/nameservers/NameserverTemplateModal.tsx
  • src/modules/dns/nameservers/table/NameserverActionCell.tsx
  • src/modules/dns/nameservers/table/NameserverGroupTable.tsx
  • src/modules/dns/zones/DNSRecordModal.tsx
  • src/modules/dns/zones/DNSZoneModal.tsx
  • src/modules/dns/zones/DNSZonesProvider.tsx
  • src/modules/dns/zones/records/DNSRecordActionCell.tsx
  • src/modules/dns/zones/records/DNSRecordTimeToLiveCell.tsx
  • src/modules/dns/zones/records/DNSRecordsTable.tsx
  • src/modules/dns/zones/table/DNSZonesActionCell.tsx
  • src/modules/dns/zones/table/DNSZonesGroupCell.tsx
  • src/modules/dns/zones/table/DNSZonesRecordsCell.tsx
  • src/modules/dns/zones/table/DNSZonesTable.tsx
  • src/modules/exit-node/AddExitNodeButton.tsx
  • src/modules/exit-node/ExitNodeDropdownButton.tsx
  • src/modules/exit-node/ExitNodeHelpTooltip.tsx
  • src/modules/groups/AssignPeerToGroupModal.tsx
  • src/modules/groups/AssignUserToGroupModal.tsx
  • src/modules/groups/EditGroupNameModal.tsx
  • src/modules/groups/GroupFilterSelector.tsx
  • src/modules/groups/SingleGroupSelector.tsx
  • src/modules/groups/details/GroupPeersSection.tsx
  • src/modules/groups/details/GroupResourcesSection.tsx
  • src/modules/groups/details/GroupUsersSection.tsx
  • src/modules/groups/table/GroupsActionCell.tsx
  • src/modules/groups/table/GroupsTable.tsx
  • src/modules/instance-setup/InstanceSetupWizard.tsx
  • src/modules/jobs/CreateDebugJobModal.tsx
  • src/modules/jobs/table/JobOutputCell.tsx
  • src/modules/jobs/table/JobParametersCell.tsx
  • src/modules/jobs/table/JobStatusCell.tsx
  • src/modules/jobs/table/JobTypeCell.tsx
  • src/modules/jobs/table/PeerRemoteJobsTable.tsx
  • src/modules/networks/NetworkModal.tsx
  • src/modules/networks/NetworkProvider.tsx
  • src/modules/networks/PolicyCell.tsx
  • src/modules/networks/misc/NetworkNavigation.tsx
  • src/modules/networks/resources/NetworkResourceAccessControl.tsx
  • src/modules/networks/resources/NetworkResourceModal.tsx
  • src/modules/networks/resources/ResourceActionCell.tsx
  • src/modules/networks/resources/ResourceEnabledCell.tsx
  • src/modules/networks/resources/ResourceGroupCell.tsx
  • src/modules/networks/resources/ResourceGroupModal.tsx
  • src/modules/networks/resources/ResourcePolicyCell.tsx
  • src/modules/networks/resources/ResourceSingleAddressInput.tsx
  • src/modules/networks/resources/ResourcesTabContent.tsx
  • src/modules/networks/resources/ResourcesTable.tsx
  • src/modules/networks/routing-peers/NetworkRoutingPeerModal.tsx
  • src/modules/networks/routing-peers/NetworkRoutingPeersTabContent.tsx
  • src/modules/networks/routing-peers/NetworkRoutingPeersTable.tsx
  • src/modules/networks/routing-peers/RoutingPeerMasqueradeSwitch.tsx
  • src/modules/networks/routing-peers/RoutingPeersActionCell.tsx
  • src/modules/networks/routing-peers/RoutingPeersEnabledCell.tsx
  • src/modules/networks/routing-peers/RoutingPeersMasqueradeCell.tsx
  • src/modules/networks/table/NetworkActionCell.tsx
  • src/modules/networks/table/NetworkPolicyCell.tsx
  • src/modules/networks/table/NetworkResourceCell.tsx
  • src/modules/networks/table/NetworkRoutingPeerCell.tsx
  • src/modules/networks/table/NetworksTable.tsx
  • src/modules/onboarding/Onboarding.tsx
  • src/modules/onboarding/OnboardingDevices.tsx
  • src/modules/onboarding/OnboardingEnd.tsx
  • src/modules/onboarding/OnboardingIntent.tsx
  • src/modules/onboarding/OnboardingSurvey.tsx
  • src/modules/onboarding/networks/OnboardingAddResource.tsx
  • src/modules/onboarding/networks/OnboardingAddRoutingPeer.tsx
  • src/modules/onboarding/networks/OnboardingAddUserDevice.tsx
  • src/modules/onboarding/networks/OnboardingTestResource.tsx
  • src/modules/onboarding/p2p/OnboardingFirstDevice.tsx
  • src/modules/onboarding/p2p/OnboardingSecondDevice.tsx
  • src/modules/overview/DeviceDistributionMap.tsx
  • src/modules/overview/DeviceTypeDistribution.tsx
  • src/modules/overview/RelayTrafficStats.tsx
  • src/modules/overview/world-countries.json
  • src/modules/peer/AccessiblePeersSection.tsx
  • src/modules/peer/AddRouteDropdownButton.tsx
  • src/modules/peer/EphemeralPeerIndicator.tsx
  • src/modules/peer/ExpirationDisabledIndicator.tsx
  • src/modules/peer/LoginRequiredIndicator.tsx
  • src/modules/peer/MinimalPeersTable.tsx
  • src/modules/peer/PeerExpirationSettings.tsx
  • src/modules/peer/PeerExpirationToggle.tsx
  • src/modules/peer/PeerNetworkRoutesSection.tsx
  • src/modules/peer/PeerRemoteJobsSection.tsx
  • src/modules/peer/PeerRouteActionCell.tsx
  • src/modules/peer/PeerRouteActiveCell.tsx
  • src/modules/peer/PeerRouteTypeCell.tsx
  • src/modules/peer/PeerRoutesTable.tsx
  • src/modules/peer/PeerSSHInstructions.tsx
  • src/modules/peer/PeerSSHPolicyInfo.tsx
  • src/modules/peer/PeerSSHPolicyModal.tsx
  • src/modules/peer/PeerSSHToggle.tsx
  • src/modules/peer/RemoteJobDropdownButton.tsx
  • src/modules/peers/PeerActionCell.tsx
  • src/modules/peers/PeerAddressCell.tsx
  • src/modules/peers/PeerAddressTooltipContent.tsx
  • src/modules/peers/PeerConnectButton.tsx
  • src/modules/peers/PeerGroupCell.tsx
  • src/modules/peers/PeerLastSeenCell.tsx
  • src/modules/peers/PeerMultiSelect.tsx
  • src/modules/peers/PeerNameCell.tsx
  • src/modules/peers/PeerOSCell.tsx
  • src/modules/peers/PeerStatusCell.tsx
  • src/modules/peers/PeerVersionCell.tsx
  • src/modules/peers/PeersTable.tsx
  • src/modules/posture-checks/checks/PostureCheckGeoLocation.tsx
  • src/modules/posture-checks/checks/PostureCheckNetBirdVersion.tsx
  • src/modules/posture-checks/checks/PostureCheckOperatingSystem.tsx
  • src/modules/posture-checks/checks/PostureCheckPeerNetworkRange.tsx
  • src/modules/posture-checks/checks/PostureCheckProcess.tsx
  • src/modules/posture-checks/checks/tooltips/GeoLocationTooltip.tsx
  • src/modules/posture-checks/checks/tooltips/NetBirdVersionTooltip.tsx
  • src/modules/posture-checks/checks/tooltips/OperatingSystemTooltip.tsx
  • src/modules/posture-checks/checks/tooltips/PeerNetworkRangeTooltip.tsx
  • src/modules/posture-checks/checks/tooltips/ProcessTooltip.tsx
  • src/modules/posture-checks/modal/PostureCheckModal.tsx
  • src/modules/posture-checks/table/PostureCheckBrowseTable.tsx
  • src/modules/posture-checks/table/PostureCheckMinimalTable.tsx
  • src/modules/posture-checks/table/PostureCheckTable.tsx
  • src/modules/posture-checks/table/cells/PostureCheckActionCell.tsx
  • src/modules/posture-checks/table/cells/PostureCheckPolicyUsageCell.tsx
  • src/modules/posture-checks/ui/PostureCheckCard.tsx
  • src/modules/posture-checks/ui/PostureCheckNoChecksInfo.tsx
  • src/modules/posture-checks/ui/PostureCheckOperatingSystemInfo.tsx
  • src/modules/posture-checks/ui/PostureCheckTabTrigger.tsx
  • src/modules/remote-access/rdp/RDPButton.tsx
  • src/modules/remote-access/rdp/RDPCertificateModal.tsx
  • src/modules/remote-access/rdp/RDPCredentialsModal.tsx
  • src/modules/remote-access/rdp/RDPTooltip.tsx
  • src/modules/remote-access/rdp/rdp-certificate-handler.ts
  • src/modules/remote-access/rdp/useRemoteDesktop.ts
  • src/modules/remote-access/ssh/SSHButton.tsx
  • src/modules/remote-access/ssh/SSHCredentialsModal.tsx
  • src/modules/remote-access/ssh/SSHTooltip.tsx
  • src/modules/remote-access/ssh/useSSH.ts
  • src/modules/remote-access/useNetBirdClient.ts
  • src/modules/reverse-proxy/ReverseProxyAccessControlRules.tsx
  • src/modules/reverse-proxy/ReverseProxyHTTPTargets.tsx
  • src/modules/reverse-proxy/ReverseProxyLayer4Content.tsx
  • src/modules/reverse-proxy/ReverseProxyModal.tsx
  • src/modules/reverse-proxy/ReverseProxyServiceModeSelector.tsx
  • src/modules/reverse-proxy/auth/AuthHeaderModal.tsx
  • src/modules/reverse-proxy/auth/AuthPasswordModal.tsx
  • src/modules/reverse-proxy/auth/AuthPinModal.tsx
  • src/modules/reverse-proxy/auth/AuthSSOModal.tsx
  • src/modules/reverse-proxy/domain/CustomDomainModal.tsx
  • src/modules/reverse-proxy/domain/CustomDomainSelector.tsx
  • src/modules/reverse-proxy/domain/CustomDomainVerificationModal.tsx
  • src/modules/reverse-proxy/domain/CustomDomainsTable.tsx
  • src/modules/reverse-proxy/domain/ReverseProxyDomainInput.tsx
  • src/modules/reverse-proxy/events/ReverseProxyEventsAuthMethodCell.tsx
  • src/modules/reverse-proxy/events/ReverseProxyEventsTable.tsx
  • src/modules/reverse-proxy/table/ReverseProxyActionCell.tsx
  • src/modules/reverse-proxy/table/ReverseProxyActiveCell.tsx
  • src/modules/reverse-proxy/table/ReverseProxyAuthCell.tsx
  • src/modules/reverse-proxy/table/ReverseProxyClusterCell.tsx
  • src/modules/reverse-proxy/table/ReverseProxyNameCell.tsx
  • src/modules/reverse-proxy/table/ReverseProxyStatusCell.tsx
  • src/modules/reverse-proxy/table/ReverseProxyTable.tsx
  • src/modules/reverse-proxy/table/ReverseProxyTargetsCell.tsx

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Tip

💬 Introducing Slack Agent: The best way for teams to turn conversations into code.

Slack Agent is built on CodeRabbit's deep understanding of your code, so your team can collaborate across the entire SDLC without losing context.

  • Generate code and open pull requests
  • Plan features and break down work
  • Investigate incidents and troubleshoot customer tickets together
  • Automate recurring tasks and respond to alerts with triggers
  • Summarize progress and report instantly

Built for teams:

  • Shared memory across your entire org—no repeating context
  • Per-thread sandboxes to safely plan and execute work
  • Governance built-in—scoped access, auditability, and budget controls

One agent for your entire SDLC. Right inside Slack.

👉 Get started


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@CLAassistant
Copy link
Copy Markdown

CLAassistant commented Apr 15, 2026

CLA assistant check
All committers have signed the CLA.

@Kunlun-Hub Kunlun-Hub mentioned this pull request Apr 15, 2026
Copy link
Copy Markdown
Author

@Kunlun-Hub Kunlun-Hub left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yes

- 重构 useAccessControl hook 支持多规则管理
- 新增 RuleEditor 组件,支持规则展开/折叠
- 添加 Action 选择器(accept/drop)
- 支持添加/删除规则
- 支持规则独立启用/禁用
- 添加规则名称和描述字段
- 更新 UI 设计,更直观易用
- 修复第 115 行的语法错误:缺少右括号
- 确保可以正常构建
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants