Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(#9547): require password reset on first time login and admin password update #9731

Open
wants to merge 26 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
e325def
chore: add translations
Benmuiruri Jan 7, 2025
4c35d8e
chore: implement password reset
Benmuiruri Jan 7, 2025
3e91107
chore: validate empty input submission
Benmuiruri Jan 7, 2025
d397d8c
chore: update integration tests
Benmuiruri Jan 7, 2025
cb5c9b2
chore: keep existing tests without password reset
Benmuiruri Jan 8, 2025
3075f3e
chore: sonar
Benmuiruri Jan 8, 2025
c033cb9
chore: add password reset e2e
Benmuiruri Jan 9, 2025
7c4931f
chore: refactor login::updatePassword
Benmuiruri Jan 9, 2025
45cfb56
chore: eslint
Benmuiruri Jan 9, 2025
af2ed74
chore: arabic translations
Benmuiruri Jan 9, 2025
1636d96
chore: update login test
Benmuiruri Jan 9, 2025
3fd4aa3
Merge master and update e2e
Benmuiruri Jan 10, 2025
5cbe88b
chore: unused var
Benmuiruri Jan 10, 2025
0ff2a27
Merge branch 'master' of github.com:medic/cht-core into 9547-password…
Benmuiruri Jan 10, 2025
bb1cc7a
chore: use status not StatusCode
Benmuiruri Jan 10, 2025
562db3c
chore: refactor
Benmuiruri Jan 10, 2025
58c7403
chore: clean up
Benmuiruri Jan 10, 2025
0950ed8
chore: feedback
Benmuiruri Jan 15, 2025
931b83d
chore: show reset password help
Benmuiruri Jan 15, 2025
9491a68
chore: refactor and update tests
Benmuiruri Jan 15, 2025
688b0c1
chore: add translations
Benmuiruri Jan 15, 2025
1a155fa
chore: update test
Benmuiruri Jan 15, 2025
f732820
Merge branch 'master' of github.com:medic/cht-core into 9547-password…
Benmuiruri Jan 15, 2025
6d33a7c
chore: revert token check
Benmuiruri Jan 15, 2025
33ba848
chore: clean up
Benmuiruri Jan 15, 2025
61f9a0d
chore: clean up
Benmuiruri Jan 16, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 7 additions & 1 deletion admin/src/js/controllers/edit-user.js
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,12 @@ angular
});
};

const validateSkipPasswordPermission = () => {
Benmuiruri marked this conversation as resolved.
Show resolved Hide resolved
$scope.skipPasswordChange = chtDatasource.v1.hasPermissions(
['can_skip_password_change'], $scope.editUserModel.roles, $scope.permissions
);
};

const formatDate = (settings, date) => {
const format = settings.reported_date_format || 'DD-MMM-YYYY HH:mm:ss';
return moment(date).format(format);
Expand Down Expand Up @@ -151,6 +157,7 @@ angular
this.setupPromise = determineEditUserModel()
.then(model => {
$scope.editUserModel = model;
validateSkipPasswordPermission();
})
.catch(err => {
$log.error('Error determining user model', err);
Expand Down Expand Up @@ -298,7 +305,6 @@ angular
return userHasPermission;
};


const isOnlineUser = (roles) => {
if (!$scope.roles) {
return true;
Expand Down
1 change: 1 addition & 0 deletions admin/src/templates/edit_user.html
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,7 @@
class="form-group"
ng-class="{ 'has-error': errors.password, 'required': !editUserModel.id, 'hidden': allowTokenLogin && (editUserModel.token_login || (editUserModel.token_login !== false && editUserModel.tokenLoginEnabled)) }">
<label for="edit-password" translate>Password</label>
<div class="text-muted" ng-if="!skipPasswordChange" translate>update.password.help</div>
<div class="password-input-group">
<input
id="edit-password"
Expand Down
34 changes: 34 additions & 0 deletions admin/tests/unit/controllers/edit-user.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ describe('EditUserCtrl controller', () => {
},
permissions: {
can_have_multiple_places: ['community-health-assistant'],
can_skip_password_change: ['community-health-assistant'],
},
});
http = { get: sinon.stub() };
Expand Down Expand Up @@ -864,4 +865,37 @@ describe('EditUserCtrl controller', () => {
});
});
});

