diff --git a/npm/ng-packs/packages/theme-basic/src/lib/components/nav-items/languages.component.ts b/npm/ng-packs/packages/theme-basic/src/lib/components/nav-items/languages.component.ts
new file mode 100644
index 0000000000..115e9e563e
--- /dev/null
+++ b/npm/ng-packs/packages/theme-basic/src/lib/components/nav-items/languages.component.ts
@@ -0,0 +1,88 @@
+import { Component, OnInit, Input } from '@angular/core';
+import { Store, Select } from '@ngxs/store';
+import { SetLanguage, ConfigState, ApplicationConfiguration, SessionState } from '@abp/ng.core';
+import { Observable } from 'rxjs';
+import { map } from 'rxjs/operators';
+import snq from 'snq';
+
+@Component({
+ selector: 'abp-languages',
+ // tslint:disable-next-line: component-max-inline-declarations
+ template: `
+
0"
+ class="dropdown"
+ ngbDropdown
+ #languageDropdown="ngbDropdown"
+ display="static"
+ >
+
+
+
+ `,
+})
+export class LanguagesComponent implements OnInit {
+ get smallScreen(): boolean {
+ return window.innerWidth < 992;
+ }
+
+ @Select(ConfigState.getDeep('localization.languages'))
+ languages$: Observable;
+
+ get defaultLanguage$(): Observable {
+ return this.languages$.pipe(
+ map(
+ languages =>
+ snq(
+ () => languages.find(lang => lang.cultureName === this.selectedLangCulture).displayName,
+ ),
+ '',
+ ),
+ );
+ }
+
+ get dropdownLanguages$(): Observable {
+ return this.languages$.pipe(
+ map(
+ languages =>
+ snq(() => languages.filter(lang => lang.cultureName !== this.selectedLangCulture)),
+ [],
+ ),
+ );
+ }
+
+ get selectedLangCulture(): string {
+ return this.store.selectSnapshot(SessionState.getLanguage);
+ }
+
+ constructor(private store: Store) {}
+
+ ngOnInit() {}
+
+ onChangeLang(cultureName: string) {
+ this.store.dispatch(new SetLanguage(cultureName));
+ }
+}