describe('skipPasswordChange', () => {
let user;

beforeEach(() => {
user = {
_id: 'user.id',
name: 'user.name',
fullname: 'user.fullname',
email: '[email protected]',
phone: 'user.phone',
facility_id: 'abc',
contact_id: 'xyz',
language: 'zz',
};
});

it('should set skipPasswordChange to false if user does not have can_skip_password_change permission', () => {
user.roles = ['supervisor'];

return mockEditAUser(user).setupPromise.then(() => {
chai.expect(scope.skipPasswordChange).to.equal(false);
});
});

it('should set skipPasswordChange to true if user has can_skip_password_change permission', () => {
user.roles = ['community-health-assistant'];

return mockEditAUser(user).setupPromise.then(() => {
chai.expect(scope.skipPasswordChange).to.equal(true);
});
});
});
});
8 changes: 8 additions & 0 deletions api/resources/translations/messages-ar.properties
Original file line number Diff line number Diff line change
Expand Up @@ -400,6 +400,11 @@ bulkdelete.confirm.title = �� 堛堭�堹 堶堸� 塈�堻堿��
bulkdelete.confirm.title.plural = �� 堛堭�堹 堶堸� 塈�堻堿�塈堛 塈��堶堹�堹堜�
call = 塈堛媯塈�
case_id = �媢堭�� 塈�堶塈�堜
change.password.confirm.password = 堛堧��堹 ���堜 塈��堭�堭
change.password.hint = �塈�堧堭�塈� �塈�堧堶堭� 塈�堮塈媯堜.塈堻堛堮堹� 塈�堧堶堭� 塈��堥�堭堜
change.password.new.password = ���堜 塈��堭�堭 塈�堿堹�堹堜
change.password.submit = 堛媞��堭 ���堜 塈��堭�堭
change.password.title = 堛媞��堭 ���堜 塈��堭�堭
child_birth_date = 堛塈堭�堮 ���塈堹 塈�媟��
child_birth_outcome = 堶媯��堜 ���塈堹 塈�媟��
child_birth_weight = �堬� 塈�媟�� 媢�堹 塈���塈堹堜
Expand Down Expand Up @@ -965,8 +970,11 @@ partner.logo.upload = 堛堶��� 奡媢塈堭 塈�奡堭��
partner.name.field = 塈堻� 塈�奡堭��
partner.supporting = 塈�奡堭�塈堙 塈�堹塈媢���
partner.tab.partners = 塈�奡堭�塈堙
password.current.incorrect = ���堜 塈��堭�堭 塈�堶塈��堜 媞�堭 媯堶�堶堜
password.incorrect = ���堜 塈��堭�堭 媞�堭 媯堶�堶堜.
password.length.minimum = �堿堥 堧� 堛��� ���堜 塈��堭�堭 �堣��堜 媢�� 塈�堧�� �� {{minimum}} 堶堭�塈�.
password.must.match =�堛堧��堹 ���堜 塈��堭�堭 �堿堥 堧� 堛堛媟塈堥� ���堜 塈��堭�堭
password.same = 塈�堶塈��堜 堛��� �堮堛��堜 媢� ���堜 塈��堭�堭 ���堜 塈��堭�堭 塈�堿堹�堹堜 �堿堥 堧�
password.update = 堛堶堹�堳 ���堜 塈��堭�堭
password.weak = ���堜 塈��堭�堭 堻��堜 堿堹塈� ��堛� 堛堮����塈. �堭堿� 堛媔��� �堿��媢堜 �堛��媢堜 �� 塈�堶堭�� �堿媢��塈 堧�堳堭 堛媢��堹塈�.
patient\ id\ not\ found\ response = ��堭堿� 堨堭堻塈� 塈�堭堻塈�堜 塈�堛塈��堜 堨堸塈 塈堿堛塈堬堛 堿��媢 媢���塈堛 塈�堛堶�� ���� �� �堛� 塈�媢堳�堭 媢�� �媢堭�� 塈��堭�媔�(�堜).
Expand Down
13 changes: 11 additions & 2 deletions api/resources/translations/messages-en.properties
Original file line number Diff line number Diff line change
Expand Up @@ -400,6 +400,11 @@ bulkdelete.confirm.title = Delete record?
bulkdelete.confirm.title.plural = Delete selected records?
call = Call
case_id = Case ID
change.password.confirm.password = Confirm password
change.password.hint = Use uppercase letters, numbers, and special characters.
change.password.new.password = New password
change.password.submit = Change password
change.password.title = Change your password
child_birth_date = Child birth date
child_birth_outcome = Child birth outcome
child_birth_weight = Child birth weight
Expand Down Expand Up @@ -654,8 +659,8 @@ enketo.geopicker.altitude = altitude (m)
enketo.geopicker.closepolygon = close polygon
enketo.geopicker.kmlcoords = KML coordinates
enketo.geopicker.kmlpaste = paste KML coordinates here
enketo.geopicker.latitude = latitude (x.y )
enketo.geopicker.longitude = longitude (x.y )
enketo.geopicker.latitude = latitude (x.y )
enketo.geopicker.longitude = longitude (x.y )
enketo.geopicker.points = points
enketo.geopicker.searchPlaceholder = search for place or address
enketo.geopicker.removePoint = This will completely remove the current geopoint from the list of geopoints and cannot be undone. Are you sure you want to do this?
Expand Down Expand Up @@ -964,8 +969,11 @@ partner.logo.upload = Upload partner logo
partner.name.field = Partner name
partner.supporting = Supporting partners
partner.tab.partners = Partners
password.current.incorrect = Current password is not correct
password.incorrect = Password is not correct.
password.length.minimum = The password must be at least {{minimum}} characters long.
password.must.match = Password and confirm password must match
password.same = New password must be different from current password
password.update = Update password
password.weak = The password is too easy to guess. Include a range of characters to make it more complex.
patient\ id\ not\ found\ response = Send the following response message if the validations pass but the Medic ID is not located.
Expand Down Expand Up @@ -1272,6 +1280,7 @@ translation.add = Add new translation key
translation.key = Translation key
unique.id = Unique ID
unknown.contact = Unknown contact
update.password.help = User will be required to reset their password on their next login
Benmuiruri marked this conversation as resolved.
Show resolved Hide resolved
upgrade = Upgrade
upgrade.description = To upgrade your application to a specific release, beta, or branch, it is recommended that you stage first. This allows for background work to be done to prepare the installation without interrupting users. Once staging is complete, click Install to proceed with the upgrade. This action cannot be undone, so please make sure your data has been backed up and your users are notified of downtime.
upload = Upload
Expand Down
9 changes: 9 additions & 0 deletions api/resources/translations/messages-es.properties
Original file line number Diff line number Diff line change
Expand Up @@ -400,6 +400,11 @@ bulkdelete.confirm.title = 聶Eliminar el registro?
bulkdelete.confirm.title.plural = 聶Eliminar registros seleccionados?
call = Llamar
case_id = Identificaci籀n del caso
change.password.confirm.password = Confirmar contrase簽a
change.password.hint = Utilice letras may繳sculas, n繳meros y caracteres especiales.
change.password.new.password = Nueva contrase簽a
change.password.submit = Cambiar la contrase簽a
change.password.title = Cambiar contrase簽a
child_birth_date = Fecha de nacimiento del ni簽o
child_birth_outcome = Resultado del nacimiento del ni簽o
child_birth_weight = Peso del ni簽o al nacer
Expand Down Expand Up @@ -964,8 +969,11 @@ partner.logo.upload = Subir logo del socio
partner.name.field = Nombre del socio
partner.supporting = Socios que est獺 apoyando
partner.tab.partners = Socios
password.current.incorrect = La contrase簽a actual no es correcta
password.incorrect = La contrase簽a no es correcta.
password.length.minimum = La contrase簽a debe tener al menos {{minimum}} caracteres.
password.must.match = Las contrase簽as y la contrase簽a de confirmaci籀n deben coincidir
password.same = La nueva contrase簽a debe ser diferente de la contrase簽a actual
password.update = Actualizar contrase簽a
password.weak = La contrase簽a es demasiado f獺cil de adivinar. Incluya m獺s variedad de caracteres para hacerlo m獺s complejo.
patient\ id\ not\ found\ response = Enviar el siguiente mensaje de respuesta, s穩 las validaciones pasan correctamente pero no se encontr籀 el Medic ID.
Expand Down Expand Up @@ -1272,6 +1280,7 @@ translation.add = Agregar Traducci籀n
translation.key = Clave de traducci籀n
unique.id = Identificaci籀n 繳nica
unknown.contact = Contacto desconocido
update.password.help = El usuario deber獺 restablecer su contrase簽a en su pr籀ximo inicio de sesi籀n
upgrade = Actualizar
upgrade.description = Para actualizar su aplicaci籀n a una versi籀n, beta o rama espec穩fica, se recomienda realizar primero un respaldo. Esto permite realizar un trabajo en segundo plano para preparar la instalaci籀n sin interrumpir a los usuarios. Una vez que se complete el respaldo, haga click en Instalar para continuar con la actualizaci籀n. Esta acci籀n no se puede deshacer, as穩 que aseg繳rese de que se haya respaldado sus datos y de que se hayan notificado a sus usuarios sobre un posible tiempo de inactividad en el sistema.
upload = Subir
Expand Down
9 changes: 9 additions & 0 deletions api/resources/translations/messages-fr.properties
Original file line number Diff line number Diff line change
Expand Up @@ -400,6 +400,11 @@ bulkdelete.confirm.title = Supprimer l'enregistrement?
bulkdelete.confirm.title.plural = Supprimer les enregistrements s矇lectionn矇s?
call = Appeler
case_id = ID du cas
change.password.confirm.password = Confirmer le mot de passe
change.password.hint = Utilisez une combinaison de lettres majuscules, de chiffres et de caract癡res sp矇ciaux.
change.password.new.password = Nouveau mot de passe
change.password.submit = Changer le mot de passe
change.password.title = Changez votre mot de passe
child_birth_date = Date de naissance de l'enfant
child_birth_outcome = R矇sultat de la naissance de l'enfant
child_birth_weight = Poids de l'enfant � la naissance
Expand Down Expand Up @@ -964,8 +969,11 @@ partner.logo.upload = T矇l矇charger le logo du partenaire
partner.name.field = Nom du partenaire
partner.supporting = Partenaires de soutien
partner.tab.partners = Partenaires
password.current.incorrect = Le mot de passe actuel n'est pas correct
password.incorrect = Mot de passe incorrect
password.length.minimum = Le mot de passe doit 礙tre au moins {{minimum}} caract癡res.
password.must.match = Le mot de passe et la confirmation du mot de passe doivent correspondre
password.same = Le nouveau mot de passe doit 礙tre diff矇rent du mot de passe actuel
password.update = Mettre � jour mot de passe
password.weak = Le mot de passe est trop facile � deviner. Inclure au moins une lettre majuscule, un chiffre et un caract癡re sp矇cial.
patient\ id\ not\ found\ response = Envoyer cette r矇ponse si les validations passent, mais l'ID du patient n'est pas retrouv矇.
Expand Down Expand Up @@ -1272,6 +1280,7 @@ translation.add = Ajouter une traduction
translation.key = Cl矇 de traduction
unique.id = ID unique
unknown.contact = Contact inconnu
update.password.help = L'utilisateur devra r矇initialiser son mot de passe lors de sa prochaine connexion
upgrade = Mise � jour
upgrade.description = Pour mettre � jour votre application vers une version, une version b礙ta ou une branche sp矇cifique, il est recommand矇 d'effectuer d'abord une 矇tape. Cela permet d'effectuer un travail en arri癡re-plan pour pr矇parer l'installation sans interrompre les utilisateurs. Une fois la pr矇paration termin矇e, cliquez sur Installer pour proc矇der � la mise � jour. Cette action ne peut pas 礙tre annul矇e, veuillez donc vous assurer que vos donn矇es ont 矇t矇 sauvegard矇es et que vos utilisateurs sont inform矇s des temps d'arr礙t.
upload = T矇l矇charger
Expand Down
8 changes: 8 additions & 0 deletions api/resources/translations/messages-id.properties
Original file line number Diff line number Diff line change
Expand Up @@ -390,6 +390,11 @@ bulkdelete.confirm.title = Hapus pencatatan?
bulkdelete.confirm.title.plural = Hapus pencatatan yang dipilih?
call = Telepon
case_id = ID Kasus
change.password.confirm.password = Konfirmasikan kata sandi
change.password.hint = Gunakan huruf besar, angka, dan karakter khusus.
change.password.new.password = Kata sandi baru
change.password.submit = Ubah kata sandi
change.password.title = Ubah kata sandi Anda
child_birth_date = Tanggal Lahir Anak
child_birth_outcome = Outcome Anak dilahirkan
child_birth_weight = Berat Lahir Anak
Expand Down Expand Up @@ -884,8 +889,11 @@ partner.logo.upload =
partner.name.field =
partner.supporting =
partner.tab.partners =
password.current.incorrect = Kata sandi saat ini salah
password.incorrect = Kata sandi tidak benar.
password.length.minimum = Kata sandi harus setidaknya {{minimum}} karakter.
password.must.match = Kata sandi dan konfirmasi kata sandi harus cocok
password.same = Kata sandi baru harus berbeda dengan kata sandi saat ini
password.update = Perbaharui Kata Sandi
password.weak = Kata sandinya terlalu mudah. Sertakan setidaknya 1 huruf besar, 1 angka, dan 1 karakter khusus.
patient\ id\ not\ found\ response = Kirim pesan respon ini bila lolos validasi tetapi Medic ID tidak ditemukan
Expand Down
9 changes: 9 additions & 0 deletions api/resources/translations/messages-ne.properties
Original file line number Diff line number Diff line change
Expand Up @@ -400,6 +400,11 @@ bulkdelete.confirm.title = 鄐啤�鄐什鄍丑 鄐桌�鄐冗鄐尹鄍� 鄐嫩�?
bulkdelete.confirm.title.plural = 鄐仁鄐� 鄐什鄐賴�鄐冗 鄐啤�鄐什鄍丑鄐嫩什鄍� 鄐桌�鄐�鄐兒� 鄐嫩�?
call = 鄐仆
case_id = 鄐�鄐� 鄐�鄐﹤�
change.password.confirm.password = 鄐芹冗鄐詮今鄐啤�鄐� 鄐芹�鄐獅�鄐凶 鄐什鄍尹鄍允鄍元鄍�
change.password.hint = 鄐�鄐耜冗 鄐�鄍仄鄐�, 鄐�鄍� 鄐� 鄐凶鄐兒�鄐嫩允鄐啤�鄐� 鄐桌凶鄐嗣�鄐啤不 鄐冢�鄐� 鄐�鄐冗 鄐冢什鄐芹什鄍丹鄍� 鄐芹冗鄐詮今鄐啤�鄐� 鄐詮凶鄐啤�鄐尹鄐� 鄐什鄍尹鄍允鄍元鄍�
change.password.new.password = 鄐兒仁鄐擒� 鄐芹冗鄐詮今鄐啤�鄐�
change.password.submit = 鄐芹冗鄐詮今鄐啤�鄐� 鄐芹什鄐賴今鄐啤�鄐戈尹 鄐什鄍尹鄍允鄍元鄍�
change.password.title = 鄐井鄍尹鄍� 鄐芹冗鄐詮今鄐啤�鄐� 鄐芹什鄐賴今鄐啤�鄐戈尹 鄐什鄍尹鄍允鄍元鄍�
child_birth_date = 鄐眇�鄍�鄐擒�鄍� 鄐尹鄍亢 鄐桌凶鄐戈凶
child_birth_outcome = 鄐眇�鄍�鄐擒�鄍� 鄐尹鄍亢鄐擒今鄐詮�鄐丞冗
child_birth_weight = 鄐眇�鄍�鄐擒�鄍� 鄐尹鄍亢 鄐戈�鄐�
Expand Down Expand Up @@ -964,8 +969,11 @@ partner.logo.upload = 鄐芹冗鄐啤�鄐尹鄐� 鄐耜�鄐� 鄐云鄐耜�鄐� 鄐什
partner.name.field = 鄐芹冗鄐啤�鄐尹鄐啤�鄍� 鄐兒冗鄐�
partner.supporting = 鄐詮允鄐能�鄐� 鄐芹冗鄐啤�鄐尹鄐啤允鄐啤�
partner.tab.partners = 鄐芹冗鄐啤�鄐尹鄐啤允鄐啤�
password.current.incorrect = 鄐菽什鄍中鄐桌冗鄐� 鄐芹冗鄐詮今鄐啤�鄐� 鄐仆鄐� 鄐�
password.incorrect = 鄐芹冗鄐詮今鄐啤�鄐� 鄐桌凶鄐耜�鄐兒奶
password.length.minimum = 鄐芹冗鄐詮今鄐啤�鄐� 鄐亢鄍中鄍€鄐桌冗 {{minimum}} 鄐�鄍仄鄐啤�鄍� 鄐嫩�鄐兒�鄐芹什鄍�鄍�
password.must.match = 鄐戈云鄐擒�鄐仆鄍� 鄐芹冗鄐詮今鄐啤�鄐� 鄐嫩冗鄐耜�鄐兒�鄐嫩�鄐詮� 鄐� 鄐芹冗鄐詮今鄐啤�鄐� 鄐芹�鄐獅�鄐凶 鄐什鄍尹鄍允鄍元鄍� 鄐兒冗鄐桌� 鄐徇凶鄐耜�鄐﹤亢鄐� 鄐嫩冗鄐耜�鄐兒�鄐冢�鄐� 鄐芹冗鄐詮今鄐啤�鄐� 鄐�鄐� 鄐�鄐兒奶 鄐徇�鄐啤凶 鄐芹�鄐啤仁鄐擒元 鄐什鄍尹鄍允鄍元鄍奶
password.same = 鄐兒仁鄐擒� 鄐芹冗鄐詮今鄐啤�鄐� 鄐菽什鄍中鄐桌冗鄐� 鄐芹冗鄐詮今鄐啤�鄐� 鄐冢尹鄍丹鄐� 鄐徇什鄐� 鄐嫩�鄐兒�鄐芹什鄍�
password.update = 鄐云鄐﹤�鄐� 鄐芹冗鄐詮今鄐啤�鄐�
password.weak = 鄐能� 鄐芹冗鄐詮今鄐啤�鄐� 鄐亢鄐�鄐� 鄐奶
patient\ id\ not\ found\ response = 鄐眇凶鄐啤冗鄐桌凶鄐� 鄐�鄐﹤� 鄐兒云鄐擒�鄐亢鄐� 鄐芹�鄐擒�鄐兒� 鄐詮尹鄍丹鄍介
Expand Down Expand Up @@ -1272,6 +1280,7 @@ translation.add = 鄐兒仁鄐擒� 鄐尹鄍今鄐擒丹 鄐�鄐�鄐� 鄐丞云鄍�
translation.key = 鄐尹鄍今鄐擒丹 鄐�鄐�鄐�
unique.id = 鄐�鄐﹤�
unknown.contact = 鄐云鄐啤凶鄐凶鄐� 鄐詮亢鄍云鄐啤�鄐�
update.password.help = 鄐能� 鄐芹�鄐啤仁鄍�鄐什鄍中鄐擒仆鄍� 鄐什鄍�鄍� 鄐芹�鄐� 鄐耜�鄐尹 鄐什鄍丹鄐� 鄐井鄍尹鄍� 鄐芹冗鄐詮今鄐啤�鄐� 鄐芹�鄐�: 鄐詮�鄐� 鄐什鄍尹鄍云鄐啤�鄐兒�鄐奶
upgrade = 鄐云鄐�鄐啤�鄐�
upgrade.description = 鄐戈云鄐擒�鄐�鄍� 鄐云鄐耜冗鄐� 鄐�鄐兒� 鄐啤凶鄐耜�鄐�, 鄐眇�鄐冗, 鄐菽冗 鄐眇�鄐啤冗鄐兒�鄐亢鄐� 鄐云鄐�鄐啤�鄐� 鄐什鄍尹, 鄐芹允鄐賴仆鄍� 鄐什鄐��鄍� 鄐啤�鄐芹亢鄐� 鄐詮�鄐�鄐� 鄐什鄍尹 鄐詮凶鄐徇冗鄐啤凶鄐� 鄐什鄐賴尹鄍�鄍� 鄐能元鄐耜� 鄐芹�鄐啤仁鄍�鄐什鄍中鄐擒允鄐啤�鄐耜冗鄐� 鄐今鄐啤�鄐� 鄐兒�鄐啤� 鄐芹�鄐獅�鄐五鄍亢鄐賴亢鄐� 鄐尹鄍元鄍�鄐耜�鄐詮尹 鄐戈仁鄐擒什鄍€ 鄐什鄍�鄍� 鄐詮�鄐�鄐凶鄐� 鄐芹�鄐啤冗 鄐冢�鄐芹�鄐�, 鄐云鄐�鄐啤�鄐﹤�鄍� 鄐耜冗鄐凶 '鄐尹鄍元鄍�鄐� 鄐什鄍尹鄍允鄍元鄍�' 鄐�鄐耜凶鄐� 鄐什鄍尹鄍允鄍元鄍奶 鄐能� 鄐芹�鄐�, 鄐能元鄐耜冗鄐� 鄐芹允鄐賴仆鄐擒�鄍� 鄐今鄐詮�鄐丞冗鄐桌冗 鄐耜�鄐冗鄐� 鄐詮�鄐賴�鄐舟�鄐�, 鄐戈�鄐能元鄍仆鄍� 鄐�鄐芹仁鄐� 鄐戈云鄐擒�鄐�鄍� 鄐﹤�鄐冗 鄐眇�鄐能冗鄐�鄐� 鄐什鄐賴�鄐� 鄐� 鄐� 鄐戈云鄐擒�鄐�鄐� 鄐芹�鄐啤仁鄍�鄐什鄍中鄐擒允鄐啤�鄐耜冗鄐� 鄐詮�鄐菽冗 鄐今鄐啤�鄐舟�鄐� 鄐啤允鄐兒� 鄐眇冗鄐啤� 鄐冗鄐兒�鄐擒什鄍€ 鄐舟凶鄐�鄐� 鄐� 鄐冢尹鄍尹鄍� 鄐兒凶鄐嗣�鄐凶鄐� 鄐什鄍尹鄍允鄍元鄍奶
upload = 鄐云鄐耜�鄐�
Expand Down
11 changes: 10 additions & 1 deletion api/resources/translations/messages-sw.properties
Original file line number Diff line number Diff line change
Expand Up @@ -402,6 +402,11 @@ bulkdelete.confirm.title = Futa rekodi?
bulkdelete.confirm.title.plural = Ungependa kufuta rekodi ulizochagua?
call = Piga simu
case_id = Kitambulisho cha kesi
change.password.confirm.password = Thibitisha nenosiri
change.password.hint = Tumia herufi kubwa, nambari na herufi maalum.
change.password.new.password = Nenosiri mpya
change.password.submit = Badilisha nenosiri
change.password.title = Badilisha nenosiri lako
child_birth_date = Tarehe ya kuzaliwa mtoto
child_birth_outcome = Matokeo ya mtoto mzaliwa
child_birth_weight = Uzani wa mtoto mzaliwa
Expand Down Expand Up @@ -964,8 +969,11 @@ partner.logo.upload = Pakia nembo ya mshirika
partner.name.field = Jina la mshirika
partner.supporting = Washirika wanaounga mkono
partner.tab.partners = Washirika
password.current.incorrect = Nenosiri la sasa si sahihi
password.incorrect = Nenosiri si sahihi
password.length.minimum = Nenosiri inapaswa kuwa na wahusika {{minimum}} kwenda juu
password.must.match = Nenosiri na uthibitisho wa nenosiri lazima zilingane
password.same = Nenosiri mpya lazima liwe tofauti na nenosiri la sasa
password.update = Badilisha nenosiri
password.weak = Nywila ni rahisi sana nadhani. Jumuisha anuwai ya herufi ili kuifanya iwe ngumu zaidi.
patient\ id\ not\ found\ response = Tuma ujumbe wa majibu ufuatao kama validations zimepitishwa lakini ID ya mgonjwa haiko
Expand Down Expand Up @@ -1271,7 +1279,8 @@ training_materials.page.title = Vifaa vya mafunzo
translation.add = Ongeza tafsiri
translation.key = Ufunguo wa tafsiri
unique.id = Kitambulisho cha kipekee
unknown.contact = Mtu asiyejulikana
unknown.contact = Mtu asiyejulikana
update.password.help = Mtumiaji atahitajika kuweka upya nenosiri lake wakati wa kuingia ujayo
upgrade = Boresha
upgrade.description = Ili kupata toleo jipya la programu yako, inashauriwa uweke jukwaani kwanza. Hii inaruhusu kazi ya chinichini kufanywa ili kuandaa usakinishaji bila kukatiza watumiaji. Mara tu uwekaji jukwaa utakapokamilika, bofya Sakinisha ili kuendelea na uboreshaji. Kitendo hiki hakiwezi kutenduliwa, kwa hivyo tafadhali hakikisha kwamba data yako imechelezwa na watumiaji wako wanaarifiwa kuhusu muda wa hitilafu.
upload = Pakia
Expand Down
Loading
Loading